Skip to content

Commit 3dcbbdd

Browse files
committed
Revert "Improve and enable folding of conditional branches with tail calls."
This reverts commit c05ddc9. Fails under asan: https://lab.llvm.org/buildbot/#/builders/168/builds/11637 Failed Tests (3): LLVM :: CodeGen/X86/jump_sign.ll LLVM :: CodeGen/X86/or-branch.ll LLVM :: CodeGen/X86/tailcall-extract.ll
1 parent 157c123 commit 3dcbbdd

31 files changed

+892
-456
lines changed

llvm/lib/CodeGen/BranchFolding.cpp

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1507,39 +1507,42 @@ bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) {
15071507
}
15081508
}
15091509

1510-
if (!IsEmptyBlock(MBB)) {
1510+
bool OptForSize =
1511+
MF.getFunction().hasOptSize() ||
1512+
llvm::shouldOptimizeForSize(MBB, PSI, &MBBFreqInfo);
1513+
if (!IsEmptyBlock(MBB) && MBB->pred_size() == 1 && OptForSize) {
1514+
// Changing "Jcc foo; foo: jmp bar;" into "Jcc bar;" might change the branch
1515+
// direction, thereby defeating careful block placement and regressing
1516+
// performance. Therefore, only consider this for optsize functions.
15111517
MachineInstr &TailCall = *MBB->getFirstNonDebugInstr();
15121518
if (TII->isUnconditionalTailCall(TailCall)) {
1513-
for (auto &Pred : MBB->predecessors()) {
1514-
MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
1515-
SmallVector<MachineOperand, 4> PredCond;
1516-
bool PredAnalyzable =
1517-
!TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond, true);
1518-
1519-
// Only eliminate if MBB == TBB (Taken Basic Block)
1520-
if (PredAnalyzable && !PredCond.empty() && PredTBB == MBB &&
1521-
PredTBB != PredFBB) {
1522-
// The predecessor has a conditional branch to this block which
1523-
// consists of only a tail call. Try to fold the tail call into the
1524-
// conditional branch.
1525-
if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
1526-
// TODO: It would be nice if analyzeBranch() could provide a pointer
1527-
// to the branch instruction so replaceBranchWithTailCall() doesn't
1528-
// have to search for it.
1529-
TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
1530-
++NumTailCalls;
1531-
MadeChange = true;
1532-
Pred->removeSuccessor(MBB);
1533-
}
1519+
MachineBasicBlock *Pred = *MBB->pred_begin();
1520+
MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
1521+
SmallVector<MachineOperand, 4> PredCond;
1522+
bool PredAnalyzable =
1523+
!TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond, true);
1524+
1525+
if (PredAnalyzable && !PredCond.empty() && PredTBB == MBB &&
1526+
PredTBB != PredFBB) {
1527+
// The predecessor has a conditional branch to this block which consists
1528+
// of only a tail call. Try to fold the tail call into the conditional
1529+
// branch.
1530+
if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
1531+
// TODO: It would be nice if analyzeBranch() could provide a pointer
1532+
// to the branch instruction so replaceBranchWithTailCall() doesn't
1533+
// have to search for it.
1534+
TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
1535+
++NumTailCalls;
1536+
Pred->removeSuccessor(MBB);
1537+
MadeChange = true;
1538+
return MadeChange;
15341539
}
1535-
// If the predecessor is falling through to this block, we could reverse
1536-
// the branch condition and fold the tail call into that. However, after
1537-
// that we might have to re-arrange the CFG to fall through to the other
1538-
// block and there is a high risk of regressing code size rather than
1539-
// improving it.
15401540
}
1541-
if (MadeChange)
1542-
return MadeChange;
1541+
// If the predecessor is falling through to this block, we could reverse
1542+
// the branch condition and fold the tail call into that. However, after
1543+
// that we might have to re-arrange the CFG to fall through to the other
1544+
// block and there is a high risk of regressing code size rather than
1545+
// improving it.
15431546
}
15441547
}
15451548

llvm/test/CodeGen/X86/add.ll

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -575,15 +575,19 @@ define void @add_i32_128_flag(i32 %x) {
575575
; X64-LINUX-LABEL: add_i32_128_flag:
576576
; X64-LINUX: # %bb.0: # %entry
577577
; X64-LINUX-NEXT: subl $-128, %edi
578-
; X64-LINUX-NEXT: jne bar_i32 # TAILCALL
579-
; X64-LINUX-NEXT: # %bb.1: # %if.end
578+
; X64-LINUX-NEXT: je .LBB19_1
579+
; X64-LINUX-NEXT: # %bb.2: # %if.then
580+
; X64-LINUX-NEXT: jmp bar_i32 # TAILCALL
581+
; X64-LINUX-NEXT: .LBB19_1: # %if.end
580582
; X64-LINUX-NEXT: retq
581583
;
582584
; X64-WIN32-LABEL: add_i32_128_flag:
583585
; X64-WIN32: # %bb.0: # %entry
584586
; X64-WIN32-NEXT: subl $-128, %ecx
585-
; X64-WIN32-NEXT: jne bar_i32 # TAILCALL
586-
; X64-WIN32-NEXT: # %bb.1: # %if.end
587+
; X64-WIN32-NEXT: je .LBB19_1
588+
; X64-WIN32-NEXT: # %bb.2: # %if.then
589+
; X64-WIN32-NEXT: jmp bar_i32 # TAILCALL
590+
; X64-WIN32-NEXT: .LBB19_1: # %if.end
587591
; X64-WIN32-NEXT: retq
588592
entry:
589593
%add = add i32 %x, 128
@@ -623,15 +627,19 @@ define void @add_i64_128_flag(i64 %x) {
623627
; X64-LINUX-LABEL: add_i64_128_flag:
624628
; X64-LINUX: # %bb.0: # %entry
625629
; X64-LINUX-NEXT: subq $-128, %rdi
626-
; X64-LINUX-NEXT: jne bar_i64 # TAILCALL
627-
; X64-LINUX-NEXT: # %bb.1: # %if.end
630+
; X64-LINUX-NEXT: je .LBB20_1
631+
; X64-LINUX-NEXT: # %bb.2: # %if.then
632+
; X64-LINUX-NEXT: jmp bar_i64 # TAILCALL
633+
; X64-LINUX-NEXT: .LBB20_1: # %if.end
628634
; X64-LINUX-NEXT: retq
629635
;
630636
; X64-WIN32-LABEL: add_i64_128_flag:
631637
; X64-WIN32: # %bb.0: # %entry
632638
; X64-WIN32-NEXT: subq $-128, %rcx
633-
; X64-WIN32-NEXT: jne bar_i64 # TAILCALL
634-
; X64-WIN32-NEXT: # %bb.1: # %if.end
639+
; X64-WIN32-NEXT: je .LBB20_1
640+
; X64-WIN32-NEXT: # %bb.2: # %if.then
641+
; X64-WIN32-NEXT: jmp bar_i64 # TAILCALL
642+
; X64-WIN32-NEXT: .LBB20_1: # %if.end
635643
; X64-WIN32-NEXT: retq
636644
entry:
637645
%add = add i64 %x, 128
@@ -671,15 +679,19 @@ define void @add_i64_2147483648_flag(i64 %x) {
671679
; X64-LINUX-LABEL: add_i64_2147483648_flag:
672680
; X64-LINUX: # %bb.0: # %entry
673681
; X64-LINUX-NEXT: subq $-2147483648, %rdi # imm = 0x80000000
674-
; X64-LINUX-NEXT: jne bar_i64 # TAILCALL
675-
; X64-LINUX-NEXT: # %bb.1: # %if.end
682+
; X64-LINUX-NEXT: je .LBB21_1
683+
; X64-LINUX-NEXT: # %bb.2: # %if.then
684+
; X64-LINUX-NEXT: jmp bar_i64 # TAILCALL
685+
; X64-LINUX-NEXT: .LBB21_1: # %if.end
676686
; X64-LINUX-NEXT: retq
677687
;
678688
; X64-WIN32-LABEL: add_i64_2147483648_flag:
679689
; X64-WIN32: # %bb.0: # %entry
680690
; X64-WIN32-NEXT: subq $-2147483648, %rcx # imm = 0x80000000
681-
; X64-WIN32-NEXT: jne bar_i64 # TAILCALL
682-
; X64-WIN32-NEXT: # %bb.1: # %if.end
691+
; X64-WIN32-NEXT: je .LBB21_1
692+
; X64-WIN32-NEXT: # %bb.2: # %if.then
693+
; X64-WIN32-NEXT: jmp bar_i64 # TAILCALL
694+
; X64-WIN32-NEXT: .LBB21_1: # %if.end
683695
; X64-WIN32-NEXT: retq
684696
entry:
685697
%add = add i64 %x, 2147483648

llvm/test/CodeGen/X86/atom-pad-short-functions.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,10 @@ define void @test_call_others(i32 %x) nounwind {
8686
; CHECK-LABEL: test_call_others:
8787
; CHECK: # %bb.0:
8888
; CHECK-NEXT: cmpl $0, {{[0-9]+}}(%esp)
89-
; CHECK-NEXT: jne external_function@PLT # TAILCALL
90-
; CHECK-NEXT: # %bb.1: # %if.end
89+
; CHECK-NEXT: je .LBB6_1
90+
; CHECK-NEXT: # %bb.2: # %true.case
91+
; CHECK-NEXT: jmp external_function@PLT # TAILCALL
92+
; CHECK-NEXT: .LBB6_1: # %if.end
9193
; CHECK-NEXT: nop
9294
; CHECK-NEXT: nop
9395
; CHECK-NEXT: nop

llvm/test/CodeGen/X86/avx512-i1test.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ define i64 @func2(i1 zeroext %i, i32 %j) {
6666
; CHECK-LABEL: func2:
6767
; CHECK: # %bb.0: # %entry
6868
; CHECK-NEXT: testl %esi, %esi
69-
; CHECK-NEXT: jne bar # TAILCALL
70-
; CHECK-NEXT: # %bb.1: # %if.end
69+
; CHECK-NEXT: je .LBB1_1
70+
; CHECK-NEXT: # %bb.2: # %if.then
71+
; CHECK-NEXT: jmp bar # TAILCALL
72+
; CHECK-NEXT: .LBB1_1: # %if.end
7173
; CHECK-NEXT: movzbl %dil, %eax
7274
; CHECK-NEXT: orq $-2, %rax
7375
; CHECK-NEXT: retq

llvm/test/CodeGen/X86/bmi.ll

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,16 +1223,20 @@ define void @pr40060(i32, i32) {
12231223
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
12241224
; X86-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax
12251225
; X86-NEXT: testl %eax, %eax
1226-
; X86-NEXT: jns bar # TAILCALL
1227-
; X86-NEXT: # %bb.1:
1226+
; X86-NEXT: js .LBB52_1
1227+
; X86-NEXT: # %bb.2:
1228+
; X86-NEXT: jmp bar # TAILCALL
1229+
; X86-NEXT: .LBB52_1:
12281230
; X86-NEXT: retl
12291231
;
12301232
; X64-LABEL: pr40060:
12311233
; X64: # %bb.0:
12321234
; X64-NEXT: bextrl %esi, %edi, %eax
12331235
; X64-NEXT: testl %eax, %eax
1234-
; X64-NEXT: jns bar # TAILCALL
1235-
; X64-NEXT: # %bb.1:
1236+
; X64-NEXT: js .LBB52_1
1237+
; X64-NEXT: # %bb.2:
1238+
; X64-NEXT: jmp bar # TAILCALL
1239+
; X64-NEXT: .LBB52_1:
12361240
; X64-NEXT: retq
12371241
%3 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %0, i32 %1)
12381242
%4 = icmp sgt i32 %3, -1
@@ -1440,15 +1444,19 @@ define void @pr42118_i32(i32 %x) {
14401444
; X86-LABEL: pr42118_i32:
14411445
; X86: # %bb.0:
14421446
; X86-NEXT: blsrl {{[0-9]+}}(%esp), %eax
1443-
; X86-NEXT: je bar # TAILCALL
1444-
; X86-NEXT: # %bb.1:
1447+
; X86-NEXT: jne .LBB57_1
1448+
; X86-NEXT: # %bb.2:
1449+
; X86-NEXT: jmp bar # TAILCALL
1450+
; X86-NEXT: .LBB57_1:
14451451
; X86-NEXT: retl
14461452
;
14471453
; X64-LABEL: pr42118_i32:
14481454
; X64: # %bb.0:
14491455
; X64-NEXT: blsrl %edi, %eax
1450-
; X64-NEXT: je bar # TAILCALL
1451-
; X64-NEXT: # %bb.1:
1456+
; X64-NEXT: jne .LBB57_1
1457+
; X64-NEXT: # %bb.2:
1458+
; X64-NEXT: jmp bar # TAILCALL
1459+
; X64-NEXT: .LBB57_1:
14521460
; X64-NEXT: retq
14531461
%tmp = sub i32 0, %x
14541462
%tmp1 = and i32 %tmp, %x
@@ -1490,8 +1498,10 @@ define void @pr42118_i64(i64 %x) {
14901498
; X64-LABEL: pr42118_i64:
14911499
; X64: # %bb.0:
14921500
; X64-NEXT: blsrq %rdi, %rax
1493-
; X64-NEXT: je bar # TAILCALL
1494-
; X64-NEXT: # %bb.1:
1501+
; X64-NEXT: jne .LBB58_1
1502+
; X64-NEXT: # %bb.2:
1503+
; X64-NEXT: jmp bar # TAILCALL
1504+
; X64-NEXT: .LBB58_1:
14951505
; X64-NEXT: retq
14961506
%tmp = sub i64 0, %x
14971507
%tmp1 = and i64 %tmp, %x

llvm/test/CodeGen/X86/brcond.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ define i32 @test1(i32 %a, i32 %b) nounwind ssp {
99
; CHECK-NEXT: movzbl {{[0-9]+}}(%esp), %eax
1010
; CHECK-NEXT: xorb {{[0-9]+}}(%esp), %al
1111
; CHECK-NEXT: testb $64, %al
12-
; CHECK-NEXT: jne _bar ## TAILCALL
13-
; CHECK-NEXT: ## %bb.1: ## %bb
12+
; CHECK-NEXT: je LBB0_1
13+
; CHECK-NEXT: ## %bb.2: ## %bb1
14+
; CHECK-NEXT: jmp _bar ## TAILCALL
15+
; CHECK-NEXT: LBB0_1: ## %bb
1416
; CHECK-NEXT: jmp _foo ## TAILCALL
1517
entry:
1618
%0 = and i32 %a, 16384

llvm/test/CodeGen/X86/btq.ll

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ define void @test1(i64 %foo) nounwind {
77
; CHECK-LABEL: test1:
88
; CHECK: # %bb.0:
99
; CHECK-NEXT: btq $32, %rdi
10-
; CHECK-NEXT: jb bar # TAILCALL
10+
; CHECK-NEXT: jb .LBB0_2
1111
; CHECK-NEXT: # %bb.1: # %if.end
1212
; CHECK-NEXT: retq
13+
; CHECK-NEXT: .LBB0_2: # %if.then
14+
; CHECK-NEXT: jmp bar # TAILCALL
1315
%and = and i64 %foo, 4294967296
1416
%tobool = icmp eq i64 %and, 0
1517
br i1 %tobool, label %if.end, label %if.then
@@ -26,9 +28,11 @@ define void @test2(i64 %foo) nounwind {
2628
; CHECK-LABEL: test2:
2729
; CHECK: # %bb.0:
2830
; CHECK-NEXT: testl %edi, %edi
29-
; CHECK-NEXT: js bar # TAILCALL
31+
; CHECK-NEXT: js .LBB1_2
3032
; CHECK-NEXT: # %bb.1: # %if.end
3133
; CHECK-NEXT: retq
34+
; CHECK-NEXT: .LBB1_2: # %if.then
35+
; CHECK-NEXT: jmp bar # TAILCALL
3236
%and = and i64 %foo, 2147483648
3337
%tobool = icmp eq i64 %and, 0
3438
br i1 %tobool, label %if.end, label %if.then

llvm/test/CodeGen/X86/cmp-merge.ll

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,27 @@ define void @eq_first(i32 %0, i32 %1) {
1515
; X86: # %bb.0:
1616
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1717
; X86-NEXT: cmpl %eax, {{[0-9]+}}(%esp)
18-
; X86-NEXT: jl on_less@PLT # TAILCALL
19-
; X86-NEXT: # %bb.1:
20-
; X86-NEXT: je on_equal@PLT # TAILCALL
21-
; X86-NEXT: # %bb.2:
18+
; X86-NEXT: jge .LBB0_1
19+
; X86-NEXT: # %bb.3:
20+
; X86-NEXT: jmp on_less@PLT # TAILCALL
21+
; X86-NEXT: .LBB0_1:
22+
; X86-NEXT: jne .LBB0_2
23+
; X86-NEXT: # %bb.4:
24+
; X86-NEXT: jmp on_equal@PLT # TAILCALL
25+
; X86-NEXT: .LBB0_2:
2226
; X86-NEXT: jmp on_greater@PLT # TAILCALL
2327
;
2428
; X64-LABEL: eq_first:
2529
; X64: # %bb.0:
2630
; X64-NEXT: cmpl %esi, %edi
27-
; X64-NEXT: jl on_less@PLT # TAILCALL
28-
; X64-NEXT: # %bb.1:
29-
; X64-NEXT: je on_equal@PLT # TAILCALL
30-
; X64-NEXT: # %bb.2:
31+
; X64-NEXT: jge .LBB0_1
32+
; X64-NEXT: # %bb.3:
33+
; X64-NEXT: jmp on_less@PLT # TAILCALL
34+
; X64-NEXT: .LBB0_1:
35+
; X64-NEXT: jne .LBB0_2
36+
; X64-NEXT: # %bb.4:
37+
; X64-NEXT: jmp on_equal@PLT # TAILCALL
38+
; X64-NEXT: .LBB0_2:
3139
; X64-NEXT: jmp on_greater@PLT # TAILCALL
3240
%3 = icmp slt i32 %0, %1
3341
br i1 %3, label %4, label %5
@@ -53,19 +61,27 @@ define void @gt_first(i32 %0, i32 %1) {
5361
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
5462
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
5563
; X86-NEXT: cmpl %eax, %ecx
56-
; X86-NEXT: jl on_less@PLT # TAILCALL
57-
; X86-NEXT: # %bb.1:
58-
; X86-NEXT: jg on_greater@PLT # TAILCALL
59-
; X86-NEXT: # %bb.2:
64+
; X86-NEXT: jge .LBB1_1
65+
; X86-NEXT: # %bb.3:
66+
; X86-NEXT: jmp on_less@PLT # TAILCALL
67+
; X86-NEXT: .LBB1_1:
68+
; X86-NEXT: jle .LBB1_2
69+
; X86-NEXT: # %bb.4:
70+
; X86-NEXT: jmp on_greater@PLT # TAILCALL
71+
; X86-NEXT: .LBB1_2:
6072
; X86-NEXT: jmp on_equal@PLT # TAILCALL
6173
;
6274
; X64-LABEL: gt_first:
6375
; X64: # %bb.0:
6476
; X64-NEXT: cmpl %esi, %edi
65-
; X64-NEXT: jl on_less@PLT # TAILCALL
66-
; X64-NEXT: # %bb.1:
67-
; X64-NEXT: jg on_greater@PLT # TAILCALL
68-
; X64-NEXT: # %bb.2:
77+
; X64-NEXT: jge .LBB1_1
78+
; X64-NEXT: # %bb.3:
79+
; X64-NEXT: jmp on_less@PLT # TAILCALL
80+
; X64-NEXT: .LBB1_1:
81+
; X64-NEXT: jle .LBB1_2
82+
; X64-NEXT: # %bb.4:
83+
; X64-NEXT: jmp on_greater@PLT # TAILCALL
84+
; X64-NEXT: .LBB1_2:
6985
; X64-NEXT: jmp on_equal@PLT # TAILCALL
7086
%3 = icmp slt i32 %0, %1
7187
br i1 %3, label %4, label %5

llvm/test/CodeGen/X86/cmp.ll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -729,13 +729,16 @@ define i32 @pr42189(i16 signext %c) {
729729
; CHECK: # %bb.0: # %entry
730730
; CHECK-NEXT: cmpl $32767, %edi # encoding: [0x81,0xff,0xff,0x7f,0x00,0x00]
731731
; CHECK-NEXT: # imm = 0x7FFF
732-
; CHECK-NEXT: jne f@PLT # TAILCALL
733-
; CHECK-NEXT: # encoding: [0x75,A]
734-
; CHECK-NEXT: # fixup A - offset: 1, value: f@PLT-1, kind: FK_PCRel_1
732+
; CHECK-NEXT: jne .LBB45_2 # encoding: [0x75,A]
733+
; CHECK-NEXT: # fixup A - offset: 1, value: .LBB45_2-1, kind: FK_PCRel_1
735734
; CHECK-NEXT: # %bb.1: # %if.then
736735
; CHECK-NEXT: jmp g@PLT # TAILCALL
737736
; CHECK-NEXT: # encoding: [0xeb,A]
738737
; CHECK-NEXT: # fixup A - offset: 1, value: g@PLT-1, kind: FK_PCRel_1
738+
; CHECK-NEXT: .LBB45_2: # %if.end
739+
; CHECK-NEXT: jmp f@PLT # TAILCALL
740+
; CHECK-NEXT: # encoding: [0xeb,A]
741+
; CHECK-NEXT: # fixup A - offset: 1, value: f@PLT-1, kind: FK_PCRel_1
739742
entry:
740743
%cmp = icmp eq i16 %c, 32767
741744
br i1 %cmp, label %if.then, label %if.end

0 commit comments

Comments
 (0)