Skip to content

Commit 4ca7ba9

Browse files
committed
[AggressiveInstCombine] Inline strcmp/strncmp
* use SplitBlock rather than splitBlockBefore to avoid invalidating the Instruction iterator
1 parent d5769df commit 4ca7ba9

File tree

2 files changed

+45
-44
lines changed

2 files changed

+45
-44
lines changed

llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,33 +1038,34 @@ bool StrNCmpInliner::optimizeStrNCmp() {
10381038
/// BBCI
10391039
///
10401040
/// (after)
1041-
/// BBBefore -> BBSubs[0] (sub,icmp) --NE-> BBNE -> BBCI
1042-
/// | ^
1043-
/// E |
1044-
/// | |
1045-
/// BBSubs[1] (sub,icmp) --NE-----+
1046-
/// ... |
1047-
/// BBSubs[N-1] (sub) ---------+
1041+
/// BBCI -> BBSubs[0] (sub,icmp) --NE-> BBNE -> BBTail
1042+
/// | ^
1043+
/// E |
1044+
/// | |
1045+
/// BBSubs[1] (sub,icmp) --NE-----+
1046+
/// ... |
1047+
/// BBSubs[N-1] (sub) ---------+
10481048
///
10491049
bool StrNCmpInliner::inlineCompare(Value *LHS, StringRef RHS, uint64_t N,
10501050
bool Swapped) {
10511051
auto &Ctx = CI->getContext();
10521052
IRBuilder<> B(Ctx);
10531053

10541054
BasicBlock *BBCI = CI->getParent();
1055-
BasicBlock *BBBefore = splitBlockBefore(BBCI, CI, DTU, nullptr, nullptr,
1056-
BBCI->getName() + ".before");
1055+
BasicBlock *BBTail =
1056+
SplitBlock(BBCI, CI, DTU, nullptr, nullptr, BBCI->getName() + ".tail");
10571057

10581058
SmallVector<BasicBlock *> BBSubs;
10591059
for (uint64_t i = 0; i < N; ++i)
1060-
BBSubs.push_back(BasicBlock::Create(Ctx, "sub", BBCI->getParent(), BBCI));
1061-
BasicBlock *BBNE = BasicBlock::Create(Ctx, "ne", BBCI->getParent(), BBCI);
1060+
BBSubs.push_back(BasicBlock::Create(Ctx, "sub_" + std::to_string(i),
1061+
BBCI->getParent(), BBTail));
1062+
BasicBlock *BBNE = BasicBlock::Create(Ctx, "ne", BBCI->getParent(), BBTail);
10621063

1063-
cast<BranchInst>(BBBefore->getTerminator())->setSuccessor(0, BBSubs[0]);
1064+
cast<BranchInst>(BBCI->getTerminator())->setSuccessor(0, BBSubs[0]);
10641065

10651066
B.SetInsertPoint(BBNE);
10661067
PHINode *Phi = B.CreatePHI(CI->getType(), N);
1067-
B.CreateBr(BBCI);
1068+
B.CreateBr(BBTail);
10681069

10691070
Value *Base = LHS;
10701071
for (uint64_t i = 0; i < N; ++i) {
@@ -1089,14 +1090,14 @@ bool StrNCmpInliner::inlineCompare(Value *LHS, StringRef RHS, uint64_t N,
10891090

10901091
if (DTU) {
10911092
SmallVector<DominatorTree::UpdateType, 8> Updates;
1092-
Updates.push_back({DominatorTree::Insert, BBBefore, BBSubs[0]});
1093+
Updates.push_back({DominatorTree::Insert, BBCI, BBSubs[0]});
10931094
for (uint64_t i = 0; i < N; ++i) {
10941095
if (i < N - 1)
10951096
Updates.push_back({DominatorTree::Insert, BBSubs[i], BBSubs[i + 1]});
10961097
Updates.push_back({DominatorTree::Insert, BBSubs[i], BBNE});
10971098
}
1098-
Updates.push_back({DominatorTree::Insert, BBNE, BBCI});
1099-
Updates.push_back({DominatorTree::Delete, BBBefore, BBCI});
1099+
Updates.push_back({DominatorTree::Insert, BBNE, BBTail});
1100+
Updates.push_back({DominatorTree::Delete, BBCI, BBTail});
11001101
DTU->applyUpdates(Updates);
11011102
}
11021103
return true;

llvm/test/Transforms/AggressiveInstCombine/strncmp-1.ll

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ declare i32 @strcmp(ptr nocapture, ptr nocapture)
1212
define i1 @test_strncmp_1(ptr nocapture readonly %s) {
1313
; CHECK-LABEL: define i1 @test_strncmp_1(
1414
; CHECK-SAME: ptr nocapture readonly [[S:%.*]]) {
15-
; CHECK-NEXT: entry.before:
15+
; CHECK-NEXT: entry:
1616
; CHECK-NEXT: br label [[SUB:%.*]]
17-
; CHECK: sub:
17+
; CHECK: sub_0:
1818
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[S]], align 1
1919
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32
2020
; CHECK-NEXT: [[TMP2:%.*]] = sub i32 97, [[TMP1]]
2121
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
2222
; CHECK-NEXT: br i1 [[TMP3]], label [[NE:%.*]], label [[SUB1:%.*]]
23-
; CHECK: sub1:
23+
; CHECK: sub_1:
2424
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 1
2525
; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
2626
; CHECK-NEXT: [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
@@ -29,7 +29,7 @@ define i1 @test_strncmp_1(ptr nocapture readonly %s) {
2929
; CHECK: ne:
3030
; CHECK-NEXT: [[TMP8:%.*]] = phi i32 [ [[TMP2]], [[SUB]] ], [ [[TMP7]], [[SUB1]] ]
3131
; CHECK-NEXT: br label [[ENTRY:%.*]]
32-
; CHECK: entry:
32+
; CHECK: entry.tail:
3333
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP8]], 0
3434
; CHECK-NEXT: ret i1 [[CMP]]
3535
;
@@ -42,22 +42,22 @@ entry:
4242
define i1 @test_strncmp_2(ptr nocapture readonly %s) {
4343
; CHECK-LABEL: define i1 @test_strncmp_2(
4444
; CHECK-SAME: ptr nocapture readonly [[S:%.*]]) {
45-
; CHECK-NEXT: entry.before:
45+
; CHECK-NEXT: entry:
4646
; CHECK-NEXT: br label [[SUB:%.*]]
47-
; CHECK: sub:
47+
; CHECK: sub_0:
4848
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[S]], align 1
4949
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32
5050
; CHECK-NEXT: [[TMP2:%.*]] = sub i32 97, [[TMP1]]
5151
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
5252
; CHECK-NEXT: br i1 [[TMP3]], label [[NE:%.*]], label [[SUB1:%.*]]
53-
; CHECK: sub1:
53+
; CHECK: sub_1:
5454
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 1
5555
; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
5656
; CHECK-NEXT: [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
5757
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 98, [[TMP6]]
5858
; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
5959
; CHECK-NEXT: br i1 [[TMP8]], label [[NE]], label [[SUB2:%.*]]
60-
; CHECK: sub2:
60+
; CHECK: sub_2:
6161
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 2
6262
; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
6363
; CHECK-NEXT: [[TMP11:%.*]] = zext i8 [[TMP10]] to i32
@@ -66,7 +66,7 @@ define i1 @test_strncmp_2(ptr nocapture readonly %s) {
6666
; CHECK: ne:
6767
; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP2]], [[SUB]] ], [ [[TMP7]], [[SUB1]] ], [ [[TMP12]], [[SUB2]] ]
6868
; CHECK-NEXT: br label [[ENTRY:%.*]]
69-
; CHECK: entry:
69+
; CHECK: entry.tail:
7070
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP13]], 0
7171
; CHECK-NEXT: ret i1 [[CMP]]
7272
;
@@ -79,22 +79,22 @@ entry:
7979
define i1 @test_strncmp_3(ptr nocapture readonly %s) {
8080
; CHECK-LABEL: define i1 @test_strncmp_3(
8181
; CHECK-SAME: ptr nocapture readonly [[S:%.*]]) {
82-
; CHECK-NEXT: entry.before:
82+
; CHECK-NEXT: entry:
8383
; CHECK-NEXT: br label [[SUB:%.*]]
84-
; CHECK: sub:
84+
; CHECK: sub_0:
8585
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[S]], align 1
8686
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32
8787
; CHECK-NEXT: [[TMP2:%.*]] = sub i32 97, [[TMP1]]
8888
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
8989
; CHECK-NEXT: br i1 [[TMP3]], label [[NE:%.*]], label [[SUB1:%.*]]
90-
; CHECK: sub1:
90+
; CHECK: sub_1:
9191
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 1
9292
; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
9393
; CHECK-NEXT: [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
9494
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 98, [[TMP6]]
9595
; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
9696
; CHECK-NEXT: br i1 [[TMP8]], label [[NE]], label [[SUB2:%.*]]
97-
; CHECK: sub2:
97+
; CHECK: sub_2:
9898
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 2
9999
; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
100100
; CHECK-NEXT: [[TMP11:%.*]] = zext i8 [[TMP10]] to i32
@@ -103,7 +103,7 @@ define i1 @test_strncmp_3(ptr nocapture readonly %s) {
103103
; CHECK: ne:
104104
; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP2]], [[SUB]] ], [ [[TMP7]], [[SUB1]] ], [ [[TMP12]], [[SUB2]] ]
105105
; CHECK-NEXT: br label [[ENTRY:%.*]]
106-
; CHECK: entry:
106+
; CHECK: entry.tail:
107107
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP13]], 0
108108
; CHECK-NEXT: ret i1 [[CMP]]
109109
;
@@ -116,23 +116,23 @@ entry:
116116
define i1 @test_strcmp_1(ptr nocapture readonly %s) {
117117
; CHECK-LABEL: define i1 @test_strcmp_1(
118118
; CHECK-SAME: ptr nocapture readonly [[S:%.*]]) {
119-
; CHECK-NEXT: entry.before:
119+
; CHECK-NEXT: entry:
120120
; CHECK-NEXT: br label [[SUB:%.*]]
121-
; CHECK: sub:
121+
; CHECK: sub_0:
122122
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[S]], align 1
123123
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32
124124
; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[TMP1]], 97
125125
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
126126
; CHECK-NEXT: br i1 [[TMP3]], label [[NE:%.*]], label [[SUB1:%.*]]
127-
; CHECK: sub1:
127+
; CHECK: sub_1:
128128
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 1
129129
; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
130130
; CHECK-NEXT: [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
131131
; CHECK-NEXT: br label [[NE]]
132132
; CHECK: ne:
133133
; CHECK-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP2]], [[SUB]] ], [ [[TMP6]], [[SUB1]] ]
134134
; CHECK-NEXT: br label [[ENTRY:%.*]]
135-
; CHECK: entry:
135+
; CHECK: entry.tail:
136136
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP7]], 0
137137
; CHECK-NEXT: ret i1 [[CMP]]
138138
;
@@ -145,30 +145,30 @@ entry:
145145
define i1 @test_strcmp_2(ptr nocapture readonly %s) {
146146
; CHECK-LABEL: define i1 @test_strcmp_2(
147147
; CHECK-SAME: ptr nocapture readonly [[S:%.*]]) {
148-
; CHECK-NEXT: entry.before:
148+
; CHECK-NEXT: entry:
149149
; CHECK-NEXT: br label [[SUB:%.*]]
150-
; CHECK: sub:
150+
; CHECK: sub_0:
151151
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[S]], align 1
152152
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32
153153
; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[TMP1]], 97
154154
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
155155
; CHECK-NEXT: br i1 [[TMP3]], label [[NE:%.*]], label [[SUB1:%.*]]
156-
; CHECK: sub1:
156+
; CHECK: sub_1:
157157
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 1
158158
; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
159159
; CHECK-NEXT: [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
160160
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 [[TMP6]], 98
161161
; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
162162
; CHECK-NEXT: br i1 [[TMP8]], label [[NE]], label [[SUB2:%.*]]
163-
; CHECK: sub2:
163+
; CHECK: sub_2:
164164
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 2
165165
; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
166166
; CHECK-NEXT: [[TMP11:%.*]] = zext i8 [[TMP10]] to i32
167167
; CHECK-NEXT: br label [[NE]]
168168
; CHECK: ne:
169169
; CHECK-NEXT: [[TMP12:%.*]] = phi i32 [ [[TMP2]], [[SUB]] ], [ [[TMP7]], [[SUB1]] ], [ [[TMP11]], [[SUB2]] ]
170170
; CHECK-NEXT: br label [[ENTRY:%.*]]
171-
; CHECK: entry:
171+
; CHECK: entry.tail:
172172
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[TMP12]], 0
173173
; CHECK-NEXT: ret i1 [[CMP]]
174174
;
@@ -181,22 +181,22 @@ entry:
181181
define i1 @test_strcmp_3(ptr nocapture readonly %s) {
182182
; CHECK-LABEL: define i1 @test_strcmp_3(
183183
; CHECK-SAME: ptr nocapture readonly [[S:%.*]]) {
184-
; CHECK-NEXT: entry.before:
184+
; CHECK-NEXT: entry:
185185
; CHECK-NEXT: br label [[SUB:%.*]]
186-
; CHECK: sub:
186+
; CHECK: sub_0:
187187
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[S]], align 1
188188
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32
189189
; CHECK-NEXT: [[TMP2:%.*]] = sub i32 97, [[TMP1]]
190190
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
191191
; CHECK-NEXT: br i1 [[TMP3]], label [[NE:%.*]], label [[SUB1:%.*]]
192-
; CHECK: sub1:
192+
; CHECK: sub_1:
193193
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 1
194194
; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
195195
; CHECK-NEXT: [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
196196
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 98, [[TMP6]]
197197
; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
198198
; CHECK-NEXT: br i1 [[TMP8]], label [[NE]], label [[SUB2:%.*]]
199-
; CHECK: sub2:
199+
; CHECK: sub_2:
200200
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 2
201201
; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
202202
; CHECK-NEXT: [[TMP11:%.*]] = zext i8 [[TMP10]] to i32
@@ -205,7 +205,7 @@ define i1 @test_strcmp_3(ptr nocapture readonly %s) {
205205
; CHECK: ne:
206206
; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP2]], [[SUB]] ], [ [[TMP7]], [[SUB1]] ], [ [[TMP12]], [[SUB2]] ]
207207
; CHECK-NEXT: br label [[ENTRY:%.*]]
208-
; CHECK: entry:
208+
; CHECK: entry.tail:
209209
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP13]], 0
210210
; CHECK-NEXT: ret i1 [[CMP]]
211211
;

0 commit comments

Comments
 (0)