@@ -763,3 +763,47 @@ exit.2:
763
763
%t.2 = icmp ult i32 %iv , %N
764
764
ret i1 %t.2
765
765
}
766
+
767
+ define i1 @test_non_dedicated_exit (i16 %n ) {
768
+ ; CHECK-LABEL: define i1 @test_non_dedicated_exit(
769
+ ; CHECK-SAME: i16 [[N:%.*]]) {
770
+ ; CHECK-NEXT: [[ENTRY:.*:]]
771
+ ; CHECK-NEXT: [[COND:%.*]] = icmp slt i16 [[N]], 1
772
+ ; CHECK-NEXT: br i1 [[COND]], label %[[EXIT:.*]], label %[[LOOP_PREHEADER:.*]]
773
+ ; CHECK: [[LOOP_PREHEADER]]:
774
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i16 [[N]], -1
775
+ ; CHECK-NEXT: [[EXT:%.*]] = zext nneg i16 [[SUB]] to i32
776
+ ; CHECK-NEXT: br label %[[LOOP:.*]]
777
+ ; CHECK: [[LOOP]]:
778
+ ; CHECK-NEXT: [[INDVAR:%.*]] = phi i32 [ [[INDVAR_INC:%.*]], %[[LOOP_LATCH:.*]] ], [ 0, %[[LOOP_PREHEADER]] ]
779
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INDVAR]], [[EXT]]
780
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP_LATCH]]
781
+ ; CHECK: [[LOOP_LATCH]]:
782
+ ; CHECK-NEXT: [[INDVAR_INC]] = add nuw nsw i32 [[INDVAR]], 1
783
+ ; CHECK-NEXT: br label %[[LOOP]]
784
+ ; CHECK: [[EXIT]]:
785
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i16 [[N]], 0
786
+ ; CHECK-NEXT: ret i1 [[CMP]]
787
+ ;
788
+ entry:
789
+ %cond = icmp slt i16 %n , 1
790
+ br i1 %cond , label %exit , label %loop.preheader
791
+
792
+ loop.preheader:
793
+ %sub = add nsw i16 %n , -1
794
+ %ext = zext nneg i16 %sub to i32
795
+ br label %loop
796
+
797
+ loop:
798
+ %indvar = phi i32 [ %indvar.inc , %loop.latch ], [ 0 , %loop.preheader ]
799
+ %exitcond = icmp eq i32 %indvar , %ext
800
+ br i1 %exitcond , label %exit , label %loop.latch
801
+
802
+ loop.latch:
803
+ %indvar.inc = add nuw nsw i32 %indvar , 1
804
+ br label %loop
805
+
806
+ exit:
807
+ %cmp = icmp sgt i16 %n , 0
808
+ ret i1 %cmp
809
+ }
0 commit comments