@@ -845,6 +845,130 @@ return: ; preds = %if.end, %land.lhs.t
845845 ret i32 %retval.0
846846}
847847
848+ ; (a < 0 && b == c) || (a < -1 && b == d)
849+ define i32 @combine_gt_lt_n0 () #0 {
850+ ; CHECK-LABEL: combine_gt_lt_n0:
851+ ; CHECK: // %bb.0: // %entry
852+ ; CHECK-NEXT: adrp x8, :got:a
853+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:a]
854+ ; CHECK-NEXT: ldr w8, [x8]
855+ ; CHECK-NEXT: tbz w8, #31, .LBB12_3
856+ ; CHECK-NEXT: // %bb.1: // %land.lhs.true
857+ ; CHECK-NEXT: adrp x8, :got:b
858+ ; CHECK-NEXT: adrp x9, :got:c
859+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:b]
860+ ; CHECK-NEXT: ldr x9, [x9, :got_lo12:c]
861+ ; CHECK-NEXT: ldr w8, [x8]
862+ ; CHECK-NEXT: ldr w9, [x9]
863+ ; CHECK-NEXT: cmp w8, w9
864+ ; CHECK-NEXT: b.ne .LBB12_3
865+ ; CHECK-NEXT: // %bb.2:
866+ ; CHECK-NEXT: mov w0, #1 // =0x1
867+ ; CHECK-NEXT: ret
868+ ; CHECK-NEXT: .LBB12_3: // %if.end
869+ ; CHECK-NEXT: mov w0, wzr
870+ ; CHECK-NEXT: ret
871+ entry:
872+ %0 = load i32 , ptr @a , align 4
873+ %cmp = icmp slt i32 %0 , 0
874+ br i1 %cmp , label %land.lhs.true , label %lor.lhs.false
875+
876+ land.lhs.true: ; preds = %entry
877+ %1 = load i32 , ptr @b , align 4
878+ %2 = load i32 , ptr @c , align 4
879+ %cmp1 = icmp eq i32 %1 , %2
880+ br i1 %cmp1 , label %return , label %if.end
881+
882+ lor.lhs.false: ; preds = %entry
883+ %cmp2 = icmp slt i32 %0 , -1
884+ br i1 %cmp2 , label %land.lhs.true3 , label %if.end
885+
886+ land.lhs.true3: ; preds = %lor.lhs.false
887+ %3 = load i32 , ptr @b , align 4
888+ %4 = load i32 , ptr @d , align 4
889+ %cmp4 = icmp eq i32 %3 , %4
890+ br i1 %cmp4 , label %return , label %if.end
891+
892+ if.end: ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true
893+ br label %return
894+
895+ return: ; preds = %if.end, %land.lhs.true3, %land.lhs.true
896+ %retval.0 = phi i32 [ 0 , %if.end ], [ 1 , %land.lhs.true3 ], [ 1 , %land.lhs.true ]
897+ ret i32 %retval.0
898+ }
899+
900+ define i32 @combine_gt_ge_sel_2 (i64 %v , ptr %p ) #0 {
901+ ; CHECK-LABEL: combine_gt_ge_sel_2:
902+ ; CHECK: // %bb.0: // %entry
903+ ; CHECK-NEXT: adrp x8, :got:a
904+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:a]
905+ ; CHECK-NEXT: ldr w8, [x8]
906+ ; CHECK-NEXT: cmn w8, #1
907+ ; CHECK-NEXT: csel x9, x0, xzr, gt
908+ ; CHECK-NEXT: str x9, [x1]
909+ ; CHECK-NEXT: tbnz w8, #31, .LBB13_2
910+ ; CHECK-NEXT: // %bb.1: // %lor.lhs.false
911+ ; CHECK-NEXT: cmp w8, #1
912+ ; CHECK-NEXT: b.ge .LBB13_4
913+ ; CHECK-NEXT: b .LBB13_6
914+ ; CHECK-NEXT: .LBB13_2: // %land.lhs.true
915+ ; CHECK-NEXT: adrp x8, :got:b
916+ ; CHECK-NEXT: adrp x9, :got:c
917+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:b]
918+ ; CHECK-NEXT: ldr x9, [x9, :got_lo12:c]
919+ ; CHECK-NEXT: ldr w8, [x8]
920+ ; CHECK-NEXT: ldr w9, [x9]
921+ ; CHECK-NEXT: cmp w8, w9
922+ ; CHECK-NEXT: b.ne .LBB13_4
923+ ; CHECK-NEXT: // %bb.3:
924+ ; CHECK-NEXT: mov w0, #1 // =0x1
925+ ; CHECK-NEXT: ret
926+ ; CHECK-NEXT: .LBB13_4: // %land.lhs.true3
927+ ; CHECK-NEXT: adrp x8, :got:b
928+ ; CHECK-NEXT: adrp x9, :got:d
929+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:b]
930+ ; CHECK-NEXT: ldr x9, [x9, :got_lo12:d]
931+ ; CHECK-NEXT: ldr w8, [x8]
932+ ; CHECK-NEXT: ldr w9, [x9]
933+ ; CHECK-NEXT: cmp w8, w9
934+ ; CHECK-NEXT: b.ne .LBB13_6
935+ ; CHECK-NEXT: // %bb.5:
936+ ; CHECK-NEXT: mov w0, #1 // =0x1
937+ ; CHECK-NEXT: ret
938+ ; CHECK-NEXT: .LBB13_6: // %if.end
939+ ; CHECK-NEXT: mov w0, wzr
940+ ; CHECK-NEXT: ret
941+ entry:
942+ %0 = load i32 , ptr @a , align 4
943+ %cmp = icmp sgt i32 %0 , -1
944+ %m = select i1 %cmp , i64 %v , i64 0
945+ store i64 %m , ptr %p
946+ br i1 %cmp , label %lor.lhs.false , label %land.lhs.true
947+
948+ land.lhs.true: ; preds = %entry
949+ %1 = load i32 , ptr @b , align 4
950+ %2 = load i32 , ptr @c , align 4
951+ %cmp1 = icmp eq i32 %1 , %2
952+ br i1 %cmp1 , label %return , label %land.lhs.true3
953+
954+ lor.lhs.false: ; preds = %entry
955+ %cmp2 = icmp sgt i32 %0 , 0
956+ br i1 %cmp2 , label %land.lhs.true3 , label %if.end
957+
958+ land.lhs.true3: ; preds = %lor.lhs.false, %land.lhs.true
959+ %3 = load i32 , ptr @b , align 4
960+ %4 = load i32 , ptr @d , align 4
961+ %cmp4 = icmp eq i32 %3 , %4
962+ br i1 %cmp4 , label %return , label %if.end
963+
964+ if.end: ; preds = %land.lhs.true3, %lor.lhs.false
965+ br label %return
966+
967+ return: ; preds = %if.end, %land.lhs.true3, %land.lhs.true
968+ %retval.0 = phi i32 [ 0 , %if.end ], [ 1 , %land.lhs.true3 ], [ 1 , %land.lhs.true ]
969+ ret i32 %retval.0
970+ }
971+
848972declare i32 @zoo (i32 )
849973
850974declare double @yoo (i32 )
0 commit comments