Skip to content

Commit 15bc48b

Browse files
committed
Re-implement the fix to take care of other cases, not only the inline asm
1 parent 9c20890 commit 15bc48b

File tree

3 files changed

+84
-45
lines changed

3 files changed

+84
-45
lines changed

llvm/lib/CodeGen/GlobalISel/Utils.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -466,11 +466,13 @@ 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 &Opnd = DefMI->getOperand(0);
471-
if (!Opnd.isReg())
472-
return DefinitionAndSourceRegister{DefMI, DefSrcReg};
473-
auto DstTy = MRI.getType(Opnd.getReg());
469+
// This assumes that the code is in SSA form, so there should only be one
470+
// definition.
471+
if (MRI.def_empty(Reg))
472+
return std::nullopt;
473+
MachineOperand &DefOpnd = *MRI.def_begin(Reg);
474+
MachineInstr *DefMI = DefOpnd.getParent();
475+
auto DstTy = MRI.getType(DefOpnd.getReg());
474476
if (!DstTy.isValid())
475477
return std::nullopt;
476478
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+
...

llvm/test/CodeGen/AMDGPU/GlobalISel/regbankcombiner-inlineasm-crash.mir

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)