https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113576
--- Comment #37 from Hongtao Liu <liuhongt at gcc dot gnu.org> --- (In reply to Richard Biener from comment #36) > For example with AVX512VL and the following, using -O -fgimple -mavx512vl > we get simply > > notl %esi > orl %esi, %edi > cmpb $15, %dil > je .L6 > > typedef long v4si __attribute__((vector_size(4*sizeof(long)))); > typedef v4si v4sib __attribute__((vector_mask)); > typedef _Bool sbool1 __attribute__((signed_bool_precision(1))); > > void __GIMPLE (ssa) foo (v4sib v1, v4sib v2) > { > v4sib tem; > > __BB(2): > tem_5 = ~v2_2(D); > tem_3 = v1_1(D) | tem_5; > tem_4 = _Literal (v4sib) { _Literal (sbool1) -1, _Literal (sbool1) -1, > _Literal (sbool1) -1, _Literal (sbool1) -1 }; > if (tem_3 == tem_4) > goto __BB3; > else > goto __BB4; > > __BB(3): > __builtin_abort (); > > __BB(4): > return; > } > > > the question is whether that matches the semantics of GIMPLE (the padding > is inverted, too), whether it invokes undefined behavior (don't do it - it > seems for people using intrinsics that's what it is?) or whether we > should avoid affecting padding. > > Note after the patch I proposed on the mailing list the constant mask is > now expanded with zero padding. I think we should also mask off the upper bits of variable mask? notl %esi orl %esi, %edi notl %edi andl $15, %edi je .L3