[PATCH] D109354: [LoopBoundSplit] Check the start value of split cond AddRec
JinGu Kang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 8 04:15:35 PDT 2021
jaykang10 updated this revision to Diff 371313.
jaykang10 retitled this revision from "[LoopBoundSplit] Check the split condition with its AddRec start value" to "[LoopBoundSplit] Check the start value of split cond AddRec".
jaykang10 edited the summary of this revision.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D109354/new/
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
===================================================================
--- llvm/test/Transforms/LoopBoundSplit/bug51766.ll
+++ llvm/test/Transforms/LoopBoundSplit/bug51766.ll
@@ -7,16 +7,13 @@
define i16 @main(i16 %qqq) {
; CHECK-LABEL: @main(
; CHECK-NEXT: entry:
-; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]]
-; CHECK: entry.split:
-; CHECK-NEXT: [[NEW_BOUND:%.*]] = call i16 @llvm.umin.i16(i16 [[QQQ:%.*]], i16 2)
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: for.body:
-; CHECK-NEXT: [[T0:%.*]] = phi i16 [ 0, [[ENTRY_SPLIT]] ], [ [[T8:%.*]], [[CONT19:%.*]] ]
+; 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: [[T2:%.*]] = add i16 [[T1]], [[QQQ:%.*]]
; CHECK-NEXT: [[DOTNOT9:%.*]] = icmp ult i16 [[T2]], [[QQQ]]
-; CHECK-NEXT: br i1 true, label [[HANDLER_POINTER_OVERFLOW:%.*]], label [[CONT15_CRITEDGE:%.*]]
+; 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]]
@@ -24,31 +21,8 @@
; CHECK-NEXT: br label [[CONT19]]
; CHECK: cont19:
; CHECK-NEXT: [[T8]] = add nuw nsw i16 [[T0]], 1
-; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i16 [[T8]], [[NEW_BOUND]]
-; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[ENTRY_SPLIT_SPLIT:%.*]], label [[FOR_BODY]]
-; CHECK: entry.split.split:
-; CHECK-NEXT: [[T8_LCSSA:%.*]] = phi i16 [ [[T8]], [[CONT19]] ]
-; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i16 [[T8_LCSSA]], 3
-; CHECK-NEXT: br i1 [[TMP0]], label [[FOR_BODY_SPLIT_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
-; CHECK: for.body.split.preheader:
-; CHECK-NEXT: br label [[FOR_BODY_SPLIT:%.*]]
-; CHECK: for.body.split:
-; CHECK-NEXT: [[T0_SPLIT:%.*]] = phi i16 [ [[T8_SPLIT:%.*]], [[CONT19_SPLIT:%.*]] ], [ [[NEW_BOUND]], [[FOR_BODY_SPLIT_PREHEADER]] ]
-; CHECK-NEXT: [[T1_SPLIT:%.*]] = shl nuw nsw i16 [[T0_SPLIT]], 1
-; CHECK-NEXT: [[T2_SPLIT:%.*]] = add i16 [[T1_SPLIT]], [[QQQ]]
-; CHECK-NEXT: [[DOTNOT9_SPLIT:%.*]] = icmp ult i16 [[T2_SPLIT]], [[QQQ]]
-; CHECK-NEXT: br i1 false, label [[HANDLER_POINTER_OVERFLOW_SPLIT:%.*]], label [[CONT15_CRITEDGE_SPLIT:%.*]]
-; CHECK: cont15.critedge.split:
-; CHECK-NEXT: br label [[CONT19_SPLIT]]
-; CHECK: handler.pointer_overflow.split:
-; CHECK-NEXT: call void @__ubsan_handle_pointer_overflow()
-; CHECK-NEXT: br label [[CONT19_SPLIT]]
-; CHECK: cont19.split:
-; CHECK-NEXT: [[T8_SPLIT]] = add nuw nsw i16 [[T0_SPLIT]], 1
-; CHECK-NEXT: [[EXITCOND_NOT_SPLIT:%.*]] = icmp eq i16 [[T8_SPLIT]], 3
-; CHECK-NEXT: br i1 [[EXITCOND_NOT_SPLIT]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY_SPLIT]]
-; CHECK: for.cond.cleanup.loopexit:
-; CHECK-NEXT: br label [[FOR_COND_CLEANUP]]
+; 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
;
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;
+ // After transformation, we assume the split condition of the pre-loop is
+ // always true. In order to guarantee it, we need to check the start value
+ // of the split cond AddRec is less than the exiting cond one.
+ const SCEV *SplitAddRecStartSCEV =
+ cast<SCEVAddRecExpr>(SplitCandidateCond.AddRecSCEV)->getStart();
+ const SCEV *ExitingAddRecStartSCEV =
+ cast<SCEVAddRecExpr>(ExitingCond.AddRecSCEV)->getStart();
+ if (!SE.isKnownPredicate(ICmpInst::ICMP_ULE, SplitAddRecStartSCEV,
+ ExitingAddRecStartSCEV))
+ continue;
+
SplitCandidateCond.BI = BI;
return BI;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109354.371313.patch
Type: text/x-patch
Size: 4279 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210908/3cabd048/attachment.bin>
More information about the llvm-commits
mailing list