re PR rtl-optimization/11700 ([M68K] ICE in subreg_hard_regno)
authorRoger Sayle <roger@eyesopen.com>
Thu, 4 Sep 2003 01:53:01 +0000 (01:53 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Thu, 4 Sep 2003 01:53:01 +0000 (01:53 +0000)
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.

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

From-SVN: r71046

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

index 6d54b34e1159354e644a94c906156ed53ed9adcc..d432719285392de9bcf3ccaa1c25979817f38761 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 919bea6aae2292a0c51ba359eaf5189a388acfd6..6ace34809111ee82d07169c6b64e816c94ccb2d4 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 a6d708c98fa907e661265a8c755c03f7a064a907..d417f839c701493d39a33fe704150a798038fedd 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);
+}
+