This patch (suggested by Steven B) removes some redundant loop assertions that are currently being missed, resulting in redundant branches appearing prior to many loops on powerpc64. Bootstrapped and tested with no new regressions on powerpc64-unknown-linux-gnu. Ok for trunk?
Thanks, Bill gcc: 2013-03-13 Bill Schmidt <wschm...@linux.vnet.ibm.com> Steven Bosscher <ste...@gcc.gnu.org> PR rtl-optimization/56605 * loop-iv.c (implies_p): Handle equal RTXs and subregs. gcc/testsuite: 2013-03-13 Bill Schmidt wschm...@linux.vnet.ibm.com> PR rtl-optimization/56605 * gcc.target/powerpc/pr56605.c: New. Index: gcc/testsuite/gcc.target/powerpc/pr56605.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/pr56605.c (revision 0) +++ gcc/testsuite/gcc.target/powerpc/pr56605.c (revision 0) @@ -0,0 +1,13 @@ +/* PR rtl-optimization/56605 */ +/* { dg-do compile { target { powerpc64-*-* && lp64 } } } */ +/* { dg-options "-O3 -mvsx -mcpu=power7 -fno-unroll-loops -fdump-rtl-loop2_doloop" } */ + +void foo (short* __restrict sb, int* __restrict ia) +{ + int i; + for (i = 0; i < 4000; i++) + ia[i] = (int) sb[i]; +} + +/* { dg-final { scan-rtl-dump-times "\\\(compare:CC \\\(subreg:SI \\\(reg:DI" 1 "loop2_doloop" } } */ +/* { dg-final { cleanup-rtl-dump "loop2_doloop" } } */ Index: gcc/loop-iv.c =================================================================== --- gcc/loop-iv.c (revision 196633) +++ gcc/loop-iv.c (working copy) @@ -1496,19 +1496,26 @@ implies_p (rtx a, rtx b) rtx op0, op1, opb0, opb1, r; enum machine_mode mode; + if (rtx_equal_p (a, b)) + return true; + if (GET_CODE (a) == EQ) { op0 = XEXP (a, 0); op1 = XEXP (a, 1); - if (REG_P (op0)) + if (REG_P (op0) + || (GET_CODE (op0) == SUBREG + && REG_P (SUBREG_REG (op0)))) { r = simplify_replace_rtx (b, op0, op1); if (r == const_true_rtx) return true; } - if (REG_P (op1)) + if (REG_P (op1) + || (GET_CODE (op1) == SUBREG + && REG_P (SUBREG_REG (op1)))) { r = simplify_replace_rtx (b, op1, op0); if (r == const_true_rtx)