@@ -1034,6 +1034,228 @@ define i1 @icmp_ne_bool_1(ptr %ptr) {
1034
1034
ret i1 %cmp
1035
1035
}
1036
1036
1037
+ ; Tests from PR65073
1038
+ define i1 @icmp_ne_zext_eq_zero (i32 %a ) {
1039
+ ; CHECK-LABEL: @icmp_ne_zext_eq_zero(
1040
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0
1041
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1042
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1043
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1044
+ ;
1045
+ %cmp = icmp eq i32 %a , 0
1046
+ %conv = zext i1 %cmp to i32
1047
+ %cmp1 = icmp ne i32 %conv , %a
1048
+ ret i1 %cmp1
1049
+ }
1050
+
1051
+ define i1 @icmp_ne_zext_ne_zero (i32 %a ) {
1052
+ ; CHECK-LABEL: @icmp_ne_zext_ne_zero(
1053
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 0
1054
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1055
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1056
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1057
+ ;
1058
+ %cmp = icmp ne i32 %a , 0
1059
+ %conv = zext i1 %cmp to i32
1060
+ %cmp1 = icmp ne i32 %conv , %a
1061
+ ret i1 %cmp1
1062
+ }
1063
+
1064
+ define i1 @icmp_eq_zext_eq_zero (i32 %a ) {
1065
+ ; CHECK-LABEL: @icmp_eq_zext_eq_zero(
1066
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0
1067
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1068
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1069
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1070
+ ;
1071
+ %cmp = icmp eq i32 %a , 0
1072
+ %conv = zext i1 %cmp to i32
1073
+ %cmp1 = icmp eq i32 %conv , %a
1074
+ ret i1 %cmp1
1075
+ }
1076
+
1077
+ define i1 @icmp_eq_zext_ne_zero (i32 %a ) {
1078
+ ; CHECK-LABEL: @icmp_eq_zext_ne_zero(
1079
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 0
1080
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1081
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1082
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1083
+ ;
1084
+ %cmp = icmp ne i32 %a , 0
1085
+ %conv = zext i1 %cmp to i32
1086
+ %cmp1 = icmp eq i32 %conv , %a
1087
+ ret i1 %cmp1
1088
+ }
1089
+
1090
+ define i1 @icmp_ne_zext_eq_one (i32 %a ) {
1091
+ ; CHECK-LABEL: @icmp_ne_zext_eq_one(
1092
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 1
1093
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1094
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1095
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1096
+ ;
1097
+ %cmp = icmp eq i32 %a , 1
1098
+ %conv = zext i1 %cmp to i32
1099
+ %cmp1 = icmp ne i32 %conv , %a
1100
+ ret i1 %cmp1
1101
+ }
1102
+
1103
+ define i1 @icmp_ne_zext_ne_one (i32 %a ) {
1104
+ ; CHECK-LABEL: @icmp_ne_zext_ne_one(
1105
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 1
1106
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1107
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1108
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1109
+ ;
1110
+ %cmp = icmp ne i32 %a , 1
1111
+ %conv = zext i1 %cmp to i32
1112
+ %cmp1 = icmp ne i32 %conv , %a
1113
+ ret i1 %cmp1
1114
+ }
1115
+
1116
+ define i1 @icmp_eq_zext_eq_one (i32 %a ) {
1117
+ ; CHECK-LABEL: @icmp_eq_zext_eq_one(
1118
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 1
1119
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1120
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1121
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1122
+ ;
1123
+ %cmp = icmp eq i32 %a , 1
1124
+ %conv = zext i1 %cmp to i32
1125
+ %cmp1 = icmp eq i32 %conv , %a
1126
+ ret i1 %cmp1
1127
+ }
1128
+
1129
+ define i1 @icmp_eq_zext_ne_one (i32 %a ) {
1130
+ ; CHECK-LABEL: @icmp_eq_zext_ne_one(
1131
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 1
1132
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1133
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1134
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1135
+ ;
1136
+ %cmp = icmp ne i32 %a , 1
1137
+ %conv = zext i1 %cmp to i32
1138
+ %cmp1 = icmp eq i32 %conv , %a
1139
+ ret i1 %cmp1
1140
+ }
1141
+
1142
+ define i1 @icmp_ne_zext_eq_non_boolean (i32 %a ) {
1143
+ ; CHECK-LABEL: @icmp_ne_zext_eq_non_boolean(
1144
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 2
1145
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1146
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1147
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1148
+ ;
1149
+ %cmp = icmp eq i32 %a , 2
1150
+ %conv = zext i1 %cmp to i32
1151
+ %cmp1 = icmp ne i32 %conv , %a
1152
+ ret i1 %cmp1
1153
+ }
1154
+
1155
+ define i1 @icmp_ne_zext_ne_non_boolean (i32 %a ) {
1156
+ ; CHECK-LABEL: @icmp_ne_zext_ne_non_boolean(
1157
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 2
1158
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1159
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1160
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1161
+ ;
1162
+ %cmp = icmp ne i32 %a , 2
1163
+ %conv = zext i1 %cmp to i32
1164
+ %cmp1 = icmp ne i32 %conv , %a
1165
+ ret i1 %cmp1
1166
+ }
1167
+
1168
+ define i1 @icmp_eq_zext_eq_non_boolean (i32 %a ) {
1169
+ ; CHECK-LABEL: @icmp_eq_zext_eq_non_boolean(
1170
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 2
1171
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1172
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1173
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1174
+ ;
1175
+ %cmp = icmp eq i32 %a , 2
1176
+ %conv = zext i1 %cmp to i32
1177
+ %cmp1 = icmp eq i32 %conv , %a
1178
+ ret i1 %cmp1
1179
+ }
1180
+
1181
+ define i1 @icmp_eq_zext_ne_non_boolean (i32 %a ) {
1182
+ ; CHECK-LABEL: @icmp_eq_zext_ne_non_boolean(
1183
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 2
1184
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
1185
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1186
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1187
+ ;
1188
+ %cmp = icmp ne i32 %a , 2
1189
+ %conv = zext i1 %cmp to i32
1190
+ %cmp1 = icmp eq i32 %conv , %a
1191
+ ret i1 %cmp1
1192
+ }
1193
+
1194
+ define <2 x i1 > @icmp_ne_zext_eq_zero_vec (<2 x i32 > %a ) {
1195
+ ; CHECK-LABEL: @icmp_ne_zext_eq_zero_vec(
1196
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], zeroinitializer
1197
+ ; CHECK-NEXT: [[CONV:%.*]] = zext <2 x i1> [[CMP]] to <2 x i32>
1198
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1199
+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1200
+ ;
1201
+ %cmp = icmp eq <2 x i32 > %a , <i32 0 , i32 0 >
1202
+ %conv = zext <2 x i1 > %cmp to <2 x i32 >
1203
+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1204
+ ret <2 x i1 > %cmp1
1205
+ }
1206
+
1207
+ define <2 x i1 > @icmp_ne_zext_ne_zero_vec (<2 x i32 > %a ) {
1208
+ ; CHECK-LABEL: @icmp_ne_zext_ne_zero_vec(
1209
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], zeroinitializer
1210
+ ; CHECK-NEXT: [[CONV:%.*]] = zext <2 x i1> [[CMP]] to <2 x i32>
1211
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1212
+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1213
+ ;
1214
+ %cmp = icmp ne <2 x i32 > %a , <i32 0 , i32 0 >
1215
+ %conv = zext <2 x i1 > %cmp to <2 x i32 >
1216
+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1217
+ ret <2 x i1 > %cmp1
1218
+ }
1219
+
1220
+ define <2 x i1 > @icmp_ne_zext_eq_one_vec (<2 x i32 > %a ) {
1221
+ ; CHECK-LABEL: @icmp_ne_zext_eq_one_vec(
1222
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], <i32 1, i32 1>
1223
+ ; CHECK-NEXT: [[CONV:%.*]] = zext <2 x i1> [[CMP]] to <2 x i32>
1224
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1225
+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1226
+ ;
1227
+ %cmp = icmp eq <2 x i32 > %a , <i32 1 , i32 1 >
1228
+ %conv = zext <2 x i1 > %cmp to <2 x i32 >
1229
+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1230
+ ret <2 x i1 > %cmp1
1231
+ }
1232
+
1233
+ define <2 x i1 > @icmp_ne_zext_ne_one_vec (<2 x i32 > %a ) {
1234
+ ; CHECK-LABEL: @icmp_ne_zext_ne_one_vec(
1235
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], <i32 1, i32 1>
1236
+ ; CHECK-NEXT: [[CONV:%.*]] = zext <2 x i1> [[CMP]] to <2 x i32>
1237
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1238
+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1239
+ ;
1240
+ %cmp = icmp ne <2 x i32 > %a , <i32 1 , i32 1 >
1241
+ %conv = zext <2 x i1 > %cmp to <2 x i32 >
1242
+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1243
+ ret <2 x i1 > %cmp1
1244
+ }
1245
+
1246
+ define <2 x i1 > @icmp_ne_zext_eq_non_boolean_vec (<2 x i32 > %a ) {
1247
+ ; CHECK-LABEL: @icmp_ne_zext_eq_non_boolean_vec(
1248
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], <i32 2, i32 2>
1249
+ ; CHECK-NEXT: [[CONV:%.*]] = zext <2 x i1> [[CMP]] to <2 x i32>
1250
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1251
+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1252
+ ;
1253
+ %cmp = icmp eq <2 x i32 > %a , <i32 2 , i32 2 >
1254
+ %conv = zext <2 x i1 > %cmp to <2 x i32 >
1255
+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1256
+ ret <2 x i1 > %cmp1
1257
+ }
1258
+
1037
1259
!0 = !{i32 1 , i32 6 }
1038
1260
!1 = !{i32 0 , i32 6 }
1039
1261
!2 = !{i8 0 , i8 1 }
0 commit comments