Skip to content

Commit 9c20890

Browse files
committed
[GISel] Fix crash in GlobalISel utils method
The `getDefSrcRegIgnoringCopies` method in GlobalISel Utils crashed when the first operand of the input instruction was not a register, e.g., the `INLINEASM` instruction has a non-register first operand.
1 parent 6e59d1d commit 9c20890

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

llvm/lib/CodeGen/GlobalISel/Utils.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,10 @@ std::optional<DefinitionAndSourceRegister>
467467
llvm::getDefSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI) {
468468
Register DefSrcReg = Reg;
469469
auto *DefMI = MRI.getVRegDef(Reg);
470-
auto DstTy = MRI.getType(DefMI->getOperand(0).getReg());
470+
auto &Opnd = DefMI->getOperand(0);
471+
if (!Opnd.isReg())
472+
return DefinitionAndSourceRegister{DefMI, DefSrcReg};
473+
auto DstTy = MRI.getType(Opnd.getReg());
471474
if (!DstTy.isValid())
472475
return std::nullopt;
473476
unsigned Opc = DefMI->getOpcode();
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=amdgcn-amd-mesa3d -mcpu=gfx1200 -run-pass=amdgpu-regbank-combiner -verify-machineinstrs %s -o - | FileCheck %s
3+
4+
# COM: Check that the pass doesn't crash.
5+
6+
---
7+
name: test_fmed3
8+
legalized: true
9+
regBankSelected: true
10+
tracksRegLiveness: true
11+
machineFunctionInfo:
12+
mode:
13+
ieee: true
14+
dx10-clamp: true
15+
body: |
16+
bb.1 :
17+
liveins: $vgpr0
18+
19+
; CHECK-LABEL: name: test_fmed3
20+
; CHECK: liveins: $vgpr0
21+
; CHECK-NEXT: {{ $}}
22+
; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
23+
; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_FCONSTANT float 2.000000e+00
24+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32)
25+
; CHECK-NEXT: [[FMUL:%[0-9]+]]:vgpr(s32) = G_FMUL [[COPY]], [[COPY1]]
26+
; CHECK-NEXT: [[C1:%[0-9]+]]:sgpr(s32) = G_FCONSTANT float 1.000000e+00
27+
; CHECK-NEXT: INLINEASM &"v_mov_b32 $0, 0", 0 /* attdialect */, 2228234 /* regdef:VGPR_32 */, def %5(s32)
28+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY [[C1]](s32)
29+
; CHECK-NEXT: [[AMDGPU_FMED3_:%[0-9]+]]:vgpr(s32) = nnan G_AMDGPU_FMED3 [[FMUL]], %5, [[COPY2]]
30+
; CHECK-NEXT: $vgpr0 = COPY [[AMDGPU_FMED3_]](s32)
31+
%0:vgpr(s32) = COPY $vgpr0
32+
%2:sgpr(s32) = G_FCONSTANT float 2.000000e+00
33+
%8:vgpr(s32) = COPY %2(s32)
34+
%3:vgpr(s32) = G_FMUL %0, %8
35+
%6:sgpr(s32) = G_FCONSTANT float 1.000000e+00
36+
INLINEASM &"v_mov_b32 $0, 0", 0 /* attdialect */, 2228234 /* regdef:VGPR_32 */, def %5:vgpr_32
37+
%10:vgpr(s32) = COPY %6(s32)
38+
%4:vgpr(s32) = nnan G_AMDGPU_FMED3 %3(s32), %5(s32), %10(s32)
39+
$vgpr0 = COPY %4(s32)
40+
...

0 commit comments

Comments
 (0)