Skip to content

Commit b0e06a2

Browse files
committed
[TailDuplicator] Add a limit on the number of indirect branch successors
1 parent aa8b1cf commit b0e06a2

File tree

2 files changed

+35
-36
lines changed

2 files changed

+35
-36
lines changed

llvm/lib/CodeGen/TailDuplicator.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ static cl::opt<unsigned> TailDupIndirectBranchSize(
6868
"end with indirect branches."), cl::init(20),
6969
cl::Hidden);
7070

71+
static cl::opt<unsigned> TailDupIndirectBranchSuccSize(
72+
"tail-dup-indirect-succ-size",
73+
cl::desc("Maximum successors to consider tail duplicating blocks that "
74+
"end with indirect branches."),
75+
cl::init(8), cl::Hidden);
76+
7177
static cl::opt<bool>
7278
TailDupVerify("tail-dup-verify",
7379
cl::desc("Verify sanity of PHI instructions during taildup"),
@@ -598,7 +604,8 @@ bool TailDuplicator::shouldTailDuplicate(bool IsSimple,
598604
if (!TailBB.empty())
599605
HasIndirectbr = TailBB.back().isIndirectBranch();
600606

601-
if (HasIndirectbr && PreRegAlloc)
607+
if (HasIndirectbr && PreRegAlloc &&
608+
TailBB.succ_size() <= TailDupIndirectBranchSuccSize)
602609
MaxDuplicateCount = TailDupIndirectBranchSize;
603610

604611
// Check the instructions in the block to determine whether tail-duplication

llvm/test/CodeGen/X86/tail-dup-indirect-succ-size.mir

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
2-
# RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass=early-tailduplication %s -o - | FileCheck %s -check-prefix=LIMIT
3-
# RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass=early-tailduplication %s -o - | FileCheck %s -check-prefix=NOLIMIT
2+
# RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass=early-tailduplication -tail-dup-indirect-succ-size=3 %s -o - | FileCheck %s -check-prefix=LIMIT
3+
# RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass=early-tailduplication -tail-dup-indirect-succ-size=4 %s -o - | FileCheck %s -check-prefix=NOLIMIT
44

55
--- |
66
source_filename = "tail-dup-pred-size-limit.ll"
@@ -172,81 +172,73 @@ body: |
172172
; LIMIT-NEXT: JMP64m $noreg, 8, [[SUBREG_TO_REG]], %jump-table.0, $noreg :: (load (s64) from jump-table)
173173
; LIMIT-NEXT: {{ $}}
174174
; LIMIT-NEXT: bb.2 (%ir-block.5):
175-
; LIMIT-NEXT: successors: %bb.9(0x20000000), %bb.10(0x20000000), %bb.11(0x20000000), %bb.12(0x20000000)
175+
; LIMIT-NEXT: successors: %bb.7(0x80000000)
176176
; LIMIT-NEXT: {{ $}}
177177
; LIMIT-NEXT: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[COPY1]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.0)
178-
; LIMIT-NEXT: [[SHR32ri1:%[0-9]+]]:gr32 = SHR32ri [[COPY]], 2, implicit-def dead $eflags
179-
; LIMIT-NEXT: [[AND32ri1:%[0-9]+]]:gr32 = AND32ri [[SHR32ri1]], 7, implicit-def dead $eflags
180-
; LIMIT-NEXT: [[SUBREG_TO_REG1:%[0-9]+]]:gr64_nosp = SUBREG_TO_REG 0, [[AND32ri1]], %subreg.sub_32bit
181-
; LIMIT-NEXT: JMP64m $noreg, 8, [[SUBREG_TO_REG1]], %jump-table.1, $noreg :: (load (s64) from jump-table)
178+
; LIMIT-NEXT: JMP_1 %bb.7
182179
; LIMIT-NEXT: {{ $}}
183180
; LIMIT-NEXT: bb.3 (%ir-block.7):
184-
; LIMIT-NEXT: successors: %bb.9(0x20000000), %bb.10(0x20000000), %bb.11(0x20000000), %bb.12(0x20000000)
181+
; LIMIT-NEXT: successors: %bb.7(0x80000000)
185182
; LIMIT-NEXT: {{ $}}
186183
; LIMIT-NEXT: [[MOV32rm1:%[0-9]+]]:gr32 = MOV32rm [[COPY1]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.0)
187-
; LIMIT-NEXT: [[SHR32ri2:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm1]], 1, implicit-def dead $eflags
188-
; LIMIT-NEXT: [[SHR32ri3:%[0-9]+]]:gr32 = SHR32ri [[COPY]], 2, implicit-def dead $eflags
189-
; LIMIT-NEXT: [[AND32ri2:%[0-9]+]]:gr32 = AND32ri [[SHR32ri3]], 7, implicit-def dead $eflags
190-
; LIMIT-NEXT: [[SUBREG_TO_REG2:%[0-9]+]]:gr64_nosp = SUBREG_TO_REG 0, [[AND32ri2]], %subreg.sub_32bit
191-
; LIMIT-NEXT: JMP64m $noreg, 8, [[SUBREG_TO_REG2]], %jump-table.1, $noreg :: (load (s64) from jump-table)
184+
; LIMIT-NEXT: [[SHR32ri1:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm1]], 1, implicit-def dead $eflags
185+
; LIMIT-NEXT: JMP_1 %bb.7
192186
; LIMIT-NEXT: {{ $}}
193187
; LIMIT-NEXT: bb.4 (%ir-block.10):
194-
; LIMIT-NEXT: successors: %bb.9(0x20000000), %bb.10(0x20000000), %bb.11(0x20000000), %bb.12(0x20000000)
188+
; LIMIT-NEXT: successors: %bb.7(0x80000000)
195189
; LIMIT-NEXT: {{ $}}
196190
; LIMIT-NEXT: [[MOV32rm2:%[0-9]+]]:gr32 = MOV32rm [[COPY1]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.0)
197-
; LIMIT-NEXT: [[SHR32ri4:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm2]], 2, implicit-def dead $eflags
198-
; LIMIT-NEXT: [[SHR32ri5:%[0-9]+]]:gr32 = SHR32ri [[COPY]], 2, implicit-def dead $eflags
199-
; LIMIT-NEXT: [[AND32ri3:%[0-9]+]]:gr32 = AND32ri [[SHR32ri5]], 7, implicit-def dead $eflags
200-
; LIMIT-NEXT: [[SUBREG_TO_REG3:%[0-9]+]]:gr64_nosp = SUBREG_TO_REG 0, [[AND32ri3]], %subreg.sub_32bit
201-
; LIMIT-NEXT: JMP64m $noreg, 8, [[SUBREG_TO_REG3]], %jump-table.1, $noreg :: (load (s64) from jump-table)
191+
; LIMIT-NEXT: [[SHR32ri2:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm2]], 2, implicit-def dead $eflags
192+
; LIMIT-NEXT: JMP_1 %bb.7
202193
; LIMIT-NEXT: {{ $}}
203194
; LIMIT-NEXT: bb.5 (%ir-block.13):
204-
; LIMIT-NEXT: successors: %bb.9(0x20000000), %bb.10(0x20000000), %bb.11(0x20000000), %bb.12(0x20000000)
195+
; LIMIT-NEXT: successors: %bb.7(0x80000000)
205196
; LIMIT-NEXT: {{ $}}
206197
; LIMIT-NEXT: [[MOV32rm3:%[0-9]+]]:gr32 = MOV32rm [[COPY1]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.0)
207-
; LIMIT-NEXT: [[SHR32ri6:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm3]], 3, implicit-def dead $eflags
208-
; LIMIT-NEXT: [[SHR32ri7:%[0-9]+]]:gr32 = SHR32ri [[COPY]], 2, implicit-def dead $eflags
209-
; LIMIT-NEXT: [[AND32ri4:%[0-9]+]]:gr32 = AND32ri [[SHR32ri7]], 7, implicit-def dead $eflags
210-
; LIMIT-NEXT: [[SUBREG_TO_REG4:%[0-9]+]]:gr64_nosp = SUBREG_TO_REG 0, [[AND32ri4]], %subreg.sub_32bit
211-
; LIMIT-NEXT: JMP64m $noreg, 8, [[SUBREG_TO_REG4]], %jump-table.1, $noreg :: (load (s64) from jump-table)
198+
; LIMIT-NEXT: [[SHR32ri3:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm3]], 3, implicit-def dead $eflags
199+
; LIMIT-NEXT: JMP_1 %bb.7
212200
; LIMIT-NEXT: {{ $}}
213201
; LIMIT-NEXT: bb.6.default.unreachable2:
214202
; LIMIT-NEXT: successors:
215203
; LIMIT-NEXT: {{ $}}
204+
; LIMIT-NEXT: bb.7 (%ir-block.16):
205+
; LIMIT-NEXT: successors: %bb.9(0x20000000), %bb.10(0x20000000), %bb.11(0x20000000), %bb.12(0x20000000)
206+
; LIMIT-NEXT: {{ $}}
207+
; LIMIT-NEXT: [[PHI:%[0-9]+]]:gr32 = PHI [[SHR32ri3]], %bb.5, [[SHR32ri2]], %bb.4, [[SHR32ri1]], %bb.3, [[MOV32rm]], %bb.2
208+
; LIMIT-NEXT: [[SHR32ri4:%[0-9]+]]:gr32 = SHR32ri [[COPY]], 2, implicit-def dead $eflags
209+
; LIMIT-NEXT: [[AND32ri1:%[0-9]+]]:gr32 = AND32ri [[SHR32ri4]], 7, implicit-def dead $eflags
210+
; LIMIT-NEXT: [[SUBREG_TO_REG1:%[0-9]+]]:gr64_nosp = SUBREG_TO_REG 0, killed [[AND32ri1]], %subreg.sub_32bit
211+
; LIMIT-NEXT: JMP64m $noreg, 8, [[SUBREG_TO_REG1]], %jump-table.1, $noreg :: (load (s64) from jump-table)
212+
; LIMIT-NEXT: {{ $}}
216213
; LIMIT-NEXT: bb.9 (%ir-block.20):
217214
; LIMIT-NEXT: successors: %bb.13(0x80000000)
218215
; LIMIT-NEXT: {{ $}}
219-
; LIMIT-NEXT: [[PHI:%[0-9]+]]:gr32 = PHI [[MOV32rm]], %bb.2, [[SHR32ri2]], %bb.3, [[SHR32ri4]], %bb.4, [[SHR32ri6]], %bb.5
220216
; LIMIT-NEXT: [[MOV32rm4:%[0-9]+]]:gr32 = MOV32rm [[COPY1]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.0)
221217
; LIMIT-NEXT: JMP_1 %bb.13
222218
; LIMIT-NEXT: {{ $}}
223219
; LIMIT-NEXT: bb.10 (%ir-block.22):
224220
; LIMIT-NEXT: successors: %bb.13(0x80000000)
225221
; LIMIT-NEXT: {{ $}}
226-
; LIMIT-NEXT: [[PHI1:%[0-9]+]]:gr32 = PHI [[MOV32rm]], %bb.2, [[SHR32ri2]], %bb.3, [[SHR32ri4]], %bb.4, [[SHR32ri6]], %bb.5
227222
; LIMIT-NEXT: [[MOV32rm5:%[0-9]+]]:gr32 = MOV32rm [[COPY1]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.0)
228-
; LIMIT-NEXT: [[SHR32ri8:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm5]], 1, implicit-def dead $eflags
223+
; LIMIT-NEXT: [[SHR32ri5:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm5]], 1, implicit-def dead $eflags
229224
; LIMIT-NEXT: JMP_1 %bb.13
230225
; LIMIT-NEXT: {{ $}}
231226
; LIMIT-NEXT: bb.11 (%ir-block.25):
232227
; LIMIT-NEXT: successors: %bb.13(0x80000000)
233228
; LIMIT-NEXT: {{ $}}
234-
; LIMIT-NEXT: [[PHI2:%[0-9]+]]:gr32 = PHI [[MOV32rm]], %bb.2, [[SHR32ri2]], %bb.3, [[SHR32ri4]], %bb.4, [[SHR32ri6]], %bb.5
235229
; LIMIT-NEXT: [[MOV32rm6:%[0-9]+]]:gr32 = MOV32rm [[COPY1]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.0)
236-
; LIMIT-NEXT: [[SHR32ri9:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm6]], 2, implicit-def dead $eflags
230+
; LIMIT-NEXT: [[SHR32ri6:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm6]], 2, implicit-def dead $eflags
237231
; LIMIT-NEXT: JMP_1 %bb.13
238232
; LIMIT-NEXT: {{ $}}
239233
; LIMIT-NEXT: bb.12 (%ir-block.28):
240234
; LIMIT-NEXT: successors: %bb.13(0x80000000)
241235
; LIMIT-NEXT: {{ $}}
242-
; LIMIT-NEXT: [[PHI3:%[0-9]+]]:gr32 = PHI [[MOV32rm]], %bb.2, [[SHR32ri2]], %bb.3, [[SHR32ri4]], %bb.4, [[SHR32ri6]], %bb.5
243236
; LIMIT-NEXT: [[MOV32rm7:%[0-9]+]]:gr32 = MOV32rm [[COPY1]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.0)
244-
; LIMIT-NEXT: [[SHR32ri10:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm7]], 6, implicit-def dead $eflags
237+
; LIMIT-NEXT: [[SHR32ri7:%[0-9]+]]:gr32 = SHR32ri [[MOV32rm7]], 6, implicit-def dead $eflags
245238
; LIMIT-NEXT: {{ $}}
246239
; LIMIT-NEXT: bb.13 (%ir-block.31):
247-
; LIMIT-NEXT: [[PHI4:%[0-9]+]]:gr32 = PHI [[PHI]], %bb.9, [[PHI1]], %bb.10, [[PHI2]], %bb.11, [[PHI3]], %bb.12
248-
; LIMIT-NEXT: [[PHI5:%[0-9]+]]:gr32 = PHI [[SHR32ri10]], %bb.12, [[SHR32ri9]], %bb.11, [[SHR32ri8]], %bb.10, [[MOV32rm4]], %bb.9
249-
; LIMIT-NEXT: [[OR32rr:%[0-9]+]]:gr32 = OR32rr [[PHI5]], [[PHI4]], implicit-def dead $eflags
240+
; LIMIT-NEXT: [[PHI1:%[0-9]+]]:gr32 = PHI [[SHR32ri7]], %bb.12, [[SHR32ri6]], %bb.11, [[SHR32ri5]], %bb.10, [[MOV32rm4]], %bb.9
241+
; LIMIT-NEXT: [[OR32rr:%[0-9]+]]:gr32 = OR32rr [[PHI1]], [[PHI]], implicit-def dead $eflags
250242
; LIMIT-NEXT: $eax = COPY [[OR32rr]]
251243
; LIMIT-NEXT: RET 0, $eax
252244
;

0 commit comments

Comments
 (0)