@@ -729,3 +729,127 @@ loop:
729
729
exit:
730
730
ret void
731
731
}
732
+
733
+ define void @test_add_lshr_add_regular_select (ptr %dst , ptr %src , i64 %i.start , i64 %j.start ) {
734
+ ; CHECK-LABEL: @test_add_lshr_add_regular_select(
735
+ ; CHECK-NEXT: entry:
736
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
737
+ ; CHECK: loop:
738
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 100000, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[SELECT_END:%.*]] ]
739
+ ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[I_NEXT:%.*]], [[SELECT_END]] ]
740
+ ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[SELECT_END]] ]
741
+ ; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
742
+ ; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[GEP_I]], align 8
743
+ ; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds i64, ptr [[TMP0]], i64 [[J]]
744
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[GEP_J]], align 8
745
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[TMP1]], -1
746
+ ; CHECK-NEXT: [[SHIFT:%.*]] = lshr i64 [[TMP1]], 63
747
+ ; CHECK-NEXT: [[CMP_FROZEN:%.*]] = freeze i1 [[CMP]]
748
+ ; CHECK-NEXT: br i1 [[CMP_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_FALSE_SINK:%.*]]
749
+ ; CHECK: select.true.sink:
750
+ ; CHECK-NEXT: [[TMP2:%.*]] = add nsw i64 [[I]], 1
751
+ ; CHECK-NEXT: br label [[SELECT_END]]
752
+ ; CHECK: select.false.sink:
753
+ ; CHECK-NEXT: [[TMP3:%.*]] = add nsw i64 [[J]], 1
754
+ ; CHECK-NEXT: br label [[SELECT_END]]
755
+ ; CHECK: select.end:
756
+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[SELECT_TRUE_SINK]] ], [ [[TMP3]], [[SELECT_FALSE_SINK]] ]
757
+ ; CHECK-NEXT: [[I_NEXT]] = phi i64 [ [[TMP2]], [[SELECT_TRUE_SINK]] ], [ [[I]], [[SELECT_FALSE_SINK]] ]
758
+ ; CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[J]], [[SELECT_TRUE_SINK]] ], [ [[I]], [[SELECT_FALSE_SINK]] ]
759
+ ; CHECK-NEXT: [[INC:%.*]] = zext i1 [[CMP]] to i64
760
+ ; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr i64, ptr [[DST:%.*]], i64 [[IV]]
761
+ ; CHECK-NEXT: store i64 [[COND]], ptr [[GEP_DST]], align 8
762
+ ; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], -1
763
+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 0
764
+ ; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
765
+ ; CHECK: exit:
766
+ ; CHECK-NEXT: ret void
767
+ ;
768
+ entry:
769
+ br label %loop
770
+
771
+ loop:
772
+ %iv = phi i64 [ 100000 , %entry ], [ %iv.next , %loop ]
773
+ %i = phi i64 [ %i.start , %entry ], [ %i.next , %loop ]
774
+ %j = phi i64 [ %j.start , %entry ], [ %j.next , %loop ]
775
+ %gep.i = getelementptr inbounds ptr , ptr %src , i64 %i
776
+ %0 = load ptr , ptr %gep.i , align 8
777
+ %gep.j = getelementptr inbounds i64 , ptr %0 , i64 %j
778
+ %1 = load i64 , ptr %gep.j , align 8
779
+ %cmp = icmp sgt i64 %1 , -1
780
+ %shift = lshr i64 %1 , 63
781
+ %j.next = add nsw i64 %j , %shift
782
+ %inc = zext i1 %cmp to i64
783
+ %i.next = add nsw i64 %i , %inc
784
+ %cond = select i1 %cmp , i64 %j , i64 %i
785
+ %gep.dst = getelementptr i64 , ptr %dst , i64 %iv
786
+ store i64 %cond , ptr %gep.dst , align 8
787
+ %iv.next = add nsw i64 %iv , -1
788
+ %ec = icmp eq i64 %iv.next , 0
789
+ br i1 %ec , label %exit , label %loop
790
+
791
+ exit:
792
+ ret void
793
+ }
794
+
795
+ define void @test_add_ashr_add_regular_select (ptr %dst , ptr %src , i64 %i.start , i64 %j.start ) {
796
+ ; CHECK-LABEL: @test_add_ashr_add_regular_select(
797
+ ; CHECK-NEXT: entry:
798
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
799
+ ; CHECK: loop:
800
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 100000, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[SELECT_END:%.*]] ]
801
+ ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[I_NEXT:%.*]], [[SELECT_END]] ]
802
+ ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[SELECT_END]] ]
803
+ ; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
804
+ ; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[GEP_I]], align 8
805
+ ; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds i64, ptr [[TMP0]], i64 [[J]]
806
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[GEP_J]], align 8
807
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[TMP1]], -1
808
+ ; CHECK-NEXT: [[SHIFT:%.*]] = ashr i64 [[TMP1]], 63
809
+ ; CHECK-NEXT: [[CMP_FROZEN:%.*]] = freeze i1 [[CMP]]
810
+ ; CHECK-NEXT: br i1 [[CMP_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_FALSE_SINK:%.*]]
811
+ ; CHECK: select.true.sink:
812
+ ; CHECK-NEXT: [[TMP2:%.*]] = add nsw i64 [[I]], 1
813
+ ; CHECK-NEXT: br label [[SELECT_END]]
814
+ ; CHECK: select.false.sink:
815
+ ; CHECK-NEXT: [[TMP3:%.*]] = add nsw i64 [[J]], -1
816
+ ; CHECK-NEXT: br label [[SELECT_END]]
817
+ ; CHECK: select.end:
818
+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[SELECT_TRUE_SINK]] ], [ [[TMP3]], [[SELECT_FALSE_SINK]] ]
819
+ ; CHECK-NEXT: [[I_NEXT]] = phi i64 [ [[TMP2]], [[SELECT_TRUE_SINK]] ], [ [[I]], [[SELECT_FALSE_SINK]] ]
820
+ ; CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[J]], [[SELECT_TRUE_SINK]] ], [ [[I]], [[SELECT_FALSE_SINK]] ]
821
+ ; CHECK-NEXT: [[INC:%.*]] = zext i1 [[CMP]] to i64
822
+ ; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr i64, ptr [[DST:%.*]], i64 [[IV]]
823
+ ; CHECK-NEXT: store i64 [[COND]], ptr [[GEP_DST]], align 8
824
+ ; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], -1
825
+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 0
826
+ ; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
827
+ ; CHECK: exit:
828
+ ; CHECK-NEXT: ret void
829
+ ;
830
+ entry:
831
+ br label %loop
832
+
833
+ loop:
834
+ %iv = phi i64 [ 100000 , %entry ], [ %iv.next , %loop ]
835
+ %i = phi i64 [ %i.start , %entry ], [ %i.next , %loop ]
836
+ %j = phi i64 [ %j.start , %entry ], [ %j.next , %loop ]
837
+ %gep.i = getelementptr inbounds ptr , ptr %src , i64 %i
838
+ %0 = load ptr , ptr %gep.i , align 8
839
+ %gep.j = getelementptr inbounds i64 , ptr %0 , i64 %j
840
+ %1 = load i64 , ptr %gep.j , align 8
841
+ %cmp = icmp sgt i64 %1 , -1
842
+ %shift = ashr i64 %1 , 63
843
+ %j.next = add nsw i64 %j , %shift
844
+ %inc = zext i1 %cmp to i64
845
+ %i.next = add nsw i64 %i , %inc
846
+ %cond = select i1 %cmp , i64 %j , i64 %i
847
+ %gep.dst = getelementptr i64 , ptr %dst , i64 %iv
848
+ store i64 %cond , ptr %gep.dst , align 8
849
+ %iv.next = add nsw i64 %iv , -1
850
+ %ec = icmp eq i64 %iv.next , 0
851
+ br i1 %ec , label %exit , label %loop
852
+
853
+ exit:
854
+ ret void
855
+ }
0 commit comments