https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91758
Martin Liška <marxin at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #5 from Martin Liška <marxin at gcc dot gnu.org> --- Ok, so without changed source file I see optimized dump changed from: D.1259546.PaddingInReg = SR.6329_147; D.1259546.IndirectByVal = SR.6330_121; D.1259546.IndirectRealign = SR.6331_117; D.1259546.SRetAfterThis = SR.6332_29; D.1259546.InReg = SR.6333_124; D.1259546.CanBeFlattened = SR.6334_129; MEM[base: __for_begin_145, offset: 8B] = MEM[(struct ABIArgInfo *)&D.1259546]; into: _139 = (unsigned char) SR.6329_147; _49 = (unsigned char) SR.6330_121; _137 = _49 << 2; _34 = _137 | _139; _382 = (unsigned char) SR.6331_117; _381 = _382 << 3; _357 = _381 | _34; _380 = (unsigned char) SR.6332_29; _377 = _380 << 4; _376 = _377 | _357; _375 = (unsigned char) SR.6333_124; _397 = _375 << 5; _401 = _397 | _376; _181 = (unsigned char) SR.6334_129; _364 = _181 << 6; _118 = _364 | _401; _131 = MEM[(struct ABIArgInfo *)&D.1259546 + 21B]; _363 = _131 & 130; _366 = _118 & 125; _69 = _363 | _366; MEM[(struct ABIArgInfo *)&D.1259546 + 21B] = _69; MEM[base: __for_begin_145, offset: 8B] = MEM[(struct ABIArgInfo *)&D.1259546]; which eventually ends up with something like: addq $32, %rbx #, ivtmp.6357 movzbl 43(%rsp), %ecx # %sfp, SR.6331 movq 24(%rsp), %xmm0 # %sfp, tmp336 movl %r15d, -8(%rbx) # SR.6327, MEM[base: __for_begin_145, offset: 8B] leal 0(,%rdi,4), %edx #, tmp337 # /tmp/llvm-project/clang/lib/CodeGen/TargetInfo.cpp:7572: __builtin_printf ("after: I.info: %d\n", I.info.getInReg ()); leaq .LC156(%rip), %rdi #, # /tmp/llvm-project/clang/lib/CodeGen/TargetInfo.cpp:7571: I.info = classifyArgumentType(I.type, State); movl %r15d, 80(%rsp) # SR.6327, MEM[(struct ABIArgInfo *)&D.1259546 + 16B] sall $3, %ecx #, tmp339 orl %r14d, %edx # SR.6329, tmp338 movhps 8(%rsp), %xmm0 # %sfp, tmp336 orl %ecx, %edx # tmp339, tmp340 movzbl 42(%rsp), %ecx # %sfp, tmp341 movups %xmm0, -24(%rbx) # tmp336, MEM[base: __for_begin_145, offset: 8B] movaps %xmm0, 64(%rsp) # tmp336, MEM[(struct ABIArgInfo *)&D.1259546] sall $4, %ecx #, tmp341 orl %ecx, %edx # tmp341, tmp342 orl %eax, %edx # tmp343, tmp344 movl %ebp, %eax # SR.6334, tmp345 sall $6, %eax #, tmp345 orl %eax, %edx # tmp345, tmp346 movzbl 85(%rsp), %eax # MEM[(struct ABIArgInfo *)&D.1259546 + 21B], tmp348 andl $125, %edx #, tmp347 andl $-126, %eax #, tmp348 orl %eax, %edx # tmp348, tmp350 # /tmp/llvm-project/clang/lib/CodeGen/TargetInfo.cpp:7572: __builtin_printf ("after: I.info: %d\n", I.info.getInReg ()); xorl %eax, %eax # # /tmp/llvm-project/clang/lib/CodeGen/TargetInfo.cpp:7571: I.info = classifyArgumentType(I.type, State); movb %dl, 85(%rsp) # tmp350, MEM[(struct ABIArgInfo *)&D.1259546 + 21B] and the problem is that we load: 0x2776490 <(anonymous namespace)::LanaiABIInfo::computeInfo(clang::CodeGen::CGFunctionInfo&) const+400> movzbl 0x2b(%rsp),%ecx with the following value: (gdb) p /t $ecx $1 = 11110111 and then we or (11110111 << 3) into %edx and so that we end up with the 6th bit set. That is the InReg field. Looking at the corresponding ASM code without the store-merging, there are quite some andl $1, %esi #, tmp329 ... andl $1, %ecx #, tmp347 and so on. @Eric, @Jakub, @Richard: Aren't we missing something similar with the store merging of bool:1 bit fields? I can see the cast to 'unsigned char' from 'bool' in GIMPLE. Both should be 1B and so that we maybe encorporate random bits?