Message ID | 20151223084922.GS18720@tucnak.redhat.com |
---|---|
State | New |
Headers | show |
> This patch just disables that transformation, IMHO trading conditional > return + unconditional trap with conditional trap + unconditional return > isn't worth it. > > Martin Sebor has kindly bootstrapped/regtested this on powerpc64le-linux, > ok for trunk? > > 2015-12-23 Jakub Jelinek <jakub@redhat.com> > > PR target/69015 > * ifcvt.c (find_cond_trap): Give up if returnjump_p (jump). > > * gcc.dg/pr69015.c: New test. OK, thanks.
--- gcc/ifcvt.c.jj 2015-12-10 17:01:06.000000000 +0100 +++ gcc/ifcvt.c 2015-12-22 19:43:07.404639873 +0100 @@ -4526,8 +4526,11 @@ find_cond_trap (basic_block test_bb, edg return FALSE; /* If the conditional jump is more than just a conditional jump, then - we can not do if-conversion on this block. */ - if (! onlyjump_p (jump)) + we can not do if-conversion on this block. Give up for returnjump_p, + changing a conditional return followed by unconditional trap for + conditional trap followed by unconditional return is likely not + beneficial and harder to handle. */ + if (! onlyjump_p (jump) || returnjump_p (jump)) return FALSE; /* We must be comparing objects whose modes imply the size. */ --- gcc/testsuite/gcc.dg/pr69015.c.jj 2015-12-22 19:52:32.457756578 +0100 +++ gcc/testsuite/gcc.dg/pr69015.c 2015-12-22 19:53:39.544820625 +0100 @@ -0,0 +1,10 @@ +/* PR target/69015 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-if-conversion" } */ + +void +foo (int c) +{ + if (c) + __builtin_trap (); +}