Skip to content

Commit 8c7cf7c

Browse files
dtcxzywtru
authored andcommitted
[CodeGenPrepare] Make sure that AddOffset is also a loop invariant (#150625)
Closes #150611. (cherry picked from commit 2d0ca09)
1 parent 9ebb0ab commit 8c7cf7c

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,6 +2096,10 @@ static bool isRemOfLoopIncrementWithLoopInvariant(
20962096
if (!L->isLoopInvariant(RemAmt))
20972097
return false;
20982098

2099+
// Only works if the AddOffset is a loop invaraint
2100+
if (AddOffset && !L->isLoopInvariant(AddOffset))
2101+
return false;
2102+
20992103
// Is the PHI a loop increment?
21002104
auto LoopIncrInfo = getIVIncrement(PN, LI);
21012105
if (!LoopIncrInfo)

llvm/test/Transforms/CodeGenPrepare/X86/fold-loop-of-urem.ll

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,3 +1065,37 @@ for.body:
10651065
%exitcond.not = icmp eq i32 %inc, %N
10661066
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
10671067
}
1068+
1069+
define i64 @pr150611_add_offset_is_not_loop_invariant(i1 %cond) {
1070+
; CHECK-LABEL: define i64 @pr150611_add_offset_is_not_loop_invariant(
1071+
; CHECK-SAME: i1 [[COND:%.*]]) {
1072+
; CHECK-NEXT: [[ENTRY:.*]]:
1073+
; CHECK-NEXT: [[REMAMT:%.*]] = select i1 [[COND]], i64 2, i64 0
1074+
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
1075+
; CHECK: [[FOR_BODY]]:
1076+
; CHECK-NEXT: [[INDVARS:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDVARS_NEXT:%.*]], %[[FOR_BODY]] ]
1077+
; CHECK-NEXT: [[ADD_OFFSET:%.*]] = zext i1 [[COND]] to i64
1078+
; CHECK-NEXT: [[ADD:%.*]] = add nuw i64 [[INDVARS]], [[ADD_OFFSET]]
1079+
; CHECK-NEXT: [[REM:%.*]] = urem i64 [[ADD]], [[REMAMT]]
1080+
; CHECK-NEXT: [[INDVARS_NEXT]] = add nuw i64 [[INDVARS]], 1
1081+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_NEXT]], 3
1082+
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[FOR_EXIT:.*]], label %[[FOR_BODY]]
1083+
; CHECK: [[FOR_EXIT]]:
1084+
; CHECK-NEXT: ret i64 [[REM]]
1085+
;
1086+
entry:
1087+
%remamt = select i1 %cond, i64 2, i64 0
1088+
br label %for.body
1089+
1090+
for.body:
1091+
%indvars = phi i64 [ 0, %entry ], [ %indvars.next, %for.body ]
1092+
%add.offset = zext i1 %cond to i64
1093+
%add = add nuw i64 %indvars, %add.offset
1094+
%rem = urem i64 %add, %remamt
1095+
%indvars.next = add nuw i64 %indvars, 1
1096+
%exitcond = icmp eq i64 %indvars.next, 3
1097+
br i1 %exitcond, label %for.exit, label %for.body
1098+
1099+
for.exit:
1100+
ret i64 %rem
1101+
}

0 commit comments

Comments
 (0)