------- Comment #1 from tkoenig at gcc dot gnu dot org 2007-09-08 11:32 ------- An equivalent C testcase eliminates the array stores:
int foo(int *a,int *b,int *c,int *d) { int val[3]; val[0] = *a; val[1] = *b; val[2] = *c; return (val[0] != *d) && (val[1] != *d) && (val[2] != *d); } $ gcc -O3 -fdump-tree-optimized -S compare.c $ cat compare.c.116t.optimized ;; Function foo (foo) Analyzing Edge Insertions. Opportunities in BB 5 for stmt/block reduction: Splitting BB 5 for Common stmt list. Original block is now BB6. D.1138 = 0; Edge (2->5) lands here. Edge (3->5) lands here. foo (a, b, c, d) { int D.1143; int D.1138; int D.1137; int D.1136; <bb 2>: D.1136 = *b; D.1137 = *c; D.1143 = *d; if (*a == D.1143) goto <bb 5>; else goto <bb 3>; <bb 3>: if (D.1136 == D.1143) goto <bb 5>; else goto <bb 4>; <bb 4>: (void) 0; D.1138 = (int) !(D.1137 == D.1143); goto <bb 6>; <bb 5>: D.1138 = 0; <bb 6>: return D.1138; } $ gcc -O3 -fdump-tree-optimized -S compare.c $ cat compare.c.116t.optimized ;; Function foo (foo) Analyzing Edge Insertions. Opportunities in BB 5 for stmt/block reduction: Splitting BB 5 for Common stmt list. Original block is now BB6. D.1138 = 0; Edge (2->5) lands here. Edge (3->5) lands here. foo (a, b, c, d) { int D.1143; int D.1138; int D.1137; int D.1136; <bb 2>: D.1136 = *b; D.1137 = *c; D.1143 = *d; if (*a == D.1143) goto <bb 5>; else goto <bb 3>; <bb 3>: if (D.1136 == D.1143) goto <bb 5>; else goto <bb 4>; <bb 4>: (void) 0; D.1138 = (int) !(D.1137 == D.1143); goto <bb 6>; <bb 5>: D.1138 = 0; <bb 6>: return D.1138; } -- tkoenig at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Known to fail| |4.3.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33341