final.c (cleanup_subreg_operands): Use recog_data.operand_loc in test for a subreg.
authorRichard Earnshaw <rearnsha@gcc.gnu.org>
Sat, 8 Dec 2001 10:49:49 +0000 (10:49 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Sat, 8 Dec 2001 10:49:49 +0000 (10:49 +0000)
* final.c (cleanup_subreg_operands):  Use recog_data.operand_loc
in test for a subreg.

From-SVN: r47788

gcc/final.c

index 16c95dee903818477388c57137ee9abf83520ccc..a17c3ac2c84fe7881c43f7fb78db7b5738994f63 100644 (file)
@@ -2726,7 +2726,12 @@ cleanup_subreg_operands (insn)
   extract_insn_cached (insn);
   for (i = 0; i < recog_data.n_operands; i++)
     {
-      if (GET_CODE (recog_data.operand[i]) == SUBREG)
+      /* The following test cannot use recog_data.operand when tesing
+        for a SUBREG: the underlying object might have been changed
+        already if we are inside a match_operator expression that
+        matches the else clause.  Instead we test the underlying
+        expression directly.  */
+      if (GET_CODE (*recog_data.operand_loc[i]) == SUBREG)
        recog_data.operand[i] = alter_subreg (recog_data.operand_loc[i]);
       else if (GET_CODE (recog_data.operand[i]) == PLUS
               || GET_CODE (recog_data.operand[i]) == MULT