@@ -845,6 +845,130 @@ return: ; preds = %if.end, %land.lhs.t
845
845
ret i32 %retval.0
846
846
}
847
847
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
+
848
972
declare i32 @zoo (i32 )
849
973
850
974
declare double @yoo (i32 )
0 commit comments