aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-01-08 20:15:53 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-01-08 20:15:53 +0100
commitefa7df3c625146460d7ec345d32a4efb42be871b (patch)
treebd442b28e990d27a0b5a6ca8e0848994e3eff3f2 /gcc/config
parentde35aa66b07a62a1c27f4b104577848fa8f7ec17 (diff)
downloadgcc-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.c31
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)