PR optimization/11700.
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Sep 2003 01:53:01 +0000 (01:53 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Sep 2003 01:53:01 +0000 (01:53 +0000)
* simplify-rtx.c (simplify_subreg): Check that the subreg offset
of a hard register is representable before trying to simplify it
using subreg_hard_regno.

* gcc.c-torture/compile/20030903-1.c: New test case.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@71046 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20030903-1.c [new file with mode: 0644]

index 6d54b34..d432719 100644 (file)
@@ -1,3 +1,10 @@
+2003-09-03  Roger Sayle  <roger@eyesopen.com>
+
+       PR optimization/11700.
+       * simplify-rtx.c (simplify_subreg): Check that the subreg offset
+       of a hard register is representable before trying to simplify it
+       using subreg_hard_regno.
+
 2003-09-04  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
 
        * configure.in (gcc_cv_ld_hidden): Disable unless using GNU ld.
index 919bea6..6ace348 100644 (file)
@@ -3017,10 +3017,12 @@ simplify_subreg (enum machine_mode outermode, rtx op,
 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
       && REGNO (op) != ARG_POINTER_REGNUM
 #endif
-      && REGNO (op) != STACK_POINTER_REGNUM)
+      && REGNO (op) != STACK_POINTER_REGNUM
+      && subreg_offset_representable_p (REGNO (op), innermode,
+                                       byte, outermode))
     {
-      int final_regno = subreg_hard_regno (gen_rtx_SUBREG (outermode, op, byte),
-                                          0);
+      rtx tem = gen_rtx_SUBREG (outermode, op, byte);
+      int final_regno = subreg_hard_regno (tem, 0);
 
       /* ??? We do allow it if the current REG is not valid for
         its mode.  This is a kludge to work around how float/complex
index a6d708c..d417f83 100644 (file)
@@ -1,3 +1,8 @@
+2003-09-03  Roger Sayle  <roger@eyesopen.com>
+
+       PR optimization/11700.
+       * gcc.c-torture/compile/20030903-1.c: New test case.
+
 2003-09-03  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/12053
diff --git a/gcc/testsuite/gcc.c-torture/compile/20030903-1.c b/gcc/testsuite/gcc.c-torture/compile/20030903-1.c
new file mode 100644 (file)
index 0000000..fa4d30d
--- /dev/null
@@ -0,0 +1,33 @@
+/* Derived from PR optimization/11700.  */
+/* The compiler used to ICE during reload for m68k targets.  */
+
+void check_complex (__complex__ double, __complex__ double,
+                    __complex__ double, __complex__ int);
+void check_float (double, double, double, int);
+extern double _Complex conj (double _Complex);
+extern double carg (double _Complex __z);
+
+static double minus_zero;
+
+void
+conj_test (void)
+{
+  check_complex (conj (({ __complex__ double __retval;
+                         __real__ __retval = (0.0);
+                         __imag__ __retval = (0.0);
+                         __retval; })),
+                ({ __complex__ double __retval;
+                   __real__ __retval = (0.0);
+                   __imag__ __retval = (minus_zero);
+                   __retval; }), 0, 0);
+}
+
+void
+carg_test (void)
+{
+  check_float (carg (({ __complex__ double __retval;
+                       __real__ __retval = (2.0);
+                       __imag__ __retval = (0);
+                       __retval; })), 0, 0, 0);
+}
+