[Resending, since I was away and not pinging it]

Hi all,

In PR58088 the constant folder goes into an infinite recursion and runs out of
stack space because of two conflicting optimisations:
(X * C1) & C2 plays dirty when nested inside an IOR expression like so: ((X *
C1) & C2) | C4. One can undo the other leading to an infinite recursion.

Thanks to Marek for finding the IOR case.

This patch fixes that by checking in the IOR case that the change to C2 will
not conflict with the AND case transformation. Example testcases in the PR on
bugzilla.

This affects both trunk and 4.8 and regresses and bootstraps cleanly on both.

Bootstrapped on x86_64-linux-gnu and tested arm-none-eabi on qemu.

Ok for trunk and 4.8?

Thanks,
Kyrill

2013-09-09  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>

        PR tree-optimization/58088
        * fold-const.c (mask_with_trailing_zeros): New function.
        (fold_binary_loc): Make sure we don't recurse infinitely
        when the X in (X & C1) | C2 is a tree of the form (Y * K1) & K2.
        Use mask_with_trailing_zeros where appropriate.
        
        
2013-09-09  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>

        PR tree-optimization/58088
        * gcc.c-torture/compile/pr58088.c: New test.

Attachment: pr58088.patch
Description: Binary data

Reply via email to