Hello,

This patch fixes PR tree-optimization/95176. A new pattern in match.pd was 
added to transform "a * (b / a)" --> "b - (b % a)". A new test case was also 
added to cover this scenario.

The new pattern interfered with the existing pattern of "X - (X / Y) * Y". In 
some cases (such as in fn4() in gcc/testsuite/gcc.dg/fold-minus-6.c), the new 
pattern is applied causing the existing pattern to no longer apply. This 
results in worse code generation because the expression is left as "X - (X - 
Y)". An additional subtraction pattern of "X - (X - Y) --> Y" was added to this 
patch to avoid this regression.

I also didn't remove the existing pattern because it triggered in more cases 
than the new pattern because of a tree_invariant_p check that's inserted by 
genmatch for the new pattern.

I verified that all "make -k check" tests pass when targeting 
x86_64-pc-linux-gnu.

2021-03-31  Victor Tong  <vit...@microsoft.com> 

gcc/ChangeLog:

        * match.pd: Two new patterns: One to optimize division followed by 
multiply and the other to avoid a regression as explained above

gcc/testsuite/ChangeLog:

        * gcc.dg/tree-ssa/20030807-10.c: Update existing test to look for a 
subtraction because a shift is no longer emitted
        * gcc.dg/pr95176.c: New test to cover optimizing division followed by 
multiply

I don't have write access to the GCC repo but I've completed the FSF paperwork 
as I plan to make more contributions in the future. I'm looking for a 
sponsorship from an existing GCC maintainer before applying for write access.

Thanks,
Victor

Attachment: pr95176.patch
Description: pr95176.patch

Reply via email to