aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2004-04-09 01:36:49 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2004-04-09 01:36:49 +0000
commit82a6a7583c61ea85cbe36170cab00b2bdab8cf03 (patch)
tree55f596d2d4b533f64d0dbd50d38dbc9cdcad782e
parent2a782c52ee25dcad5966c76476b062d5b5356b4b (diff)
downloadgcc-82a6a7583c61ea85cbe36170cab00b2bdab8cf03.zip
gcc-82a6a7583c61ea85cbe36170cab00b2bdab8cf03.tar.gz
gcc-82a6a7583c61ea85cbe36170cab00b2bdab8cf03.tar.bz2
re PR target/14888 (ICE with -O2 -ffast-math in final_scan_insn())
PR target/14888 * config/i386/i386.md (truncdfsf2_noop, truncxfsf2_noop, truncxfdf2_noop): Provide dummy "fmov" implementations. * g++.dg/opt/pr14888.C: New test case. From-SVN: r80539
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md36
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr14888.C22
4 files changed, 66 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7aef7fc..7a1823a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2004-04-08 Roger Sayle <roger@eyesopen.com>
+
+ PR target/14888
+ * config/i386/i386.md (truncdfsf2_noop, truncxfsf2_noop,
+ truncxfdf2_noop): Provide dummy "fmov" implementations.
+
2004-04-08 Ian Lance Taylor <ian@wasabisystems.com>
* gcc.c (default_compilers): Add missing initializers.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index e9afa77..a9d8eed 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3677,7 +3677,17 @@
[(set (match_operand:SF 0 "register_operand" "=f")
(float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]
"TARGET_80387 && flag_unsafe_math_optimizations"
- "#")
+{
+ if (REG_P (operands[1])
+ && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
+ return "fstp\t%y0";
+ else if (STACK_TOP_P (operands[0]))
+ return "fld%z1\t%y1";
+ else
+ return "fst\t%y0";
+}
+ [(set_attr "type" "fmov")
+ (set_attr "mode" "SF")])
(define_insn "*truncdfsf2_1"
[(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f#rx,?r#fx,?x#rf")
@@ -3920,7 +3930,17 @@
[(set (match_operand:SF 0 "register_operand" "=f")
(float_truncate:SF (match_operand:XF 1 "register_operand" "f")))]
"TARGET_80387 && flag_unsafe_math_optimizations"
- "#")
+{
+ if (REG_P (operands[1])
+ && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
+ return "fstp\t%y0";
+ else if (STACK_TOP_P (operands[0]))
+ return "fld%z1\t%y1";
+ else
+ return "fst\t%y0";
+}
+ [(set_attr "type" "fmov")
+ (set_attr "mode" "SF")])
(define_insn "*truncxfsf2_1"
[(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f#rx,?r#fx,?x#rf")
@@ -3999,7 +4019,17 @@
[(set (match_operand:DF 0 "register_operand" "=f")
(float_truncate:DF (match_operand:XF 1 "register_operand" "f")))]
"TARGET_80387 && flag_unsafe_math_optimizations"
- "#")
+{
+ if (REG_P (operands[1])
+ && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
+ return "fstp\t%y0";
+ else if (STACK_TOP_P (operands[0]))
+ return "fld%z1\t%y1";
+ else
+ return "fst\t%y0";
+}
+ [(set_attr "type" "fmov")
+ (set_attr "mode" "DF")])
(define_insn "*truncxfdf2_1"
[(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f#rY,?r#fY,?Y#rf")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 65dfd9e..d581c80 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-04-08 Roger Sayle <roger@eyesopen.com>
+
+ PR target/14888
+ * g++.dg/opt/pr14888.C: New test case.
+
2004-04-08 Geoffrey Keating <geoffk@apple.com>
* gcc.dg/pch/valid-1.c, gcc.dg/pch/valid-2.c, gcc.dg/pch/valid-3.c,
diff --git a/gcc/testsuite/g++.dg/opt/pr14888.C b/gcc/testsuite/g++.dg/opt/pr14888.C
new file mode 100644
index 0000000..e5c56aa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr14888.C
@@ -0,0 +1,22 @@
+// PR target/14888
+// This used to ICE because the truncdfsf2 isn't completely eliminated
+
+// { dg-do compile }
+// { dg-options "-O2 -ffast-math" }
+
+class xcomplex
+{
+public:
+ float re, im;
+
+ xcomplex &operator*= (const float &fact)
+ { re*=fact; im*=fact; return *this; }
+};
+
+void foo (xcomplex &almT, xcomplex &almG)
+{
+ double gb;
+ almT*=gb;
+ almG*=gb*42;
+}
+