diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-11-05 20:37:51 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-11-05 20:37:51 +0100 |
commit | 50fae5a679990a4bba7dc30de21e6d4132d778fb (patch) | |
tree | e79a1de24f6746538c44940eded0a9ed35e3a3b1 /gcc/loop-iv.c | |
parent | 2a0603f1899262a11e21aba32da9a94d6f1129c3 (diff) | |
download | gcc-50fae5a679990a4bba7dc30de21e6d4132d778fb.zip gcc-50fae5a679990a4bba7dc30de21e6d4132d778fb.tar.gz gcc-50fae5a679990a4bba7dc30de21e6d4132d778fb.tar.bz2 |
re PR rtl-optimization/58997 (ICE on valid code at -O3 on x86_64-linux-gnu (affecting gcc trunk and 4.8.2))
PR rtl-optimization/58997
* loop-iv.c (iv_subreg): For IV_UNKNOWN_EXTEND, expect
get_iv_value to be in iv->mode rather than iv->extend_mode.
(iv_extend): Likewise. Otherwise, if iv->extend != extend,
use lowpart_subreg on get_iv_value before calling simplify_gen_unary.
* loop-unswitch.c (may_unswitch_on): Make sure op[i] is in the right
mode.
* gcc.c-torture/compile/pr58997.c: New test.
From-SVN: r204413
Diffstat (limited to 'gcc/loop-iv.c')
-rw-r--r-- | gcc/loop-iv.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c index b9bc3348..97aa52f 100644 --- a/gcc/loop-iv.c +++ b/gcc/loop-iv.c @@ -436,7 +436,9 @@ iv_subreg (struct rtx_iv *iv, enum machine_mode mode) && !iv->first_special) { rtx val = get_iv_value (iv, const0_rtx); - val = lowpart_subreg (mode, val, iv->extend_mode); + val = lowpart_subreg (mode, val, + iv->extend == IV_UNKNOWN_EXTEND + ? iv->mode : iv->extend_mode); iv->base = val; iv->extend = IV_UNKNOWN_EXTEND; @@ -476,8 +478,14 @@ iv_extend (struct rtx_iv *iv, enum iv_extend_code extend, enum machine_mode mode && !iv->first_special) { rtx val = get_iv_value (iv, const0_rtx); + if (iv->extend_mode != iv->mode + && iv->extend != IV_UNKNOWN_EXTEND + && iv->extend != extend) + val = lowpart_subreg (iv->mode, val, iv->extend_mode); val = simplify_gen_unary (iv_extend_to_rtx_code (extend), mode, - val, iv->extend_mode); + val, + iv->extend == extend + ? iv->extend_mode : iv->mode); iv->base = val; iv->extend = IV_UNKNOWN_EXTEND; iv->mode = iv->extend_mode = mode; |