@@ -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