Skip to content

Commit 748f861

Browse files
authored
llvm-reduce: Handle cloning for MachineJumpTableInfo (#69086)
1 parent dbb4f90 commit 748f861

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# REQUIRES: aarch64-registered-target
2+
# FIXME: Fails with -abort-on-invalid-reduction
3+
# RUN: llvm-reduce -simplify-mir --delta-passes=instructions -mtriple=aarch64-- --test FileCheck --test-arg --check-prefix=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t 2> %t.log
4+
# RUN: FileCheck --match-full-lines --check-prefix=RESULT %s < %t
5+
6+
# Check that jump table info is preserved through cloning
7+
8+
# CHECK-INTERESTINGNESS: MOVi32imm
9+
10+
# RESULT: jumpTable:
11+
# RESULT-NEXT: kind: label-difference32
12+
# RESULT-NEXT: entries:
13+
# RESULT-NEXT: - id: 0
14+
# RESULT-NEXT: blocks: [ '%bb.9', '%bb.5', '%bb.2', '%bb.2', '%bb.2', '%bb.2',
15+
# RESULT-NEXT: '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.6', '%bb.2',
16+
# RESULT-NEXT: '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2',
17+
# RESULT-NEXT: '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2',
18+
# RESULT-NEXT: '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2',
19+
# RESULT-NEXT: '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.7', '%bb.2',
20+
# RESULT-NEXT: '%bb.2', '%bb.2', '%bb.2', '%bb.7' ]
21+
22+
---
23+
name: widget
24+
tracksRegLiveness: true
25+
jumpTable:
26+
kind: label-difference32
27+
entries:
28+
- id: 0
29+
blocks: [ '%bb.9', '%bb.5', '%bb.2', '%bb.2', '%bb.2', '%bb.2',
30+
'%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.6', '%bb.2',
31+
'%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2',
32+
'%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2',
33+
'%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.2',
34+
'%bb.2', '%bb.2', '%bb.2', '%bb.2', '%bb.7', '%bb.2',
35+
'%bb.2', '%bb.2', '%bb.2', '%bb.7' ]
36+
body: |
37+
bb.0:
38+
liveins: $w0, $w1, $x2, $x3, $x4, $w5, $w6
39+
40+
%0:gpr32 = COPY $w6
41+
%1:gpr32 = COPY $w5
42+
%2:gpr64common = COPY $x4
43+
%3:gpr64 = COPY $x3
44+
%4:gpr64common = COPY $x2
45+
%5:gpr32common = COPY $w1
46+
%6:gpr32 = COPY $w0
47+
undef %7.sub_32:gpr64 = ORRWrs $wzr, %5, 0, implicit-def %7
48+
%8:gpr64common = MOVaddrJT target-flags(aarch64-page) %jump-table.0, target-flags(aarch64-pageoff, aarch64-nc) %jump-table.0
49+
%9:gpr32 = MOVi32imm 1
50+
undef %10.sub_32:gpr64 = IMPLICIT_DEF
51+
52+
bb.1:
53+
54+
bb.2:
55+
successors: %bb.3(0x0fbefbf0), %bb.4(0x70410410)
56+
57+
dead $wzr = SUBSWri %5, 39, 0, implicit-def $nzcv
58+
Bcc 8, %bb.3, implicit killed $nzcv
59+
B %bb.4
60+
61+
bb.3:
62+
successors: %bb.11(0x00000000), %bb.2(0x80000000)
63+
64+
dead $wzr = SUBSWri %5, 64, 0, implicit-def $nzcv
65+
Bcc 0, %bb.11, implicit killed $nzcv
66+
B %bb.2
67+
68+
bb.4:
69+
successors: %bb.9(0x01288b01), %bb.5(0x01288b01), %bb.2(0x11f46a91), %bb.6(0x23e8d524), %bb.7(0x47d1aa49)
70+
71+
early-clobber %11:gpr64, dead early-clobber %12:gpr64sp = JumpTableDest32 %8, %7, %jump-table.0
72+
JUMP_TABLE_DEBUG_INFO 0
73+
BR %11
74+
75+
bb.5:
76+
B %bb.8
77+
78+
bb.6:
79+
B %bb.2
80+
81+
bb.7:
82+
B %bb.2
83+
84+
bb.8:
85+
B %bb.8
86+
87+
bb.9:
88+
TBZW %0, 0, %bb.1
89+
B %bb.10
90+
91+
bb.10:
92+
B %bb.1
93+
94+
bb.11:
95+
BRK 1
96+
97+
...

llvm/tools/llvm-reduce/ReducerWorkItem.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/CodeGen/MachineFrameInfo.h"
2020
#include "llvm/CodeGen/MachineFunction.h"
2121
#include "llvm/CodeGen/MachineFunctionPass.h"
22+
#include "llvm/CodeGen/MachineJumpTableInfo.h"
2223
#include "llvm/CodeGen/MachineModuleInfo.h"
2324
#include "llvm/CodeGen/MachineRegisterInfo.h"
2425
#include "llvm/CodeGen/TargetInstrInfo.h"
@@ -153,6 +154,23 @@ static void cloneFrameInfo(
153154
}
154155
}
155156

157+
static void cloneJumpTableInfo(
158+
MachineFunction &DstMF, const MachineJumpTableInfo &SrcJTI,
159+
const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB) {
160+
161+
auto *DstJTI = DstMF.getOrCreateJumpTableInfo(SrcJTI.getEntryKind());
162+
163+
std::vector<MachineBasicBlock *> DstBBs;
164+
165+
for (const MachineJumpTableEntry &Entry : SrcJTI.getJumpTables()) {
166+
for (MachineBasicBlock *X : Entry.MBBs)
167+
DstBBs.push_back(Src2DstMBB.find(X)->second);
168+
169+
DstJTI->createJumpTableIndex(DstBBs);
170+
DstBBs.clear();
171+
}
172+
}
173+
156174
static void cloneMemOperands(MachineInstr &DstMI, MachineInstr &SrcMI,
157175
MachineFunction &SrcMF, MachineFunction &DstMF) {
158176
// The new MachineMemOperands should be owned by the new function's
@@ -266,6 +284,10 @@ static std::unique_ptr<MachineFunction> cloneMF(MachineFunction *SrcMF,
266284
// Copy stack objects and other info
267285
cloneFrameInfo(DstMFI, SrcMFI, Src2DstMBB);
268286

287+
if (MachineJumpTableInfo *SrcJTI = SrcMF->getJumpTableInfo()) {
288+
cloneJumpTableInfo(*DstMF, *SrcJTI, Src2DstMBB);
289+
}
290+
269291
// Remap the debug info frame index references.
270292
DstMF->VariableDbgInfos = SrcMF->VariableDbgInfos;
271293

0 commit comments

Comments
 (0)