@@ -942,39 +942,115 @@ for.inc: ; preds = %for.body, %if.else
942942 br i1 %cmp , label %for.body , label %for.cond.cleanup
943943}
944944
945- ;; Negative test
946945define void @signed_var_imm_dec_eq (ptr nocapture %a , ptr nocapture readonly %b , ptr nocapture readonly %c , i32 %M ) {
947946; CHECK-LABEL: define void @signed_var_imm_dec_eq(
948947; CHECK-SAME: ptr nocapture [[A:%.*]], ptr nocapture readonly [[B:%.*]], ptr nocapture readonly [[C:%.*]], i32 [[M:%.*]]) {
949948; CHECK-NEXT: entry:
950949; CHECK-NEXT: [[CMP14:%.*]] = icmp slt i32 [[M]], 1024
951950; CHECK-NEXT: br i1 [[CMP14]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
952951; CHECK: for.body.preheader:
953- ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
952+ ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[M]], 1
953+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[TMP0]], i32 1024)
954+ ; CHECK-NEXT: [[EXIT_PRELOOP_AT:%.*]] = add nsw i32 [[SMAX]], -1
955+ ; CHECK-NEXT: [[SMAX1:%.*]] = call i32 @llvm.smax.i32(i32 [[TMP0]], i32 0)
956+ ; CHECK-NEXT: [[EXIT_MAINLOOP_AT:%.*]] = add nsw i32 [[SMAX1]], -1
957+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 1024, [[EXIT_PRELOOP_AT]]
958+ ; CHECK-NEXT: br i1 [[TMP1]], label [[FOR_BODY_PRELOOP_PREHEADER:%.*]], label [[PRELOOP_PSEUDO_EXIT:%.*]]
959+ ; CHECK: for.body.preloop.preheader:
960+ ; CHECK-NEXT: br label [[FOR_BODY_PRELOOP:%.*]]
961+ ; CHECK: for.cond.cleanup.loopexit.loopexit:
962+ ; CHECK-NEXT: br label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]
954963; CHECK: for.cond.cleanup.loopexit:
955964; CHECK-NEXT: br label [[FOR_COND_CLEANUP]]
956965; CHECK: for.cond.cleanup:
957966; CHECK-NEXT: ret void
967+ ; CHECK: mainloop:
968+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[INDVAR_END:%.*]], [[EXIT_MAINLOOP_AT]]
969+ ; CHECK-NEXT: br i1 [[TMP2]], label [[FOR_BODY_PREHEADER3:%.*]], label [[MAIN_PSEUDO_EXIT:%.*]]
970+ ; CHECK: for.body.preheader3:
971+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
958972; CHECK: for.body:
959- ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[DEC:%.*]], [[FOR_INC:%.*]] ], [ 1024 , [[FOR_BODY_PREHEADER ]] ]
973+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[DEC:%.*]], [[FOR_INC:%.*]] ], [ [[IV_PRELOOP_COPY:%.*]] , [[FOR_BODY_PREHEADER3 ]] ]
960974; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[IV]], 1024
961975; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[IV]]
962- ; CHECK-NEXT: [[TMP0 :%.*]] = load i32, ptr [[ARRAYIDX]], align 4
976+ ; CHECK-NEXT: [[TMP3 :%.*]] = load i32, ptr [[ARRAYIDX]], align 4
963977; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 [[IV]]
964- ; CHECK-NEXT: [[TMP1 :%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
965- ; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1 ]], [[TMP0 ]]
978+ ; CHECK-NEXT: [[TMP4 :%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
979+ ; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP4 ]], [[TMP3 ]]
966980; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[IV]]
967- ; CHECK-NEXT: br i1 [[CMP1]] , label [[FOR_INC]], label [[IF_ELSE:%.*]]
981+ ; CHECK-NEXT: br i1 true , label [[FOR_INC]], label [[IF_ELSE:%.*]]
968982; CHECK: if.else:
969- ; CHECK-NEXT: [[TMP2 :%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
970- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2 ]], [[MUL]]
983+ ; CHECK-NEXT: [[TMP5 :%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
984+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP5 ]], [[MUL]]
971985; CHECK-NEXT: br label [[FOR_INC]]
972986; CHECK: for.inc:
973987; CHECK-NEXT: [[STOREMERGE:%.*]] = phi i32 [ [[ADD]], [[IF_ELSE]] ], [ [[MUL]], [[FOR_BODY]] ]
974988; CHECK-NEXT: store i32 [[STOREMERGE]], ptr [[ARRAYIDX3]], align 4
975989; CHECK-NEXT: [[DEC]] = add nsw i32 [[IV]], -1
976990; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[DEC]], [[M]]
977- ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY]]
991+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp sgt i32 [[DEC]], [[EXIT_MAINLOOP_AT]]
992+ ; CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true
993+ ; CHECK-NEXT: br i1 [[TMP7]], label [[MAIN_EXIT_SELECTOR:%.*]], label [[FOR_BODY]]
994+ ; CHECK: main.exit.selector:
995+ ; CHECK-NEXT: [[DEC_LCSSA:%.*]] = phi i32 [ [[DEC]], [[FOR_INC]] ]
996+ ; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[DEC_LCSSA]], [[M]]
997+ ; CHECK-NEXT: br i1 [[TMP8]], label [[MAIN_PSEUDO_EXIT]], label [[FOR_COND_CLEANUP_LOOPEXIT]]
998+ ; CHECK: main.pseudo.exit:
999+ ; CHECK-NEXT: [[IV_COPY:%.*]] = phi i32 [ [[IV_PRELOOP_COPY]], [[MAINLOOP:%.*]] ], [ [[DEC_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
1000+ ; CHECK-NEXT: [[INDVAR_END2:%.*]] = phi i32 [ [[INDVAR_END]], [[MAINLOOP]] ], [ [[DEC_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
1001+ ; CHECK-NEXT: br label [[POSTLOOP:%.*]]
1002+ ; CHECK: for.body.preloop:
1003+ ; CHECK-NEXT: [[IV_PRELOOP:%.*]] = phi i32 [ [[DEC_PRELOOP:%.*]], [[FOR_INC_PRELOOP:%.*]] ], [ 1024, [[FOR_BODY_PRELOOP_PREHEADER]] ]
1004+ ; CHECK-NEXT: [[CMP1_PRELOOP:%.*]] = icmp slt i32 [[IV_PRELOOP]], 1024
1005+ ; CHECK-NEXT: [[ARRAYIDX_PRELOOP:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[IV_PRELOOP]]
1006+ ; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX_PRELOOP]], align 4
1007+ ; CHECK-NEXT: [[ARRAYIDX2_PRELOOP:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 [[IV_PRELOOP]]
1008+ ; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX2_PRELOOP]], align 4
1009+ ; CHECK-NEXT: [[MUL_PRELOOP:%.*]] = mul nsw i32 [[TMP10]], [[TMP9]]
1010+ ; CHECK-NEXT: [[ARRAYIDX3_PRELOOP:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[IV_PRELOOP]]
1011+ ; CHECK-NEXT: br i1 [[CMP1_PRELOOP]], label [[FOR_INC_PRELOOP]], label [[IF_ELSE_PRELOOP:%.*]]
1012+ ; CHECK: if.else.preloop:
1013+ ; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX3_PRELOOP]], align 4
1014+ ; CHECK-NEXT: [[ADD_PRELOOP:%.*]] = add nsw i32 [[TMP11]], [[MUL_PRELOOP]]
1015+ ; CHECK-NEXT: br label [[FOR_INC_PRELOOP]]
1016+ ; CHECK: for.inc.preloop:
1017+ ; CHECK-NEXT: [[STOREMERGE_PRELOOP:%.*]] = phi i32 [ [[ADD_PRELOOP]], [[IF_ELSE_PRELOOP]] ], [ [[MUL_PRELOOP]], [[FOR_BODY_PRELOOP]] ]
1018+ ; CHECK-NEXT: store i32 [[STOREMERGE_PRELOOP]], ptr [[ARRAYIDX3_PRELOOP]], align 4
1019+ ; CHECK-NEXT: [[DEC_PRELOOP]] = add nsw i32 [[IV_PRELOOP]], -1
1020+ ; CHECK-NEXT: [[CMP_PRELOOP:%.*]] = icmp eq i32 [[DEC_PRELOOP]], [[M]]
1021+ ; CHECK-NEXT: [[TMP12:%.*]] = icmp sgt i32 [[DEC_PRELOOP]], [[EXIT_PRELOOP_AT]]
1022+ ; CHECK-NEXT: [[TMP13:%.*]] = xor i1 [[TMP12]], true
1023+ ; CHECK-NEXT: br i1 [[TMP13]], label [[PRELOOP_EXIT_SELECTOR:%.*]], label [[FOR_BODY_PRELOOP]], !llvm.loop [[LOOP15:![0-9]+]], !loop_constrainer.loop.clone !5
1024+ ; CHECK: preloop.exit.selector:
1025+ ; CHECK-NEXT: [[DEC_PRELOOP_LCSSA:%.*]] = phi i32 [ [[DEC_PRELOOP]], [[FOR_INC_PRELOOP]] ]
1026+ ; CHECK-NEXT: [[TMP14:%.*]] = icmp sgt i32 [[DEC_PRELOOP_LCSSA]], [[M]]
1027+ ; CHECK-NEXT: br i1 [[TMP14]], label [[PRELOOP_PSEUDO_EXIT]], label [[FOR_COND_CLEANUP_LOOPEXIT]]
1028+ ; CHECK: preloop.pseudo.exit:
1029+ ; CHECK-NEXT: [[IV_PRELOOP_COPY]] = phi i32 [ 1024, [[FOR_BODY_PREHEADER]] ], [ [[DEC_PRELOOP_LCSSA]], [[PRELOOP_EXIT_SELECTOR]] ]
1030+ ; CHECK-NEXT: [[INDVAR_END]] = phi i32 [ 1024, [[FOR_BODY_PREHEADER]] ], [ [[DEC_PRELOOP_LCSSA]], [[PRELOOP_EXIT_SELECTOR]] ]
1031+ ; CHECK-NEXT: br label [[MAINLOOP]]
1032+ ; CHECK: postloop:
1033+ ; CHECK-NEXT: br label [[FOR_BODY_POSTLOOP:%.*]]
1034+ ; CHECK: for.body.postloop:
1035+ ; CHECK-NEXT: [[IV_POSTLOOP:%.*]] = phi i32 [ [[DEC_POSTLOOP:%.*]], [[FOR_INC_POSTLOOP:%.*]] ], [ [[IV_COPY]], [[POSTLOOP]] ]
1036+ ; CHECK-NEXT: [[CMP1_POSTLOOP:%.*]] = icmp slt i32 [[IV_POSTLOOP]], 1024
1037+ ; CHECK-NEXT: [[ARRAYIDX_POSTLOOP:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[IV_POSTLOOP]]
1038+ ; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[ARRAYIDX_POSTLOOP]], align 4
1039+ ; CHECK-NEXT: [[ARRAYIDX2_POSTLOOP:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 [[IV_POSTLOOP]]
1040+ ; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[ARRAYIDX2_POSTLOOP]], align 4
1041+ ; CHECK-NEXT: [[MUL_POSTLOOP:%.*]] = mul nsw i32 [[TMP16]], [[TMP15]]
1042+ ; CHECK-NEXT: [[ARRAYIDX3_POSTLOOP:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[IV_POSTLOOP]]
1043+ ; CHECK-NEXT: br i1 [[CMP1_POSTLOOP]], label [[FOR_INC_POSTLOOP]], label [[IF_ELSE_POSTLOOP:%.*]]
1044+ ; CHECK: if.else.postloop:
1045+ ; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[ARRAYIDX3_POSTLOOP]], align 4
1046+ ; CHECK-NEXT: [[ADD_POSTLOOP:%.*]] = add nsw i32 [[TMP17]], [[MUL_POSTLOOP]]
1047+ ; CHECK-NEXT: br label [[FOR_INC_POSTLOOP]]
1048+ ; CHECK: for.inc.postloop:
1049+ ; CHECK-NEXT: [[STOREMERGE_POSTLOOP:%.*]] = phi i32 [ [[ADD_POSTLOOP]], [[IF_ELSE_POSTLOOP]] ], [ [[MUL_POSTLOOP]], [[FOR_BODY_POSTLOOP]] ]
1050+ ; CHECK-NEXT: store i32 [[STOREMERGE_POSTLOOP]], ptr [[ARRAYIDX3_POSTLOOP]], align 4
1051+ ; CHECK-NEXT: [[DEC_POSTLOOP]] = add nsw i32 [[IV_POSTLOOP]], -1
1052+ ; CHECK-NEXT: [[CMP_POSTLOOP:%.*]] = icmp eq i32 [[DEC_POSTLOOP]], [[M]]
1053+ ; CHECK-NEXT: br i1 [[CMP_POSTLOOP]], label [[FOR_COND_CLEANUP_LOOPEXIT_LOOPEXIT:%.*]], label [[FOR_BODY_POSTLOOP]], !llvm.loop [[LOOP16:![0-9]+]], !loop_constrainer.loop.clone !5
9781054;
9791055entry:
9801056 %cmp14 = icmp slt i32 %M , 1024
0 commit comments