@@ -989,4 +989,136 @@ if.false:
989
989
ret void
990
990
}
991
991
992
+ define void @test_icmp_mask_two_values (i32 %a ) {
993
+ ; CHECK-LABEL: @test_icmp_mask_two_values(
994
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], -2
995
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 10
996
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
997
+ ; CHECK: if.true:
998
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i32 [[A]], 10
999
+ ; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1000
+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp ule i32 [[A]], 11
1001
+ ; CHECK-NEXT: call void @check1(i1 [[CMP3]])
1002
+ ; CHECK-NEXT: [[CMP4:%.*]] = icmp ult i32 [[A]], 10
1003
+ ; CHECK-NEXT: call void @check1(i1 [[CMP4]])
1004
+ ; CHECK-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[A]], 11
1005
+ ; CHECK-NEXT: call void @check1(i1 [[CMP5]])
1006
+ ; CHECK-NEXT: ret void
1007
+ ; CHECK: if.false:
1008
+ ; CHECK-NEXT: ret void
1009
+ ;
1010
+ %and = and i32 %a , -2
1011
+ %cmp = icmp eq i32 %and , 10
1012
+ br i1 %cmp , label %if.true , label %if.false
1013
+
1014
+ if.true:
1015
+ %cmp2 = icmp uge i32 %a , 10
1016
+ call void @check1 (i1 %cmp2 )
1017
+ %cmp3 = icmp ule i32 %a , 11
1018
+ call void @check1 (i1 %cmp3 )
1019
+ %cmp4 = icmp ult i32 %a , 10
1020
+ call void @check1 (i1 %cmp4 )
1021
+ %cmp5 = icmp ugt i32 %a , 11
1022
+ call void @check1 (i1 %cmp5 )
1023
+ ret void
1024
+
1025
+ if.false:
1026
+ ret void
1027
+ }
1028
+
1029
+ define void @test_icmp_mask_bit_set (i32 %a ) {
1030
+ ; CHECK-LABEL: @test_icmp_mask_bit_set(
1031
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], 32
1032
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 32
1033
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1034
+ ; CHECK: if.true:
1035
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i32 [[A]], 32
1036
+ ; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1037
+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp uge i32 [[A]], 33
1038
+ ; CHECK-NEXT: call void @check1(i1 [[CMP3]])
1039
+ ; CHECK-NEXT: ret void
1040
+ ; CHECK: if.false:
1041
+ ; CHECK-NEXT: ret void
1042
+ ;
1043
+ %and = and i32 %a , 32
1044
+ %cmp = icmp eq i32 %and , 32
1045
+ br i1 %cmp , label %if.true , label %if.false
1046
+
1047
+ if.true:
1048
+ %cmp2 = icmp uge i32 %a , 32
1049
+ call void @check1 (i1 %cmp2 )
1050
+ %cmp3 = icmp uge i32 %a , 33
1051
+ call void @check1 (i1 %cmp3 )
1052
+ ret void
1053
+
1054
+ if.false:
1055
+ ret void
1056
+ }
1057
+
1058
+ define void @test_icmp_mask_bit_unset (i32 %a ) {
1059
+ ; CHECK-LABEL: @test_icmp_mask_bit_unset(
1060
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], 32
1061
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
1062
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1063
+ ; CHECK: if.true:
1064
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[A]], -33
1065
+ ; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1066
+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp ule i32 [[A]], -34
1067
+ ; CHECK-NEXT: call void @check1(i1 [[CMP3]])
1068
+ ; CHECK-NEXT: ret void
1069
+ ; CHECK: if.false:
1070
+ ; CHECK-NEXT: ret void
1071
+ ;
1072
+ %and = and i32 %a , 32
1073
+ %cmp = icmp eq i32 %and , 0
1074
+ br i1 %cmp , label %if.true , label %if.false
1075
+
1076
+ if.true:
1077
+ %cmp2 = icmp ule i32 %a , -33
1078
+ call void @check1 (i1 %cmp2 )
1079
+ %cmp3 = icmp ule i32 %a , -34
1080
+ call void @check1 (i1 %cmp3 )
1081
+ ret void
1082
+
1083
+ if.false:
1084
+ ret void
1085
+ }
1086
+
1087
+ define void @test_icmp_mask_wrong_predicate (i32 %a ) {
1088
+ ; CHECK-LABEL: @test_icmp_mask_wrong_predicate(
1089
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], -2
1090
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 10
1091
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1092
+ ; CHECK: if.true:
1093
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i32 [[A]], 10
1094
+ ; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1095
+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp ule i32 [[A]], 11
1096
+ ; CHECK-NEXT: call void @check1(i1 [[CMP3]])
1097
+ ; CHECK-NEXT: [[CMP4:%.*]] = icmp ult i32 [[A]], 10
1098
+ ; CHECK-NEXT: call void @check1(i1 [[CMP4]])
1099
+ ; CHECK-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[A]], 11
1100
+ ; CHECK-NEXT: call void @check1(i1 [[CMP5]])
1101
+ ; CHECK-NEXT: ret void
1102
+ ; CHECK: if.false:
1103
+ ; CHECK-NEXT: ret void
1104
+ ;
1105
+ %and = and i32 %a , -2
1106
+ %cmp = icmp ne i32 %and , 10
1107
+ br i1 %cmp , label %if.true , label %if.false
1108
+
1109
+ if.true:
1110
+ %cmp2 = icmp uge i32 %a , 10
1111
+ call void @check1 (i1 %cmp2 )
1112
+ %cmp3 = icmp ule i32 %a , 11
1113
+ call void @check1 (i1 %cmp3 )
1114
+ %cmp4 = icmp ult i32 %a , 10
1115
+ call void @check1 (i1 %cmp4 )
1116
+ %cmp5 = icmp ugt i32 %a , 11
1117
+ call void @check1 (i1 %cmp5 )
1118
+ ret void
1119
+
1120
+ if.false:
1121
+ ret void
1122
+ }
1123
+
992
1124
attributes #4 = { noreturn }
0 commit comments