@@ -729,3 +729,127 @@ loop:
729729exit:
730730 ret void
731731}
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