static const int e[4] = { 16, 16, 20, 20 }; extern void foo (unsigned long *);
void baz (unsigned long *r) { unsigned long i; for (i = 0; i < 4; i++) if (e[i] == 16) break; if (i == 4) { foo (r); } } We have the following in the .vars tree dump: ;; Function baz (baz) baz (r) { long unsigned int i; <bb 0>: i = 0; <L0>:; if (MEM[symbol: e, index: (int *) i, step: 4B] == 16) goto <L5>; else goto <L1>; <L1>:; i = i + 1; if (i != 4) goto <L0>; else goto <L3>; <L3>:; if (i == 4) goto <L4>; else goto <L5>; <L4>:; foo (r); <L5>:; return; } The first jump pass on RTL immediately optimizes away the redundant jump. This kind of jump threading opportunity occurs very often. About half of the jump threadings on RTL in jump1 that I have looked at so far (several dozen) are of this form. I'm seeing this for AMD64 and i686, but I guess it happens everywhere. -- Summary: Jump threading opportunity missed in tree-ssa but caught in jump1 Product: gcc Version: unknown Status: UNCONFIRMED Keywords: missed-optimization, TREE Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: steven at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25243