Skip to content

Commit 6a5cb5a

Browse files
vmustyaarsenm
andauthored
[GISel] Fix crash in GlobalISel utils method (#153334)
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. --------- Co-authored-by: Matt Arsenault <[email protected]>
1 parent e4eccd6 commit 6a5cb5a

File tree

2 files changed

+85
-2
lines changed

2 files changed

+85
-2
lines changed

llvm/lib/CodeGen/GlobalISel/Utils.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,8 +466,14 @@ llvm::getConstantFPVRegVal(Register VReg, const MachineRegisterInfo &MRI) {
466466
std::optional<DefinitionAndSourceRegister>
467467
llvm::getDefSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI) {
468468
Register DefSrcReg = Reg;
469-
auto *DefMI = MRI.getVRegDef(Reg);
470-
auto DstTy = MRI.getType(DefMI->getOperand(0).getReg());
469+
// This assumes that the code is in SSA form, so there should only be one
470+
// definition.
471+
auto DefIt = MRI.def_begin(Reg);
472+
if (DefIt == MRI.def_end())
473+
return {};
474+
MachineOperand &DefOpnd = *DefIt;
475+
MachineInstr *DefMI = DefOpnd.getParent();
476+
auto DstTy = MRI.getType(DefOpnd.getReg());
471477
if (!DstTy.isValid())
472478
return std::nullopt;
473479
unsigned Opc = DefMI->getOpcode();
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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 %s -o - | FileCheck %s
3+
4+
# COM: Check that the pass doesn't crash.
5+
6+
---
7+
name: test_inline_asm
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_inline_asm
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+
%1:sgpr(s32) = G_FCONSTANT float 2.000000e+00
33+
%2:vgpr(s32) = COPY %1(s32)
34+
%3:vgpr(s32) = G_FMUL %0, %2
35+
%4: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+
%6:vgpr(s32) = COPY %4(s32)
38+
%7:vgpr(s32) = nnan G_AMDGPU_FMED3 %3(s32), %5(s32), %6(s32)
39+
$vgpr0 = COPY %7(s32)
40+
...
41+
42+
---
43+
name: test_unmerge_values
44+
legalized: true
45+
regBankSelected: true
46+
tracksRegLiveness: true
47+
machineFunctionInfo:
48+
mode:
49+
ieee: true
50+
dx10-clamp: true
51+
body: |
52+
bb.1 :
53+
liveins: $vgpr0
54+
55+
; CHECK-LABEL: name: test_unmerge_values
56+
; CHECK: liveins: $vgpr0
57+
; CHECK-NEXT: {{ $}}
58+
; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
59+
; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_FCONSTANT float 2.000000e+00
60+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32)
61+
; CHECK-NEXT: [[FMUL:%[0-9]+]]:vgpr(s32) = G_FMUL [[COPY]], [[COPY1]]
62+
; CHECK-NEXT: [[C1:%[0-9]+]]:sgpr(s32) = G_FCONSTANT float 1.000000e+00
63+
; CHECK-NEXT: [[C2:%[0-9]+]]:vgpr(s32) = G_CONSTANT i32 0
64+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY [[C1]](s32)
65+
; CHECK-NEXT: [[AMDGPU_FMED3_:%[0-9]+]]:vgpr(s32) = nnan G_AMDGPU_FMED3 [[FMUL]], [[C2]], [[COPY2]]
66+
; CHECK-NEXT: $vgpr0 = COPY [[C2]](s32)
67+
%0:vgpr(s32) = COPY $vgpr0
68+
%1:sgpr(s32) = G_FCONSTANT float 2.000000e+00
69+
%2:vgpr(s32) = COPY %1(s32)
70+
%3:vgpr(s32) = G_FMUL %0, %2
71+
%4:sgpr(s32) = G_FCONSTANT float 1.000000e+00
72+
%5:vgpr(s64) = G_CONSTANT i64 123456789
73+
%6:vgpr(s32), %7:vgpr(s32) = G_UNMERGE_VALUES %5(s64)
74+
%8:vgpr(s32) = COPY %4(s32)
75+
%9:vgpr(s32) = nnan G_AMDGPU_FMED3 %3(s32), %7(s32), %8(s32)
76+
$vgpr0 = COPY %7(s32)
77+
...

0 commit comments

Comments
 (0)