diff options
author | Jakub Jelinek <jakub@redhat.com> | 2015-01-08 20:15:53 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2015-01-08 20:15:53 +0100 |
commit | efa7df3c625146460d7ec345d32a4efb42be871b (patch) | |
tree | bd442b28e990d27a0b5a6ca8e0848994e3eff3f2 /gcc/config | |
parent | de35aa66b07a62a1c27f4b104577848fa8f7ec17 (diff) | |
download | gcc-efa7df3c625146460d7ec345d32a4efb42be871b.zip gcc-efa7df3c625146460d7ec345d32a4efb42be871b.tar.gz gcc-efa7df3c625146460d7ec345d32a4efb42be871b.tar.bz2 |
re PR target/64338 (ICE in swap_condition, at jump.c:628)
PR target/64338
* config/i386/i386.c (ix86_expand_int_movcc): Don't reverse
compare_code when it is unconditionally overwritten afterwards.
Use ix86_reverse_condition instead of reverse_condition. Don't
change code if *reverse_condition* returned UNKNOWN and don't
swap ct/cf and negate diff in that case.
* g++.dg/opt/pr64338.C: New test.
From-SVN: r219356
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/i386/i386.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index dc2b7d8..340348e 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -20830,9 +20830,7 @@ ix86_expand_int_movcc (rtx operands[]) if (diff < 0) { machine_mode cmp_mode = GET_MODE (op0); - - std::swap (ct, cf); - diff = -diff; + enum rtx_code new_code; if (SCALAR_FLOAT_MODE_P (cmp_mode)) { @@ -20842,13 +20840,15 @@ ix86_expand_int_movcc (rtx operands[]) is not valid in general (we may convert non-trapping condition to trapping one), however on i386 we currently emit all comparisons unordered. */ - compare_code = reverse_condition_maybe_unordered (compare_code); - code = reverse_condition_maybe_unordered (code); + new_code = reverse_condition_maybe_unordered (code); } else + new_code = ix86_reverse_condition (code, cmp_mode); + if (new_code != UNKNOWN) { - compare_code = reverse_condition (compare_code); - code = reverse_condition (code); + std::swap (ct, cf); + diff = -diff; + code = new_code; } } @@ -20986,9 +20986,7 @@ ix86_expand_int_movcc (rtx operands[]) if (cf == 0) { machine_mode cmp_mode = GET_MODE (op0); - - cf = ct; - ct = 0; + enum rtx_code new_code; if (SCALAR_FLOAT_MODE_P (cmp_mode)) { @@ -20998,14 +20996,21 @@ ix86_expand_int_movcc (rtx operands[]) that is not valid in general (we may convert non-trapping condition to trapping one), however on i386 we currently emit all comparisons unordered. */ - code = reverse_condition_maybe_unordered (code); + new_code = reverse_condition_maybe_unordered (code); } else { - code = reverse_condition (code); - if (compare_code != UNKNOWN) + new_code = ix86_reverse_condition (code, cmp_mode); + if (compare_code != UNKNOWN && new_code != UNKNOWN) compare_code = reverse_condition (compare_code); } + + if (new_code != UNKNOWN) + { + cf = ct; + ct = 0; + code = new_code; + } } if (compare_code != UNKNOWN) |