Ensure the mode used to create split registers is suppported
authorMatthew Fortune <matthew.fortune@imgtec.com>
Mon, 20 Feb 2017 12:07:23 +0000 (12:07 +0000)
committerMatthew Fortune <mpf@gcc.gnu.org>
Mon, 20 Feb 2017 12:07:23 +0000 (12:07 +0000)
gcc/
PR target/78012
* lra-constraints.c (split_reg): Check requested split mode
is supported by the register.

From-SVN: r245601

gcc/ChangeLog
gcc/lra-constraints.c

index aa7bb847734f0686abd78972c63ecb18f394468a..57857eeb3576ad78bf81a1d1fa8d25485373ce68 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-20  Matthew Fortune  <matthew.fortune@imgtec.com>
+
+       PR target/78012
+       * lra-constraints.c (split_reg): Check requested split mode
+       is supported by the register.
+
 2017-02-20  Matthew Fortune  <matthew.fortune@imgtec.com>
 
        * lra-constraints.c (simplify_operand_subreg): Remove early
index a7de40b7fc6e9bb6c274e7ac2b5a7594226fdfdb..bd5fbcd7dea5bc9150652b78c175a397b4065371 100644 (file)
@@ -5396,6 +5396,26 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
            }
          return false;
        }
+      /* Split_if_necessary can split hard registers used as part of a
+        multi-register mode but splits each register individually.  The
+        mode used for each independent register may not be supported
+        so reject the split.  Splitting the wider mode should theoretically
+        be possible but is not implemented.  */
+      if (! HARD_REGNO_MODE_OK (hard_regno, mode))
+       {
+         if (lra_dump_file != NULL)
+           {
+             fprintf (lra_dump_file,
+                      "    Rejecting split of %d(%s): unsuitable mode %s\n",
+                      original_regno,
+                      reg_class_names[lra_get_allocno_class (original_regno)],
+                      GET_MODE_NAME (mode));
+             fprintf
+               (lra_dump_file,
+                "    ))))))))))))))))))))))))))))))))))))))))))))))))\n");
+           }
+         return false;
+       }
       new_reg = lra_create_new_reg (mode, original_reg, rclass, "split");
       reg_renumber[REGNO (new_reg)] = hard_regno;
     }