]> granicus.if.org Git - llvm/commitdiff
[AArch64, X86] Guard against both instrs being wild cards
authorEvandro Menezes <e.menezes@samsung.com>
Tue, 21 Feb 2017 22:16:11 +0000 (22:16 +0000)
committerEvandro Menezes <e.menezes@samsung.com>
Tue, 21 Feb 2017 22:16:11 +0000 (22:16 +0000)
If both instrs are wild cards, the result can be a crash.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295776 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64MacroFusion.cpp
lib/Target/X86/X86MacroFusion.cpp

index a6965e8403b00ade3630d7bc70a9d4f892adf142..cde2dab69b670905ff2d2b6d05c8dde2629ae937 100644 (file)
@@ -34,12 +34,13 @@ static bool shouldScheduleAdjacent(const AArch64InstrInfo &TII,
                                    const AArch64Subtarget &ST,
                                    const MachineInstr *First,
                                    const MachineInstr *Second) {
+  assert((First || Second) && "At least one instr must be specified");
   unsigned FirstOpcode =
-      First ? First->getOpcode()
-            : static_cast<unsigned>(AArch64::INSTRUCTION_LIST_END);
+    First ? First->getOpcode()
+         : static_cast<unsigned>(AArch64::INSTRUCTION_LIST_END);
   unsigned SecondOpcode =
-      Second ? Second->getOpcode()
-             : static_cast<unsigned>(AArch64::INSTRUCTION_LIST_END);
+    Second ? Second->getOpcode()
+           : static_cast<unsigned>(AArch64::INSTRUCTION_LIST_END);
 
   if (ST.hasArithmeticBccFusion())
     // Fuse CMN, CMP, TST followed by Bcc.
index d09d8f36b770148382db956c64b2d982c018fea3..ac44d920595722d768ce970c618517f459b1004e 100644 (file)
@@ -44,12 +44,13 @@ static bool shouldScheduleAdjacent(const X86Subtarget &ST,
     FuseInc
   } FuseKind;
 
+  assert((First || Second) && "At least one instr must be specified");
   unsigned FirstOpcode = First
-                             ? First->getOpcode()
-                             : static_cast<unsigned>(X86::INSTRUCTION_LIST_END);
-  unsigned SecondOpcode =
-      Second ? Second->getOpcode()
-             : static_cast<unsigned>(X86::INSTRUCTION_LIST_END);
+                         ? First->getOpcode()
+                         : static_cast<unsigned>(X86::INSTRUCTION_LIST_END);
+  unsigned SecondOpcode = Second
+                          ? Second->getOpcode()
+                          : static_cast<unsigned>(X86::INSTRUCTION_LIST_END);
 
   switch (SecondOpcode) {
   default:
@@ -215,7 +216,7 @@ void X86MacroFusion::apply(ScheduleDAGInstrs *DAGInstrs) {
   // For now, assume targets can only fuse with the branch.
   SUnit &ExitSU = DAG->ExitSU;
   MachineInstr *Branch = ExitSU.getInstr();
-  if (!shouldScheduleAdjacent(ST, nullptr, Branch))
+  if (!Branch || !shouldScheduleAdjacent(ST, nullptr, Branch))
     return;
 
   for (SDep &PredDep : ExitSU.Preds) {