From: Jakub Jelinek Date: Tue, 4 Feb 2014 12:14:52 +0000 (+0100) Subject: re PR rtl-optimization/57915 (ICE in set_address_disp, at rtlanal.c:5537) X-Git-Tag: releases/gcc-4.9.0~1113 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=be3afd67464ec5430d72971991e9cbbaa7cd4370;p=thirdparty%2Fgcc.git re PR rtl-optimization/57915 (ICE in set_address_disp, at rtlanal.c:5537) PR rtl-optimization/57915 * recog.c (simplify_while_replacing): If all unary/binary/relational operation arguments are constant, attempt to simplify those. * gcc.target/i386/pr57915.c: New test. From-SVN: r207460 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5487d5c3246c..41fc97792a67 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2014-02-04 Jakub Jelinek + PR rtl-optimization/57915 + * recog.c (simplify_while_replacing): If all unary/binary/relational + operation arguments are constant, attempt to simplify those. + PR middle-end/59261 * expmed.c (expand_mult): For MODE_VECTOR_INT multiplication if there is no vashl3 or ashl3 insn, skip_synth. diff --git a/gcc/recog.c b/gcc/recog.c index e2caf9859d83..f9040dcde759 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -565,7 +565,7 @@ simplify_while_replacing (rtx *loc, rtx to, rtx object, { rtx x = *loc; enum rtx_code code = GET_CODE (x); - rtx new_rtx; + rtx new_rtx = NULL_RTX; if (SWAPPABLE_OPERANDS_P (x) && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1))) @@ -579,6 +579,35 @@ simplify_while_replacing (rtx *loc, rtx to, rtx object, code = GET_CODE (x); } + /* Canonicalize arithmetics with all constant operands. */ + switch (GET_RTX_CLASS (code)) + { + case RTX_UNARY: + if (CONSTANT_P (XEXP (x, 0))) + new_rtx = simplify_unary_operation (code, GET_MODE (x), XEXP (x, 0), + op0_mode); + break; + case RTX_COMM_ARITH: + case RTX_BIN_ARITH: + if (CONSTANT_P (XEXP (x, 0)) && CONSTANT_P (XEXP (x, 1))) + new_rtx = simplify_binary_operation (code, GET_MODE (x), XEXP (x, 0), + XEXP (x, 1)); + break; + case RTX_COMPARE: + case RTX_COMM_COMPARE: + if (CONSTANT_P (XEXP (x, 0)) && CONSTANT_P (XEXP (x, 1))) + new_rtx = simplify_relational_operation (code, GET_MODE (x), op0_mode, + XEXP (x, 0), XEXP (x, 1)); + break; + default: + break; + } + if (new_rtx) + { + validate_change (object, loc, new_rtx, 1); + return; + } + switch (code) { case PLUS: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5ba47ab8648d..31e271dc34f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-04 Jakub Jelinek + + PR rtl-optimization/57915 + * gcc.target/i386/pr57915.c: New test. + 2014-02-04 Rainer Orth * g++.dg/init/dso_handle2.C: Compile with -fuse-cxa-atexit. diff --git a/gcc/testsuite/gcc.target/i386/pr57915.c b/gcc/testsuite/gcc.target/i386/pr57915.c new file mode 100644 index 000000000000..0b143e0cc4bc --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr57915.c @@ -0,0 +1,33 @@ +/* PR rtl-optimization/57915 */ +/* { dg-do compile } */ +/* { dg-options "-Os" } */ + +extern struct T { char a[8]; char b[16]; } t; +int c; +void foo (void); + +extern inline char * +baz (char *x, const char *y) +{ + const char *e = y; + unsigned long f, g; + asm ("" : "+c" (f), "+D" (e) : "a" ('\0'), "X" (*e)); + g = e - 1 - y; + __builtin_memcpy (x, y, g); + x[g] = '\0'; + return x; +} + +void +bar (void) +{ + char d[16]; + baz (d, t.b); + + for (;;) + { + foo (); + if (c) + baz (d, t.b); + } +}