[Bug tree-optimization/88842] missing optimization CSE, reassociation
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88842 Andrew Pinski changed: What|Removed |Added Severity|normal |enhancement
[Bug tree-optimization/88842] missing optimization CSE, reassociation
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88842 luoxhu at gcc dot gnu.org changed: What|Removed |Added CC||luoxhu at gcc dot gnu.org --- Comment #3 from luoxhu at gcc dot gnu.org --- One more case of missed optimization CSE, reassoc: void foo(unsigned int a, unsigned int b, unsigned int c, unsigned int d, int *res1, int*res2, int *res3) { *res1 = a + b + c + d; *res2 = b + c; *res3 = a + d; } cat foo.s .file "foo.c" .machine power8 .abiversion 2 .section".text" .align 2 .p2align 4,,15 .globl foo .type foo, @function foo: .LFB0: .cfi_startproc add 10,5,6 add 10,10,4 add 4,4,5 add 10,10,3 add 3,3,6 stw 10,0(7) stw 4,0(8) stw 3,0(9) blr
[Bug tree-optimization/88842] missing optimization CSE, reassociation
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88842 Richard Biener changed: What|Removed |Added Keywords||missed-optimization Status|UNCONFIRMED |NEW Last reconfirmed||2019-01-15 Component|other |tree-optimization Ever confirmed|0 |1 --- Comment #2 from Richard Biener --- void foo(int a, int b, int c, int d, int e, int *res) { res[0] = (e * a) * d; res[1] = (e * b) * d; res[2] = (e * c) * d; } associating (e * d) allows CSE. Only possible when there's no overflow (-fwrapv or unsigned types). The issue is that reassoc is a "local" optimization, associating single chains rather than looking at multiple chains at once. And of course reassoc isn't "integrated" with CSE.