[AArch64] Fix scheduler crash in fusion code.

Make sure we don't call getReg() on the first operand of instruction
without knowing that operand is actually a register.

(This codepath isn't enabled for most CPUs; only triggers on certain
CPUs, like Cortex-X1.)

Differential Revision: https://reviews.llvm.org/D136296
This commit is contained in:
Eli Friedman 2022-10-20 10:47:44 -07:00
parent 9db12a45e4
commit decb743e80
2 changed files with 32 additions and 2 deletions

View File

@ -30,8 +30,9 @@ static bool isArithmeticBccPair(const MachineInstr *FirstMI,
// If we're in CmpOnly mode, we only fuse arithmetic instructions that
// discard their result.
if (CmpOnly && !(FirstMI->getOperand(0).getReg() == AArch64::XZR ||
FirstMI->getOperand(0).getReg() == AArch64::WZR)) {
if (CmpOnly && FirstMI->getOperand(0).isReg() &&
!(FirstMI->getOperand(0).getReg() == AArch64::XZR ||
FirstMI->getOperand(0).getReg() == AArch64::WZR)) {
return false;
}

View File

@ -0,0 +1,29 @@
# RUN: llc -o /dev/null 2>&1 %s -mtriple aarch64-unknown -mcpu=cortex-x1 -run-pass=machine-scheduler
# Just ensure this doesn't crash.
---
name: crash
tracksRegLiveness: true
body: |
bb.0:
successors: %bb.1(0x00000000), %bb.2(0x80000000)
liveins: $w0, $x1
%1:gpr64common = COPY $x1
%0:gpr32common = COPY $w0
%3:gpr64sp = COPY $xzr
INLINEASM &"", 9 /* sideeffect mayload attdialect */, 196622 /* mem:m */, %3
%4:gpr32 = ADDSWri %0, 1, 0, implicit-def $nzcv
STRWui %4, %1, 0 :: (store (s32))
Bcc 3, %bb.2, implicit killed $nzcv
B %bb.1
bb.1:
successors:
ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp
ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp
bb.2:
RET_ReallyLR
...