Skip to content

Commit 2abc273

Browse files
committed
[llvm][dfa-jump-threading] Add option to allow DFAJumpThreading when
optimizing for size Pull Request: llvm#83049
1 parent fed4f00 commit 2abc273

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed

llvm/lib/Passes/PassBuilderPipelines.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@ static cl::opt<bool>
222222
EnableDFAJumpThreading("enable-dfa-jump-thread",
223223
cl::desc("Enable DFA jump threading"),
224224
cl::init(false), cl::Hidden);
225+
static cl::opt<bool>
226+
OptSizeDFAJumpThreading("optsize-dfa-jump-thread",
227+
cl::desc("Enable DFA jump threading when optimizing for size"),
228+
cl::init(false), cl::Hidden);
229+
225230

226231
// TODO: turn on and remove flag
227232
static cl::opt<bool> EnablePGOForceFunctionAttrs(
@@ -717,7 +722,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
717722

718723
// Re-consider control flow based optimizations after redundancy elimination,
719724
// redo DCE, etc.
720-
if (EnableDFAJumpThreading && Level.getSizeLevel() == 0)
725+
if (EnableDFAJumpThreading &&
726+
((Level.getSizeLevel() == 0) || OptSizeDFAJumpThreading))
721727
FPM.addPass(DFAJumpThreadingPass());
722728

723729
FPM.addPass(JumpThreadingPass());

llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ static cl::opt<unsigned>
110110
cl::desc("Maximum cost accepted for the transformation"),
111111
cl::Hidden, cl::init(50));
112112

113+
static cl::opt<bool>
114+
IgnoreOptSize("dfa-jump-ignore-optsize",
115+
cl::desc("Enable dfa jump threading, even when optimizing for size"),
116+
cl::Hidden, cl::init(false));
117+
118+
113119
namespace {
114120

115121
class SelectInstToUnfold {
@@ -1244,7 +1250,7 @@ struct TransformDFA {
12441250
bool DFAJumpThreading::run(Function &F) {
12451251
LLVM_DEBUG(dbgs() << "\nDFA Jump threading: " << F.getName() << "\n");
12461252

1247-
if (F.hasOptSize()) {
1253+
if (!IgnoreOptSize && F.hasOptSize()) {
12481254
LLVM_DEBUG(dbgs() << "Skipping due to the 'minsize' attribute\n");
12491255
return false;
12501256
}

llvm/test/Transforms/DFAJumpThreading/negative.ll

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
; RUN: opt -passes=dfa-jump-threading -dfa-cost-threshold=25 -pass-remarks-missed='dfa-jump-threading' -pass-remarks-output=%t -disable-output %s
22
; RUN: FileCheck --input-file %t --check-prefix=REMARK %s
33
; RUN: opt -S -passes=dfa-jump-threading %s | FileCheck %s
4+
; RUN: opt -S -passes=dfa-jump-threading -dfa-jump-ignore-optsize %s | FileCheck %s --check-prefix=IGNORESIZE
45

56
; This negative test case checks that the optimization doesn't trigger
67
; when the code size cost is too high.
@@ -186,6 +187,53 @@ define i32 @negative5(i32 %num) minsize {
186187
; CHECK: for.end:
187188
; CHECK-NEXT: ret i32 0
188189
;
190+
; IGNORESIZE-LABEL: define i32 @negative5(
191+
; IGNORESIZE-NEXT: entry:
192+
; IGNORESIZE-NEXT: br label [[FOR_BODY:%.*]]
193+
; IGNORESIZE: for.body:
194+
; IGNORESIZE-NEXT: [[COUNT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_INC:%.*]] ]
195+
; IGNORESIZE-NEXT: [[STATE:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ poison, [[FOR_INC]] ]
196+
; IGNORESIZE-NEXT: switch i32 [[STATE]], label [[FOR_INC_JT1:%.*]] [
197+
; IGNORESIZE-NEXT: i32 1, label [[CASE1:%.*]]
198+
; IGNORESIZE-NEXT: i32 2, label [[CASE2:%.*]]
199+
; IGNORESIZE-NEXT: ]
200+
; IGNORESIZE: for.body.jt2:
201+
; IGNORESIZE-NEXT: [[COUNT_JT2:%.*]] = phi i32 [ [[INC_JT2:%.*]], [[FOR_INC_JT2:%.*]] ]
202+
; IGNORESIZE-NEXT: [[STATE_JT2:%.*]] = phi i32 [ [[STATE_NEXT_JT2:%.*]], [[FOR_INC_JT2]] ]
203+
; IGNORESIZE-NEXT: br label [[CASE2]]
204+
; IGNORESIZE: for.body.jt1:
205+
; IGNORESIZE-NEXT: [[COUNT_JT1:%.*]] = phi i32 [ [[INC_JT1:%.*]], [[FOR_INC_JT1]] ]
206+
; IGNORESIZE-NEXT: [[STATE_JT1:%.*]] = phi i32 [ [[STATE_NEXT_JT1:%.*]], [[FOR_INC_JT1]] ]
207+
; IGNORESIZE-NEXT: br label [[CASE1]]
208+
; IGNORESIZE: case1:
209+
; IGNORESIZE-NEXT: [[COUNT2:%.*]] = phi i32 [ [[COUNT_JT1]], [[FOR_BODY_JT1:%.*]] ], [ [[COUNT]], [[FOR_BODY]] ]
210+
; IGNORESIZE-NEXT: br label [[FOR_INC_JT2]]
211+
; IGNORESIZE: case2:
212+
; IGNORESIZE-NEXT: [[COUNT1:%.*]] = phi i32 [ [[COUNT_JT2]], [[FOR_BODY_JT2:%.*]] ], [ [[COUNT]], [[FOR_BODY]] ]
213+
; IGNORESIZE-NEXT: [[CMP:%.*]] = icmp eq i32 [[COUNT1]], 50
214+
; IGNORESIZE-NEXT: br i1 [[CMP]], label [[FOR_INC_JT1]], label [[SI_UNFOLD_FALSE:%.*]]
215+
; IGNORESIZE: si.unfold.false:
216+
; IGNORESIZE-NEXT: br label [[FOR_INC_JT2]]
217+
; IGNORESIZE: for.inc:
218+
; IGNORESIZE-NEXT: [[INC]] = add nsw i32 undef, 1
219+
; IGNORESIZE-NEXT: [[CMP_EXIT:%.*]] = icmp slt i32 [[INC]], [[NUM]]
220+
; IGNORESIZE-NEXT: br i1 [[CMP_EXIT]], label [[FOR_BODY]], label [[FOR_END:%.*]]
221+
; IGNORESIZE: for.inc.jt2:
222+
; IGNORESIZE-NEXT: [[COUNT4:%.*]] = phi i32 [ [[COUNT1]], [[SI_UNFOLD_FALSE]] ], [ [[COUNT2]], [[CASE1]] ]
223+
; IGNORESIZE-NEXT: [[STATE_NEXT_JT2]] = phi i32 [ 2, [[CASE1]] ], [ 2, [[SI_UNFOLD_FALSE]] ]
224+
; IGNORESIZE-NEXT: [[INC_JT2]] = add nsw i32 [[COUNT4]], 1
225+
; IGNORESIZE-NEXT: [[CMP_EXIT_JT2:%.*]] = icmp slt i32 [[INC_JT2]], [[NUM]]
226+
; IGNORESIZE-NEXT: br i1 [[CMP_EXIT_JT2]], label [[FOR_BODY_JT2]], label [[FOR_END]]
227+
; IGNORESIZE: for.inc.jt1:
228+
; IGNORESIZE-NEXT: [[COUNT3:%.*]] = phi i32 [ [[COUNT1]], [[CASE2]] ], [ [[COUNT]], [[FOR_BODY]] ]
229+
; IGNORESIZE-NEXT: [[STATE_NEXT_JT1]] = phi i32 [ 1, [[CASE2]] ], [ 1, [[FOR_BODY]] ]
230+
; IGNORESIZE-NEXT: [[INC_JT1]] = add nsw i32 [[COUNT3]], 1
231+
; IGNORESIZE-NEXT: [[CMP_EXIT_JT1:%.*]] = icmp slt i32 [[INC_JT1]], [[NUM]]
232+
; IGNORESIZE-NEXT: br i1 [[CMP_EXIT_JT1]], label [[FOR_BODY_JT1]], label [[FOR_END]]
233+
; IGNORESIZE: for.end:
234+
; IGNORESIZE-NEXT: ret i32 0
235+
;
236+
189237
entry:
190238
br label %for.body
191239

0 commit comments

Comments
 (0)