[PATCH] D109354: [LoopBoundSplit] Check the split condition with its AddRec start value
JinGu Kang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 7 05:00:12 PDT 2021
jaykang10 created this revision.
jaykang10 added reviewers: reames, mkazantsev, bjope.
Herald added a subscriber: hiraditya.
jaykang10 requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
The split condition should be true with the start value because the first iteration is always executed in pre-loop and we assume the split condition is always true in pre-loop.
It is related to https://bugs.llvm.org/show_bug.cgi?id=51766
https://reviews.llvm.org/D109354
Files:
llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp
llvm/test/Transforms/LoopBoundSplit/bug51766.ll
Index: llvm/test/Transforms/LoopBoundSplit/bug51766.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/LoopBoundSplit/bug51766.ll
@@ -0,0 +1,55 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -passes=loop-bound-split -S < %s | FileCheck %s
+
+; LoopBoundSplit pass should fail to split this test's loop because the split
+; condition is false in first iteration of the loop.
+
+define i16 @main(i16 %qqq) {
+; CHECK-LABEL: @main(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[FOR_BODY:%.*]]
+; CHECK: for.body:
+; CHECK-NEXT: [[T0:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[T8:%.*]], [[CONT19:%.*]] ]
+; CHECK-NEXT: [[T1:%.*]] = shl nuw nsw i16 [[T0]], 1
+; CHECK-NEXT: [[T2:%.*]] = add i16 [[T1]], [[QQQ:%.*]]
+; CHECK-NEXT: [[DOTNOT9:%.*]] = icmp ult i16 [[T2]], [[QQQ]]
+; CHECK-NEXT: br i1 [[DOTNOT9]], label [[HANDLER_POINTER_OVERFLOW:%.*]], label [[CONT15_CRITEDGE:%.*]]
+; CHECK: handler.pointer_overflow:
+; CHECK-NEXT: call void @__ubsan_handle_pointer_overflow()
+; CHECK-NEXT: br label [[CONT19]]
+; CHECK: cont15.critedge:
+; CHECK-NEXT: br label [[CONT19]]
+; CHECK: cont19:
+; CHECK-NEXT: [[T8]] = add nuw nsw i16 [[T0]], 1
+; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i16 [[T8]], 3
+; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
+; CHECK: for.cond.cleanup:
+; CHECK-NEXT: ret i16 0
+;
+entry:
+ br label %for.body
+
+for.body:
+ %t0 = phi i16 [ 0, %entry ], [ %t8, %cont19 ]
+ %t1 = shl nuw nsw i16 %t0, 1
+ %t2 = add i16 %t1, %qqq
+ %.not9 = icmp ult i16 %t2, %qqq
+ br i1 %.not9, label %handler.pointer_overflow, label %cont15.critedge
+
+handler.pointer_overflow:
+ call void @__ubsan_handle_pointer_overflow()
+ br label %cont19
+
+cont15.critedge:
+ br label %cont19
+
+cont19:
+ %t8 = add nuw nsw i16 %t0, 1
+ %exitcond.not = icmp eq i16 %t8, 3
+ br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
+
+for.cond.cleanup:
+ ret i16 0
+}
+
+declare dso_local void @__ubsan_handle_pointer_overflow()
Index: llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp
+++ llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp
@@ -265,6 +265,17 @@
SplitCandidateCond.BoundSCEV->getType())
continue;
+ // Check SplitCandidateCond's condition with its AddRec start value. The
+ // split cond should be true with the start value because the first
+ // iteration is always executed in pre-loop and we assmue the split
+ // condition is always true in pre-loop.
+ const SCEV *SplitAddRecStartSCEV =
+ dyn_cast<SCEVAddRecExpr>(SplitCandidateCond.AddRecSCEV)->getStart();
+ if (SE.isKnownPredicate(
+ ICmpInst::getInversePredicate(SplitCandidateCond.Pred),
+ SplitAddRecStartSCEV, SplitCandidateCond.BoundSCEV))
+ continue;
+
SplitCandidateCond.BI = BI;
return BI;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109354.371041.patch
Type: text/x-patch
Size: 3094 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210907/3f27f3f5/attachment.bin>
More information about the llvm-commits
mailing list