Backout must-exit based parts of 3fc9882e
, and 412eb0
Not sure these are correct. I think I missed a case when porting this from the original SCEV change to the IndVar changes. I may end up reapplying this later with a comment about how this is correct, but in case the current bad feeling turns out to be true, I'm removing from tree while investigating further.
This commit is contained in:
parent
f9e6be5cc1
commit
d4708fa480
|
@ -1461,27 +1461,6 @@ bool IndVarSimplify::canonicalizeExitCondition(Loop *L) {
|
|||
// have not changed exit counts, or the values produced by the compare.
|
||||
continue;
|
||||
}
|
||||
|
||||
// If we have a loop which would be undefined if infinite, and it has at
|
||||
// most one possible dynamic exit, then we can conclude that exit must
|
||||
// be taken. If that exit must be taken, and we know the LHS can only
|
||||
// take values in the positive domain, then we can conclude RHS must
|
||||
// also be in that same range, and replace a signed compare with an
|
||||
// unsigned one.
|
||||
// If the exit might not be taken in a well defined program.
|
||||
if (ExitingBlocks.size() == 1 && SE->loopHasNoAbnormalExits(L) &&
|
||||
SE->loopIsFiniteByAssumption(L)) {
|
||||
// We have now matched icmp signed-cond zext(X), zext(Y'), and can thus
|
||||
// replace the signed condition with the unsigned version.
|
||||
ICmp->setPredicate(ICmp->getUnsignedPredicate());
|
||||
Changed = true;
|
||||
|
||||
// Given we've changed exit counts, notify SCEV.
|
||||
// Some nested loops may share same folded exit basic block,
|
||||
// thus we need to notify top most loop.
|
||||
SE->forgetTopmostLoop(L);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Now that we've canonicalized the condition to match the extend,
|
||||
|
@ -1542,22 +1521,6 @@ bool IndVarSimplify::canonicalizeExitCondition(Loop *L) {
|
|||
// previously visible.
|
||||
continue;
|
||||
}
|
||||
|
||||
// If we have a loop which would be undefined if infinite, and it has at
|
||||
// most one possible dynamic exit, then we can conclude that exit must
|
||||
// be taken. If that exit must be taken, and we know the LHS can only
|
||||
// take values in the positive domain, then we can conclude RHS must
|
||||
// also be in that same range.
|
||||
if (ExitingBlocks.size() == 1 && SE->loopHasNoAbnormalExits(L) &&
|
||||
SE->loopIsFiniteByAssumption(L)) {
|
||||
doRotateTransform();
|
||||
Changed = true;
|
||||
// Given we've changed exit counts, notify SCEV.
|
||||
// Some nested loops may share same folded exit basic block,
|
||||
// thus we need to notify top most loop.
|
||||
SE->forgetTopmostLoop(L);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return Changed;
|
||||
|
|
|
@ -100,14 +100,13 @@ for.end: ; preds = %for.body, %entry
|
|||
define void @slt_non_constant_rhs(i16 %n) mustprogress {
|
||||
; CHECK-LABEL: @slt_non_constant_rhs(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = trunc i16 [[N:%.*]] to i8
|
||||
; CHECK-NEXT: [[UMAX:%.*]] = call i8 @llvm.umax.i8(i8 [[TMP0]], i8 1)
|
||||
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
|
||||
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i8 [[IV_NEXT]], [[UMAX]]
|
||||
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[ZEXT]], [[N:%.*]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK: for.end:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
|
@ -444,12 +443,12 @@ for.end: ; preds = %for.body, %entry
|
|||
define void @sgt_non_constant_rhs(i16 %n) mustprogress {
|
||||
; CHECK-LABEL: @sgt_non_constant_rhs(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = trunc i16 [[N:%.*]] to i8
|
||||
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[IV_NEXT]], [[TMP0]]
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i16 [[ZEXT]], [[N:%.*]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK: for.end:
|
||||
; CHECK-NEXT: ret void
|
||||
|
@ -498,12 +497,12 @@ for.end: ; preds = %for.body, %entry
|
|||
define void @sle_non_constant_rhs(i16 %n) mustprogress {
|
||||
; CHECK-LABEL: @sle_non_constant_rhs(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = trunc i16 [[N:%.*]] to i8
|
||||
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[IV_NEXT]], [[TMP0]]
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i16 [[ZEXT]], [[N:%.*]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK: for.end:
|
||||
; CHECK-NEXT: ret void
|
||||
|
@ -552,12 +551,12 @@ for.end: ; preds = %for.body, %entry
|
|||
define void @sge_non_constant_rhs(i16 %n) mustprogress {
|
||||
; CHECK-LABEL: @sge_non_constant_rhs(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = trunc i16 [[N:%.*]] to i8
|
||||
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[IV_NEXT]], [[TMP0]]
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i16 [[ZEXT]], [[N:%.*]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK: for.end:
|
||||
; CHECK-NEXT: ret void
|
||||
|
@ -606,14 +605,13 @@ for.end: ; preds = %for.body, %entry
|
|||
define void @ult_non_constant_rhs(i16 %n) mustprogress {
|
||||
; CHECK-LABEL: @ult_non_constant_rhs(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = trunc i16 [[N:%.*]] to i8
|
||||
; CHECK-NEXT: [[UMAX:%.*]] = call i8 @llvm.umax.i8(i8 [[TMP0]], i8 1)
|
||||
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
|
||||
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i8 [[IV_NEXT]], [[UMAX]]
|
||||
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[ZEXT]], [[N:%.*]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK: for.end:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
|
@ -658,15 +656,42 @@ for.end: ; preds = %for.body, %entry
|
|||
ret void
|
||||
}
|
||||
|
||||
define void @ugt_neg_non_loop(i16 %n.raw, i8 %start) mustprogress {
|
||||
; CHECK-LABEL: @ugt_neg_non_loop(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[START:%.*]], [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i16 [[ZEXT]], -2
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK: for.end:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
entry:
|
||||
br label %for.body
|
||||
|
||||
for.body: ; preds = %entry, %for.body
|
||||
%iv = phi i8 [ %iv.next, %for.body ], [ %start, %entry ]
|
||||
%iv.next = add i8 %iv, 1
|
||||
%zext = zext i8 %iv.next to i16
|
||||
%cmp = icmp ugt i16 %zext, -2
|
||||
br i1 %cmp, label %for.body, label %for.end
|
||||
|
||||
for.end: ; preds = %for.body, %entry
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @ugt_non_constant_rhs(i16 %n) mustprogress {
|
||||
; CHECK-LABEL: @ugt_non_constant_rhs(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = trunc i16 [[N:%.*]] to i8
|
||||
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[IV_NEXT]], [[TMP0]]
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i16 [[ZEXT]], [[N:%.*]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK: for.end:
|
||||
; CHECK-NEXT: ret void
|
||||
|
@ -715,12 +740,12 @@ for.end: ; preds = %for.body, %entry
|
|||
define void @ule_non_constant_rhs(i16 %n) mustprogress {
|
||||
; CHECK-LABEL: @ule_non_constant_rhs(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = trunc i16 [[N:%.*]] to i8
|
||||
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[IV_NEXT]], [[TMP0]]
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i16 [[ZEXT]], [[N:%.*]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK: for.end:
|
||||
; CHECK-NEXT: ret void
|
||||
|
@ -769,12 +794,12 @@ for.end: ; preds = %for.body, %entry
|
|||
define void @uge_non_constant_rhs(i16 %n) mustprogress {
|
||||
; CHECK-LABEL: @uge_non_constant_rhs(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = trunc i16 [[N:%.*]] to i8
|
||||
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[IV_NEXT]], [[TMP0]]
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i16 [[ZEXT]], [[N:%.*]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
|
||||
; CHECK: for.end:
|
||||
; CHECK-NEXT: ret void
|
||||
|
|
Loading…
Reference in New Issue