aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2007-09-14 21:24:26 +0200
committerUros Bizjak <uros@gcc.gnu.org>2007-09-14 21:24:26 +0200
commit21da84bd5e7c0b1f2bdfa28429b066a098307f44 (patch)
tree4abcf9dad0688d3ff2d411ff47c86465f62bf3c4
parent56e449d39af4a5c032d8d1f2825182ebed7a1a75 (diff)
downloadgcc-21da84bd5e7c0b1f2bdfa28429b066a098307f44.zip
gcc-21da84bd5e7c0b1f2bdfa28429b066a098307f44.tar.gz
gcc-21da84bd5e7c0b1f2bdfa28429b066a098307f44.tar.bz2
re PR target/33438 (ICE in cselib_record_set, at cselib.c:1515 on x86)
PR target/33438 * config/i386/i386.md (fmodxf3): Copy operands[2] to temporary register when operands[2] equals operands[1]. (remainderxf3): Ditto. testsuite/ChangeLog: PR target/33438 * gcc.target/i386/pr33438.c: New test. From-SVN: r128502
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/i386.md28
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr33483.c12
4 files changed, 47 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c51ce01..728309e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-09-14 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/33438
+ * config/i386/i386.md (fmodxf3): Copy operands[2] to temporary register
+ when operands[2] equals operands[1].
+ (remainderxf3): Ditto.
+
2007-09-14 Sandra Loosemore <sandra@codesourcery.com>
Nigel Stephens <nigel@mips.com>
@@ -1191,8 +1198,7 @@
(lshr<mode>3): Ditto.
(ashl<mode>3): Ditto.
(vec_shl_<mode>): Use const_0_to_255_mul_8_operand predicate for op2.
- (vec_shr_<mode>): Use const_0_to_255_mul_8_operand predicate for op2.
-
+ (vec_shr_<mode>): Ditto.
* gcc/config/i386/i386.c (ix86_expand_builtin) [IX86_BUILTIN_PSLL?128,
IX86_BUILTIN_PSRA*?128, IX86_BUILTIN_PSRL?128]: Convert op1 to SImode.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index a0e0c82..622686b 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -16691,10 +16691,18 @@
{
rtx label = gen_label_rtx ();
- emit_label (label);
+ rtx op2;
+
+ if (rtx_equal_p (operands[1], operands[2]))
+ {
+ op2 = gen_reg_rtx (XFmode);
+ emit_move_insn (op2, operands[2]);
+ }
+ else
+ op2 = operands[2];
- emit_insn (gen_fpremxf4_i387 (operands[1], operands[2],
- operands[1], operands[2]));
+ emit_label (label);
+ emit_insn (gen_fpremxf4_i387 (operands[1], op2, operands[1], op2));
ix86_emit_fp_unordered_jump (label);
LABEL_NUSES (label) = 1;
@@ -16755,10 +16763,18 @@
{
rtx label = gen_label_rtx ();
- emit_label (label);
+ rtx op2;
+
+ if (rtx_equal_p (operands[1], operands[2]))
+ {
+ op2 = gen_reg_rtx (XFmode);
+ emit_move_insn (op2, operands[2]);
+ }
+ else
+ op2 = operands[2];
- emit_insn (gen_fprem1xf4_i387 (operands[1], operands[2],
- operands[1], operands[2]));
+ emit_label (label);
+ emit_insn (gen_fprem1xf4_i387 (operands[1], op2, operands[1], op2));
ix86_emit_fp_unordered_jump (label);
LABEL_NUSES (label) = 1;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9c18500..884f3f9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-09-14 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/33438
+ * gcc.target/i386/pr33438.c: New test.
+
2007-09-14 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* gfortran.dg/nint_2.f90: Revert previous commit.
diff --git a/gcc/testsuite/gcc.target/i386/pr33483.c b/gcc/testsuite/gcc.target/i386/pr33483.c
new file mode 100644
index 0000000..8fe2a94
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr33483.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+long double f1 (long double x)
+{
+ return __builtin_fmodl (x, x);
+}
+
+long double f2 (long double x)
+{
+ return __builtin_remainderl (x, x);
+}