On 9 October 2015 at 18:11, James Greenhalgh <james.greenha...@arm.com> wrote: > On Thu, Oct 08, 2015 at 01:29:34PM +0100, Richard Biener wrote: >> > Thanks again for the comments Richard! >> > >> > A new algorithmic optimisation: >> > >> > ((X inner_op C0) outer_op C1) >> > With X being a tree where value_range has reasoned certain bits to always >> > be >> > zero throughout its computed value range, we will call this the zero_mask, >> > and with inner_op = {|,^}, outer_op = {|,^} and inner_op != outer_op. >> > if (inner_op == '^') C0 &= ~C1; >> > if ((C0 & ~zero_mask) == 0) then emit (X outer_op (C0 outer_op C1) >> > if ((C1 & ~zero_mask) == 0) then emit (X inner_op (C0 outer_op C1) >> > >> > And extended '(X & C2) << C1 into (X << C1) & (C2 << C1)' and >> > '(X & C2) >> C1 into (X >> C1) & (C2 >> C1)' to also accept the bitwise or >> > and xor operators: >> > '(X {&,^,|} C2) << C1 into (X << C1) {&,^,|} (C2 << C1)' and >> > '(X {&,^,|} C2) >> C1 into (X >> C1) & (C2 >> C1)'. >> > >> > The second transformation enables more applications of the first. Also some >> > targets may benefit from delaying shift operations. I am aware that such an >> > optimization, in combination with one or more optimizations that cause the >> > reverse transformation, may lead to an infinite loop. Though such behavior >> > has not been detected during regression testing and bootstrapping on >> > aarch64. >> > >> > gcc/ChangeLog: >> > >> > 2015-10-05 Andre Vieira <andre.simoesdiasvie...@arm.com> >> > >> > * match.pd: Added a new pattern >> > ((X inner_op C0) outer_op C1) >> > and expanded existing one >> > (X {|,^,&} C0) {<<,>>} C1 -> (X {<<,>>} C1) {|,^,&} (C0 {<<,>>} C1) >> > >> > gcc/testsuite/ChangeLog: >> > >> > 2015-10-05 Andre Vieira <andre.simoesdiasvie...@arm.com> >> > >> > Hale Wang <hale.w...@arm.com> >> > >> > * gcc.dg/tree-ssa/forwprop-33.c: New test. >> >> Ok. >> >> Thanks, >> Richard. >> > > As Andre does not have commit rights, I've committed this on his behalf as > revision 228661. Please watch for any fallout over the weekend. >
Since this commit I'm seeing: FAIL: gcc.target/arm/xor-and.c scan-assembler orr on most arm targets. See: http://people.linaro.org/~christophe.lyon/cross-validation/gcc/trunk/228661/report-build-info.html Since that's already a few days old, I suspect you are already aware of that? Christophe. > Andre, please check your ChangeLog format in future. In the end I > committed this: > > gcc/ChangeLog > > 2015-10-09 Andre Vieira <andre.simoesdiasvie...@arm.com> > > * match.pd: ((X inner_op C0) outer_op C1) New pattern. > ((X & C2) << C1): Expand to... > (X {&,^,|} C2 << C1): ...This. > ((X & C2) >> C1): Expand to... > (X {&,^,|} C2 >> C1): ...This. > > gcc/testsuite/ChangeLog > > 2015-10-09 Andre Vieira <andre.simoesdiasvie...@arm.com> > Hale Wang <hale.w...@arm.com> > > * gcc.dg/tree-ssa/forwprop-33.c: New. > > Thanks, > James >