@@ -1065,3 +1065,37 @@ for.body:
1065
1065
%exitcond.not = icmp eq i32 %inc , %N
1066
1066
br i1 %exitcond.not , label %for.cond.cleanup , label %for.body
1067
1067
}
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