[Bug tree-optimization/68786] New: Aligned masked store is generated for unaligned pointer
ienkovich at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Dec 8 09:24:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68786
Bug ID: 68786
Summary: Aligned masked store is generated for unaligned
pointer
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: ienkovich at gcc dot gnu.org
Target Milestone: ---
Here is a testcase:
double *a;
int b;
void
test (void)
{
for (; b; b++)
if (b < 7)
a[b] = 1.0;
}
Produced assembler for that loop when compiled for AVX-512:
>gcc -O2 -ftree-vectorize -march=skylake-avx512 small.i -S
.L4:
vpcmpd $2, %zmm2, %zmm0, %k1
addl $1, %r8d
vpaddd %zmm3, %zmm0, %zmm0
vmovupd %zmm1, (%rsi){%k1}
kshiftrw $8, %k1, %k1
vmovapd %zmm1, 64(%rsi){%k1}
subq $-128, %rsi
cmpl %edx, %r8d
jb .L4
We have two store using the same base. One of them is unaligned and another
one is aligned.
The difference comes from GIMPLE. Here is a vectorized loop:
<bb 6>:
# vect_vec_iv_.11_71 = PHI <vect_cst__69(5), vect_vec_iv_.11_72(6)>
# ivtmp.26_87 = PHI <0(5), ivtmp.26_6(6)>
# ivtmp.28_7 = PHI <ivtmp.28_24(5), ivtmp.28_8(6)>
vectp.15_82 = (vector(8) double *) ivtmp.28_7;
vect_vec_iv_.11_72 = vect_vec_iv_.11_71 + { 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16 };
mask__24.12_74 = vect_vec_iv_.11_71 <= { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6 };
mask_patt_28.14_76 = [vec_unpack_lo_expr] mask__24.12_74;
mask_patt_28.14_77 = [vec_unpack_hi_expr] mask__24.12_74;
MASK_STORE (vectp.15_82, 0B, mask_patt_28.14_76, { 1.0e+0, 1.0e+0, 1.0e+0,
1.0e+0, 1.0e+0, 1.0e+0, 1.0e+0, 1.0e+0 });
_25 = ivtmp.28_7 + 64;
_88 = (vector(8) double *) _25;
MASK_STORE (_88, 0B, mask_patt_28.14_77, { 1.0e+0, 1.0e+0, 1.0e+0, 1.0e+0,
1.0e+0, 1.0e+0, 1.0e+0, 1.0e+0 });
ivtmp.26_6 = ivtmp.26_87 + 1;
ivtmp.28_8 = ivtmp.28_7 + 128;
if (ivtmp.26_6 < bnd.8_31)
goto <bb 6>;
Pointers used for masked stores have different SSA_NAME_PTR_INFO
For vectp.15_82 we have
{pt = {anything = 0, nonlocal = 1, escaped = 1, ipa_escaped = 0, null = 0,
vars_contains_nonlocal = 0, vars_contains_escaped = 0,
vars_contains_escaped_heap = 0, vars = 0x7ffff7c13160}, align = 8, misalign =
0}
For _88 we have
{pt = {anything = 0, nonlocal = 1, escaped = 1, ipa_escaped = 0, null = 0,
vars_contains_nonlocal = 0, vars_contains_escaped = 0,
vars_contains_escaped_heap = 0, vars = 0x7ffff7c13160}, align = 0, misalign =
0}
Zero alignment here for _88 causes TYPE_ALIGN to be used for the second
MASK_STORE. TYPE_ALIGN for vector types is its size and therefore we get
incorrect aligned memory access.
More information about the Gcc-bugs
mailing list