From: Uros Bizjak Date: Mon, 1 Oct 2012 15:00:41 +0000 (+0200) Subject: re PR rtl-optimization/54457 ([x32] Fail to combine 64bit index + constant) X-Git-Tag: misc/gccgo-go1_1_2~511 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=992103ad6991bfbd908d10b18b3fba28196ff7a8;p=thirdparty%2Fgcc.git re PR rtl-optimization/54457 ([x32] Fail to combine 64bit index + constant) PR rtl-optimization/54457 * simplify-rtx.c (simplify_subreg): Simplify (subreg:M (op:N ((x:N) (y:N)), 0) to (op:M (subreg:M (x:N) 0) (subreg:M (x:N) 0)), where the outer subreg is effectively a truncation to the original mode M. testsuite/ChangeLog: PR rtl-optimization/54457 * gcc.target/i386/pr54457.c: New test. From-SVN: r191928 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2684193ee19a..f543b7b8b62b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-10-01 Uros Bizjak + + PR rtl-optimization/54457 + * simplify-rtx.c (simplify_subreg): + Simplify (subreg:M (op:N ((x:N) (y:N)), 0) + to (op:M (subreg:M (x:N) 0) (subreg:M (x:N) 0)), where + the outer subreg is effectively a truncation to the original mode M. + 2012-10-01 Richard Guenther * builtins.def (ATTR_MATHFN_FPROUNDING): Do not use no-vops @@ -299,7 +307,8 @@ Undo r185605 (mostly): * config/avr/avr-protos.h (avr_load_lpm): Remove. - * config/avr/avr.c (avr_load_libgcc_p): Don't restrict to __flash loads. + * config/avr/avr.c (avr_load_libgcc_p): Don't restrict to __flash + loads. (avr_out_lpm): Also handle loads > 1 byte. (avr_load_lpm): Remove. (avr_find_unused_d_reg): New static function. @@ -367,8 +376,7 @@ PR target/54703 * simplify-rtx.c (simplify_binary_operation_1): Perform - (x - (x & y)) -> (x & ~y) optimization only for integral - modes. + (x - (x & y)) -> (x & ~y) optimization only for integral modes. 2012-09-27 Marc Glisse @@ -527,7 +535,7 @@ PR target/54641 * config/avr/t-avr: Use ALL_COMPILERFLAGS instead of ALL_CFLAGS for sources compiled with COMPILER. - + 2012-09-25 Richard Guenther PR lto/54625 @@ -541,8 +549,7 @@ one bit precision properly. PR other/54692 - * configure.ac (CFLAGS, CXXFLAGS): Remove -Ofast or -Og - properly. + * configure.ac (CFLAGS, CXXFLAGS): Remove -Ofast or -Og properly. * configure: Regenerated. 2012-09-25 Georg-Johann Lay @@ -564,8 +571,7 @@ 2012-09-24 Dehao Chen - * tree-cfg.c (move_stmt_op): Reset the expr block only - when necessary. + * tree-cfg.c (move_stmt_op): Reset the expr block only when necessary. (move_block_to_fn): Reset the edge's goto block even when the goto locus is unknown. @@ -672,7 +678,7 @@ 2012-09-24 Janis Johnson - doc/sourcebuild.texi (Selectors): Document the use of target + * doc/sourcebuild.texi (Selectors): Document the use of target and xfail used together. 2012-09-24 Richard Guenther diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index aebe6bbd93b9..c3e8a0a7e185 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -5724,6 +5724,28 @@ simplify_subreg (enum machine_mode outermode, rtx op, return CONST0_RTX (outermode); } + /* Simplify (subreg:SI (op:DI ((x:DI) (y:DI)), 0) + to (op:SI (subreg:SI (x:DI) 0) (subreg:SI (x:DI) 0)), where + the outer subreg is effectively a truncation to the original mode. */ + if ((GET_CODE (op) == PLUS + || GET_CODE (op) == MINUS + || GET_CODE (op) == MULT) + && SCALAR_INT_MODE_P (outermode) + && SCALAR_INT_MODE_P (innermode) + && GET_MODE_PRECISION (outermode) < GET_MODE_PRECISION (innermode) + && byte == subreg_lowpart_offset (outermode, innermode)) + { + rtx op0 = simplify_gen_subreg (outermode, XEXP (op, 0), + innermode, byte); + if (op0) + { + rtx op1 = simplify_gen_subreg (outermode, XEXP (op, 1), + innermode, byte); + if (op1) + return simplify_gen_binary (GET_CODE (op), outermode, op0, op1); + } + } + /* Simplify (subreg:QI (lshiftrt:SI (sign_extend:SI (x:QI)) C), 0) into to (ashiftrt:QI (x:QI) C), where C is a suitable small constant and the outer subreg is effectively a truncation to the original mode. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0cd11760edd3..89d7eeb341d9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-10-01 Uros Bizjak + + PR rtl-optimization/54457 + * gcc.target/i386/pr54457.c: New test. + 2012-10-01 Ulrich Weigand * gcc.dg/lower-subreg-1.c: Disable on arm*-*-* targets. diff --git a/gcc/testsuite/gcc.target/i386/pr54457.c b/gcc/testsuite/gcc.target/i386/pr54457.c new file mode 100644 index 000000000000..d27f899fd5a7 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr54457.c @@ -0,0 +1,11 @@ +/* { dg-do compile { target { ! { ia32 } } } } */ +/* { dg-options "-O2 -mx32 -maddress-mode=short" } */ + +extern char array[40]; + +char foo (long long position) +{ + return array[position + 1]; +} + +/* { dg-final { scan-assembler-not "add\[lq\]?\[^\n\]*1" } } */