[CodeGenPrepare] Make sure that AddOffset
is also a loop invariant (#150625)
Closes https://github.com/llvm/llvm-project/issues/150611. (cherry picked from commit 2d0ca09305fcece75e2c501f1ec74aa6eada69a0)
This commit is contained in:
parent
9ebb0abb02
commit
8c7cf7c06d
@ -2096,6 +2096,10 @@ static bool isRemOfLoopIncrementWithLoopInvariant(
|
||||
if (!L->isLoopInvariant(RemAmt))
|
||||
return false;
|
||||
|
||||
// Only works if the AddOffset is a loop invaraint
|
||||
if (AddOffset && !L->isLoopInvariant(AddOffset))
|
||||
return false;
|
||||
|
||||
// Is the PHI a loop increment?
|
||||
auto LoopIncrInfo = getIVIncrement(PN, LI);
|
||||
if (!LoopIncrInfo)
|
||||
|
@ -1065,3 +1065,37 @@ for.body:
|
||||
%exitcond.not = icmp eq i32 %inc, %N
|
||||
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
|
||||
}
|
||||
|
||||
define i64 @pr150611_add_offset_is_not_loop_invariant(i1 %cond) {
|
||||
; CHECK-LABEL: define i64 @pr150611_add_offset_is_not_loop_invariant(
|
||||
; CHECK-SAME: i1 [[COND:%.*]]) {
|
||||
; CHECK-NEXT: [[ENTRY:.*]]:
|
||||
; CHECK-NEXT: [[REMAMT:%.*]] = select i1 [[COND]], i64 2, i64 0
|
||||
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
||||
; CHECK: [[FOR_BODY]]:
|
||||
; CHECK-NEXT: [[INDVARS:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDVARS_NEXT:%.*]], %[[FOR_BODY]] ]
|
||||
; CHECK-NEXT: [[ADD_OFFSET:%.*]] = zext i1 [[COND]] to i64
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nuw i64 [[INDVARS]], [[ADD_OFFSET]]
|
||||
; CHECK-NEXT: [[REM:%.*]] = urem i64 [[ADD]], [[REMAMT]]
|
||||
; CHECK-NEXT: [[INDVARS_NEXT]] = add nuw i64 [[INDVARS]], 1
|
||||
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_NEXT]], 3
|
||||
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[FOR_EXIT:.*]], label %[[FOR_BODY]]
|
||||
; CHECK: [[FOR_EXIT]]:
|
||||
; CHECK-NEXT: ret i64 [[REM]]
|
||||
;
|
||||
entry:
|
||||
%remamt = select i1 %cond, i64 2, i64 0
|
||||
br label %for.body
|
||||
|
||||
for.body:
|
||||
%indvars = phi i64 [ 0, %entry ], [ %indvars.next, %for.body ]
|
||||
%add.offset = zext i1 %cond to i64
|
||||
%add = add nuw i64 %indvars, %add.offset
|
||||
%rem = urem i64 %add, %remamt
|
||||
%indvars.next = add nuw i64 %indvars, 1
|
||||
%exitcond = icmp eq i64 %indvars.next, 3
|
||||
br i1 %exitcond, label %for.exit, label %for.body
|
||||
|
||||
for.exit:
|
||||
ret i64 %rem
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user