On AMD64 the following piece of code still triggers one jump threading opportunity in the RTL threader that we miss it in the tree threader on the tree-cleanup-branch: ===================================================== extern int x; extern int y; void foo (void) { if ((x & 0x00000001) || (x & 0x00004000)) y = 0; if ((x & 0x00000001) || (x & 0x00004000)) y = 1; if ((x & 0x00000001) || (x & 0x00004000)) y = 2; if ((x & 0x00000001) || (x & 0x00004000)) y = 3; if ((x & 0x00000001) || (x & 0x00004000)) y = 4; } ===================================================== This test case was reduced from insn-opinit.c where we're still threading 405 jumps, most of them of the kind shown in the test case, with the RTL threader. We do catch this on mainline. The assembly for the tree-cleanup-branch is worse than mainline: MAINLINE: -O2 TCB: -O2 .file "t.c" .file "t.c" .text .text .p2align 4,,15 .p2align 4,,15 .globl foo .globl foo .type foo, @function .type foo, @function foo: foo: .LFB2: .LFB2: movl x(%rip), %eax movl x(%rip), %eax movl %eax, %edx movl %eax, %edx andl $1, %edx andl $1, %edx jne .L2 jne .L2 testb $64, %ah testb $64, %ah je .L19 | je .L4 .L2: .L2: testb %dl, %dl testb %dl, %dl movl $0, y(%rip) movl $0, y(%rip) je .L23 | jne .L5 > testb $64, %ah > je .L4 > .L5: testb %dl, %dl testb %dl, %dl movl $1, y(%rip) movl $1, y(%rip) je .L24 | je .L4 .L10: < testb %dl, %dl testb %dl, %dl movl $2, y(%rip) movl $2, y(%rip) je .L25 | je .L16 .L14: | .L9: testb %dl, %dl testb %dl, %dl movl $3, y(%rip) movl $3, y(%rip) je .L26 | je .L17 .L17: | .L12: movl $4, y(%rip) movl $4, y(%rip) .L19: | .L14: rep ; ret rep ; ret .p2align 4,,7 .p2align 4,,7 .L23: | .L4: testb $64, %ah testb $64, %ah je .L19 | je .L14 testb %dl, %dl < movl $1, y(%rip) < jne .L10 < .L24: < testb $64, %ah < je .L19 < testb %dl, %dl testb %dl, %dl movl $2, y(%rip) movl $2, y(%rip) jne .L14 | jne .L9 .L25: | jmp .L16 > .p2align 4,,7 > .L17: testb $64, %ah testb $64, %ah je .L19 | .p2align 4,,2 > je .L14 > movl $4, y(%rip) > .p2align 4,,4 > jmp .L14 > .p2align 4,,7 > .L16: > testb $64, %ah > .p2align 4,,2 > je .L14 testb %dl, %dl testb %dl, %dl movl $3, y(%rip) movl $3, y(%rip) jne .L17 | jne .L12 .L26: < testb $64, %ah < jne .L17 < .p2align 4,,2 .p2align 4,,2 ret | jmp .L17 .LFE2: .LFE2: .size foo, .-foo .size foo, .-foo This could come from no longer iterating DOM, I guess??
-- Summary: Missed jump threading optimization Product: gcc Version: unknown Status: UNCONFIRMED Keywords: missed-optimization, TREE Severity: enhancement Priority: P2 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: steven at gcc dot gnu dot org CC: dnovillo at redhat dot com,gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18076