1557 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4; Combine equality comparisons of adjacent extracted integers parts into5; a comparison of a larger part. Start with some examples...6 7declare void @use.i32(i32)8declare void @use.i8(i8)9declare void @use.i1(i1)10 11define i1 @eq_10(i32 %x, i32 %y) {12; CHECK-LABEL: @eq_10(13; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i1614; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[Y:%.*]] to i1615; CHECK-NEXT: [[C_10:%.*]] = icmp eq i16 [[TMP1]], [[TMP2]]16; CHECK-NEXT: ret i1 [[C_10]]17;18 %x.0 = trunc i32 %x to i819 %x.321 = lshr i32 %x, 820 %x.1 = trunc i32 %x.321 to i821 %y.0 = trunc i32 %y to i822 %y.321 = lshr i32 %y, 823 %y.1 = trunc i32 %y.321 to i824 %c.0 = icmp eq i8 %x.0, %y.025 %c.1 = icmp eq i8 %x.1, %y.126 %c.10 = and i1 %c.0, %c.127 ret i1 %c.1028}29 30define i1 @eq_210(i32 %x, i32 %y) {31; CHECK-LABEL: @eq_210(32; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i2433; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[Y:%.*]] to i2434; CHECK-NEXT: [[C_210:%.*]] = icmp eq i24 [[TMP1]], [[TMP2]]35; CHECK-NEXT: ret i1 [[C_210]]36;37 %x.0 = trunc i32 %x to i838 %x.321 = lshr i32 %x, 839 %x.1 = trunc i32 %x.321 to i840 %x.32 = lshr i32 %x, 1641 %x.2 = trunc i32 %x.32 to i842 %y.0 = trunc i32 %y to i843 %y.321 = lshr i32 %y, 844 %y.1 = trunc i32 %y.321 to i845 %y.32 = lshr i32 %y, 1646 %y.2 = trunc i32 %y.32 to i847 %c.0 = icmp eq i8 %x.0, %y.048 %c.1 = icmp eq i8 %x.1, %y.149 %c.2 = icmp eq i8 %x.2, %y.250 %c.10 = and i1 %c.0, %c.151 %c.210 = and i1 %c.2, %c.1052 ret i1 %c.21053}54 55define i1 @eq_3210(i32 %x, i32 %y) {56; CHECK-LABEL: @eq_3210(57; CHECK-NEXT: [[C_3210:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]58; CHECK-NEXT: ret i1 [[C_3210]]59;60 %x.0 = trunc i32 %x to i861 %x.321 = lshr i32 %x, 862 %x.1 = trunc i32 %x.321 to i863 %x.32 = lshr i32 %x, 1664 %x.2 = trunc i32 %x.32 to i865 %x.3.ext = lshr i32 %x, 2466 %x.3 = trunc i32 %x.3.ext to i867 %y.0 = trunc i32 %y to i868 %y.321 = lshr i32 %y, 869 %y.1 = trunc i32 %y.321 to i870 %y.32 = lshr i32 %y, 1671 %y.2 = trunc i32 %y.32 to i872 %y.3.ext = lshr i32 %y, 2473 %y.3 = trunc i32 %y.3.ext to i874 %c.0 = icmp eq i8 %x.0, %y.075 %c.1 = icmp eq i8 %x.1, %y.176 %c.2 = icmp eq i8 %x.2, %y.277 %c.3 = icmp eq i8 %x.3, %y.378 %c.10 = and i1 %c.0, %c.179 %c.210 = and i1 %c.2, %c.1080 %c.3210 = and i1 %c.3, %c.21081 ret i1 %c.321082}83 84define i1 @eq_21(i32 %x, i32 %y) {85; CHECK-LABEL: @eq_21(86; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 887; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i1688; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[Y:%.*]], 889; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i1690; CHECK-NEXT: [[C_210:%.*]] = icmp eq i16 [[TMP2]], [[TMP4]]91; CHECK-NEXT: ret i1 [[C_210]]92;93 %x.321 = lshr i32 %x, 894 %x.1 = trunc i32 %x.321 to i895 %x.32 = lshr i32 %x, 1696 %x.2 = trunc i32 %x.32 to i897 %y.321 = lshr i32 %y, 898 %y.1 = trunc i32 %y.321 to i899 %y.32 = lshr i32 %y, 16100 %y.2 = trunc i32 %y.32 to i8101 %c.1 = icmp eq i8 %x.1, %y.1102 %c.2 = icmp eq i8 %x.2, %y.2103 %c.210 = and i1 %c.2, %c.1104 ret i1 %c.210105}106 107; Test commuted variants of eq_21.108 109define i1 @eq_21_comm_and(i32 %x, i32 %y) {110; CHECK-LABEL: @eq_21_comm_and(111; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8112; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16113; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[Y:%.*]], 8114; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16115; CHECK-NEXT: [[C_210:%.*]] = icmp eq i16 [[TMP2]], [[TMP4]]116; CHECK-NEXT: ret i1 [[C_210]]117;118 %x.321 = lshr i32 %x, 8119 %x.1 = trunc i32 %x.321 to i8120 %x.32 = lshr i32 %x, 16121 %x.2 = trunc i32 %x.32 to i8122 %y.321 = lshr i32 %y, 8123 %y.1 = trunc i32 %y.321 to i8124 %y.32 = lshr i32 %y, 16125 %y.2 = trunc i32 %y.32 to i8126 %c.1 = icmp eq i8 %x.1, %y.1127 %c.2 = icmp eq i8 %x.2, %y.2128 %c.210 = and i1 %c.1, %c.2129 ret i1 %c.210130}131 132define i1 @eq_21_comm_eq(i32 %x, i32 %y) {133; CHECK-LABEL: @eq_21_comm_eq(134; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[Y:%.*]], 8135; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16136; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[X:%.*]], 8137; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16138; CHECK-NEXT: [[C_210:%.*]] = icmp eq i16 [[TMP2]], [[TMP4]]139; CHECK-NEXT: ret i1 [[C_210]]140;141 %x.321 = lshr i32 %x, 8142 %x.1 = trunc i32 %x.321 to i8143 %x.32 = lshr i32 %x, 16144 %x.2 = trunc i32 %x.32 to i8145 %y.321 = lshr i32 %y, 8146 %y.1 = trunc i32 %y.321 to i8147 %y.32 = lshr i32 %y, 16148 %y.2 = trunc i32 %y.32 to i8149 %c.1 = icmp eq i8 %x.1, %y.1150 %c.2 = icmp eq i8 %y.2, %x.2151 %c.210 = and i1 %c.2, %c.1152 ret i1 %c.210153}154 155define i1 @eq_21_comm_eq2(i32 %x, i32 %y) {156; CHECK-LABEL: @eq_21_comm_eq2(157; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8158; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16159; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[Y:%.*]], 8160; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16161; CHECK-NEXT: [[C_210:%.*]] = icmp eq i16 [[TMP2]], [[TMP4]]162; CHECK-NEXT: ret i1 [[C_210]]163;164 %x.321 = lshr i32 %x, 8165 %x.1 = trunc i32 %x.321 to i8166 %x.32 = lshr i32 %x, 16167 %x.2 = trunc i32 %x.32 to i8168 %y.321 = lshr i32 %y, 8169 %y.1 = trunc i32 %y.321 to i8170 %y.32 = lshr i32 %y, 16171 %y.2 = trunc i32 %y.32 to i8172 %c.1 = icmp eq i8 %y.1, %x.1173 %c.2 = icmp eq i8 %x.2, %y.2174 %c.210 = and i1 %c.2, %c.1175 ret i1 %c.210176}177 178; Test vector variant.179 180define <2x i1> @eq_21_vector(<2x i32> %x, <2x i32> %y) {181; CHECK-LABEL: @eq_21_vector(182; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X:%.*]], splat (i32 8)183; CHECK-NEXT: [[TMP2:%.*]] = trunc <2 x i32> [[TMP1]] to <2 x i16>184; CHECK-NEXT: [[TMP3:%.*]] = lshr <2 x i32> [[Y:%.*]], splat (i32 8)185; CHECK-NEXT: [[TMP4:%.*]] = trunc <2 x i32> [[TMP3]] to <2 x i16>186; CHECK-NEXT: [[C_210:%.*]] = icmp eq <2 x i16> [[TMP2]], [[TMP4]]187; CHECK-NEXT: ret <2 x i1> [[C_210]]188;189 %x.321 = lshr <2x i32> %x, <i32 8, i32 8>190 %x.1 = trunc <2x i32> %x.321 to <2x i8>191 %x.32 = lshr <2x i32> %x, <i32 16, i32 16>192 %x.2 = trunc <2x i32> %x.32 to <2x i8>193 %y.321 = lshr <2x i32> %y, <i32 8, i32 8>194 %y.1 = trunc <2x i32> %y.321 to <2x i8>195 %y.32 = lshr <2x i32> %y, <i32 16, i32 16>196 %y.2 = trunc <2x i32> %y.32 to <2x i8>197 %c.1 = icmp eq <2x i8> %x.1, %y.1198 %c.2 = icmp eq <2x i8> %x.2, %y.2199 %c.210 = and <2x i1> %c.2, %c.1200 ret <2 x i1> %c.210201}202 203; Test irregular bit widths. This also tests the case where204; all the involved bit widths and offsets are different.205 206define i1 @eq_irregular_bit_widths(i31 %x, i31 %y) {207; CHECK-LABEL: @eq_irregular_bit_widths(208; CHECK-NEXT: [[TMP1:%.*]] = lshr i31 [[X:%.*]], 7209; CHECK-NEXT: [[TMP2:%.*]] = trunc i31 [[TMP1]] to i11210; CHECK-NEXT: [[TMP3:%.*]] = lshr i31 [[Y:%.*]], 7211; CHECK-NEXT: [[TMP4:%.*]] = trunc i31 [[TMP3]] to i11212; CHECK-NEXT: [[C_210:%.*]] = icmp eq i11 [[TMP2]], [[TMP4]]213; CHECK-NEXT: ret i1 [[C_210]]214;215 %x.321 = lshr i31 %x, 7216 %x.1 = trunc i31 %x.321 to i6217 %x.32 = lshr i31 %x, 13218 %x.2 = trunc i31 %x.32 to i5219 %y.321 = lshr i31 %y, 7220 %y.1 = trunc i31 %y.321 to i6221 %y.32 = lshr i31 %y, 13222 %y.2 = trunc i31 %y.32 to i5223 %c.1 = icmp eq i6 %x.1, %y.1224 %c.2 = icmp eq i5 %x.2, %y.2225 %c.210 = and i1 %c.2, %c.1226 ret i1 %c.210227}228 229; Test variants with extra uses.230 231define i1 @eq_21_extra_use_lshr(i32 %x, i32 %y) {232; CHECK-LABEL: @eq_21_extra_use_lshr(233; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8234; CHECK-NEXT: call void @use.i32(i32 [[X_321]])235; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8236; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16237; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8238; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8239; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8240; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16241; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8242; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]243; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]244; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_1]], [[C_2]]245; CHECK-NEXT: ret i1 [[C_210]]246;247 %x.321 = lshr i32 %x, 8248 call void @use.i32(i32 %x.321)249 %x.1 = trunc i32 %x.321 to i8250 %x.32 = lshr i32 %x, 16251 %x.2 = trunc i32 %x.32 to i8252 %y.321 = lshr i32 %y, 8253 %y.1 = trunc i32 %y.321 to i8254 %y.32 = lshr i32 %y, 16255 %y.2 = trunc i32 %y.32 to i8256 %c.1 = icmp eq i8 %x.1, %y.1257 %c.2 = icmp eq i8 %x.2, %y.2258 %c.210 = and i1 %c.1, %c.2259 ret i1 %c.210260}261 262define i1 @eq_21_extra_use_trunc(i32 %x, i32 %y) {263; CHECK-LABEL: @eq_21_extra_use_trunc(264; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8265; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8266; CHECK-NEXT: call void @use.i8(i8 [[X_1]])267; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16268; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8269; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8270; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8271; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16272; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8273; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]274; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]275; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_1]], [[C_2]]276; CHECK-NEXT: ret i1 [[C_210]]277;278 %x.321 = lshr i32 %x, 8279 %x.1 = trunc i32 %x.321 to i8280 call void @use.i8(i8 %x.1)281 %x.32 = lshr i32 %x, 16282 %x.2 = trunc i32 %x.32 to i8283 %y.321 = lshr i32 %y, 8284 %y.1 = trunc i32 %y.321 to i8285 %y.32 = lshr i32 %y, 16286 %y.2 = trunc i32 %y.32 to i8287 %c.1 = icmp eq i8 %x.1, %y.1288 %c.2 = icmp eq i8 %x.2, %y.2289 %c.210 = and i1 %c.1, %c.2290 ret i1 %c.210291}292 293define i1 @eq_21_extra_use_eq1(i32 %x, i32 %y) {294; CHECK-LABEL: @eq_21_extra_use_eq1(295; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8296; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8297; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16298; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8299; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8300; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8301; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16302; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8303; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]304; CHECK-NEXT: call void @use.i1(i1 [[C_1]])305; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]306; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_1]], [[C_2]]307; CHECK-NEXT: ret i1 [[C_210]]308;309 %x.321 = lshr i32 %x, 8310 %x.1 = trunc i32 %x.321 to i8311 %x.32 = lshr i32 %x, 16312 %x.2 = trunc i32 %x.32 to i8313 %y.321 = lshr i32 %y, 8314 %y.1 = trunc i32 %y.321 to i8315 %y.32 = lshr i32 %y, 16316 %y.2 = trunc i32 %y.32 to i8317 %c.1 = icmp eq i8 %x.1, %y.1318 call void @use.i1(i1 %c.1)319 %c.2 = icmp eq i8 %x.2, %y.2320 %c.210 = and i1 %c.1, %c.2321 ret i1 %c.210322}323 324define i1 @eq_21_extra_use_eq2(i32 %x, i32 %y) {325; CHECK-LABEL: @eq_21_extra_use_eq2(326; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8327; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8328; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16329; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8330; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8331; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8332; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16333; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8334; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]335; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]336; CHECK-NEXT: call void @use.i1(i1 [[C_2]])337; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_1]], [[C_2]]338; CHECK-NEXT: ret i1 [[C_210]]339;340 %x.321 = lshr i32 %x, 8341 %x.1 = trunc i32 %x.321 to i8342 %x.32 = lshr i32 %x, 16343 %x.2 = trunc i32 %x.32 to i8344 %y.321 = lshr i32 %y, 8345 %y.1 = trunc i32 %y.321 to i8346 %y.32 = lshr i32 %y, 16347 %y.2 = trunc i32 %y.32 to i8348 %c.1 = icmp eq i8 %x.1, %y.1349 %c.2 = icmp eq i8 %x.2, %y.2350 call void @use.i1(i1 %c.2)351 %c.210 = and i1 %c.1, %c.2352 ret i1 %c.210353}354 355; Logical and instead of bitwise and.356 357define i1 @eq_21_logical(i32 %x, i32 %y) {358; CHECK-LABEL: @eq_21_logical(359; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8360; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16361; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[Y:%.*]], 8362; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16363; CHECK-NEXT: [[C_210:%.*]] = icmp eq i16 [[TMP2]], [[TMP4]]364; CHECK-NEXT: ret i1 [[C_210]]365;366 %x.321 = lshr i32 %x, 8367 %x.1 = trunc i32 %x.321 to i8368 %x.32 = lshr i32 %x, 16369 %x.2 = trunc i32 %x.32 to i8370 %y.321 = lshr i32 %y, 8371 %y.1 = trunc i32 %y.321 to i8372 %y.32 = lshr i32 %y, 16373 %y.2 = trunc i32 %y.32 to i8374 %c.1 = icmp eq i8 %x.1, %y.1375 %c.2 = icmp eq i8 %x.2, %y.2376 %c.210 = select i1 %c.2, i1 %c.1, i1 false377 ret i1 %c.210378}379 380; Negative tests.381 382define i1 @eq_21_wrong_op1(i32 %x, i32 %y, i32 %z) {383; CHECK-LABEL: @eq_21_wrong_op1(384; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[Z:%.*]], 8385; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8386; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X:%.*]], 16387; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8388; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8389; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8390; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16391; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8392; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]393; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]394; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_2]], [[C_1]]395; CHECK-NEXT: ret i1 [[C_210]]396;397 %x.321 = lshr i32 %z, 8398 %x.1 = trunc i32 %x.321 to i8399 %x.32 = lshr i32 %x, 16400 %x.2 = trunc i32 %x.32 to i8401 %y.321 = lshr i32 %y, 8402 %y.1 = trunc i32 %y.321 to i8403 %y.32 = lshr i32 %y, 16404 %y.2 = trunc i32 %y.32 to i8405 %c.1 = icmp eq i8 %x.1, %y.1406 %c.2 = icmp eq i8 %x.2, %y.2407 %c.210 = and i1 %c.2, %c.1408 ret i1 %c.210409}410 411define i1 @eq_21_wrong_op2(i32 %x, i32 %y, i32 %z) {412; CHECK-LABEL: @eq_21_wrong_op2(413; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8414; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8415; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[Z:%.*]], 16416; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8417; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8418; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8419; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16420; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8421; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]422; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]423; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_2]], [[C_1]]424; CHECK-NEXT: ret i1 [[C_210]]425;426 %x.321 = lshr i32 %x, 8427 %x.1 = trunc i32 %x.321 to i8428 %x.32 = lshr i32 %z, 16429 %x.2 = trunc i32 %x.32 to i8430 %y.321 = lshr i32 %y, 8431 %y.1 = trunc i32 %y.321 to i8432 %y.32 = lshr i32 %y, 16433 %y.2 = trunc i32 %y.32 to i8434 %c.1 = icmp eq i8 %x.1, %y.1435 %c.2 = icmp eq i8 %x.2, %y.2436 %c.210 = and i1 %c.2, %c.1437 ret i1 %c.210438}439 440define i1 @eq_21_wrong_op3(i32 %x, i32 %y, i32 %z) {441; CHECK-LABEL: @eq_21_wrong_op3(442; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8443; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8444; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16445; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8446; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Z:%.*]], 8447; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8448; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y:%.*]], 16449; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8450; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]451; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]452; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_2]], [[C_1]]453; CHECK-NEXT: ret i1 [[C_210]]454;455 %x.321 = lshr i32 %x, 8456 %x.1 = trunc i32 %x.321 to i8457 %x.32 = lshr i32 %x, 16458 %x.2 = trunc i32 %x.32 to i8459 %y.321 = lshr i32 %z, 8460 %y.1 = trunc i32 %y.321 to i8461 %y.32 = lshr i32 %y, 16462 %y.2 = trunc i32 %y.32 to i8463 %c.1 = icmp eq i8 %x.1, %y.1464 %c.2 = icmp eq i8 %x.2, %y.2465 %c.210 = and i1 %c.2, %c.1466 ret i1 %c.210467}468 469define i1 @eq_21_wrong_op4(i32 %x, i32 %y, i32 %z) {470; CHECK-LABEL: @eq_21_wrong_op4(471; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8472; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8473; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16474; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8475; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8476; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8477; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Z:%.*]], 16478; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8479; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]480; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]481; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_2]], [[C_1]]482; CHECK-NEXT: ret i1 [[C_210]]483;484 %x.321 = lshr i32 %x, 8485 %x.1 = trunc i32 %x.321 to i8486 %x.32 = lshr i32 %x, 16487 %x.2 = trunc i32 %x.32 to i8488 %y.321 = lshr i32 %y, 8489 %y.1 = trunc i32 %y.321 to i8490 %y.32 = lshr i32 %z, 16491 %y.2 = trunc i32 %y.32 to i8492 %c.1 = icmp eq i8 %x.1, %y.1493 %c.2 = icmp eq i8 %x.2, %y.2494 %c.210 = and i1 %c.2, %c.1495 ret i1 %c.210496}497 498define i1 @eq_21_wrong_shift1(i32 %x, i32 %y) {499; CHECK-LABEL: @eq_21_wrong_shift1(500; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8501; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8502; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16503; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8504; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 7505; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8506; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16507; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8508; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]509; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]510; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_2]], [[C_1]]511; CHECK-NEXT: ret i1 [[C_210]]512;513 %x.321 = lshr i32 %x, 8514 %x.1 = trunc i32 %x.321 to i8515 %x.32 = lshr i32 %x, 16516 %x.2 = trunc i32 %x.32 to i8517 %y.321 = lshr i32 %y, 7518 %y.1 = trunc i32 %y.321 to i8519 %y.32 = lshr i32 %y, 16520 %y.2 = trunc i32 %y.32 to i8521 %c.1 = icmp eq i8 %x.1, %y.1522 %c.2 = icmp eq i8 %x.2, %y.2523 %c.210 = and i1 %c.2, %c.1524 ret i1 %c.210525}526 527define i1 @eq_21_wrong_shift2(i32 %x, i32 %y) {528; CHECK-LABEL: @eq_21_wrong_shift2(529; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8530; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8531; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16532; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8533; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8534; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8535; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 15536; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8537; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]538; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]539; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_2]], [[C_1]]540; CHECK-NEXT: ret i1 [[C_210]]541;542 %x.321 = lshr i32 %x, 8543 %x.1 = trunc i32 %x.321 to i8544 %x.32 = lshr i32 %x, 16545 %x.2 = trunc i32 %x.32 to i8546 %y.321 = lshr i32 %y, 8547 %y.1 = trunc i32 %y.321 to i8548 %y.32 = lshr i32 %y, 15549 %y.2 = trunc i32 %y.32 to i8550 %c.1 = icmp eq i8 %x.1, %y.1551 %c.2 = icmp eq i8 %x.2, %y.2552 %c.210 = and i1 %c.2, %c.1553 ret i1 %c.210554}555 556define i1 @eq_21_not_adjacent(i32 %x, i32 %y) {557; CHECK-LABEL: @eq_21_not_adjacent(558; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8559; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8560; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 17561; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8562; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8563; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8564; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 17565; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8566; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]567; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]568; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_2]], [[C_1]]569; CHECK-NEXT: ret i1 [[C_210]]570;571 %x.321 = lshr i32 %x, 8572 %x.1 = trunc i32 %x.321 to i8573 %x.32 = lshr i32 %x, 17574 %x.2 = trunc i32 %x.32 to i8575 %y.321 = lshr i32 %y, 8576 %y.1 = trunc i32 %y.321 to i8577 %y.32 = lshr i32 %y, 17578 %y.2 = trunc i32 %y.32 to i8579 %c.1 = icmp eq i8 %x.1, %y.1580 %c.2 = icmp eq i8 %x.2, %y.2581 %c.210 = and i1 %c.2, %c.1582 ret i1 %c.210583}584 585define i1 @eq_shift_in_zeros(i32 %x, i32 %y) {586; CHECK-LABEL: @eq_shift_in_zeros(587; CHECK-NEXT: [[C_210_UNSHIFTED:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]588; CHECK-NEXT: [[C_210:%.*]] = icmp ult i32 [[C_210_UNSHIFTED]], 256589; CHECK-NEXT: ret i1 [[C_210]]590;591 %x.321 = lshr i32 %x, 8592 %x.1 = trunc i32 %x.321 to i8593 %x.32 = lshr i32 %x, 16594 %x.2 = trunc i32 %x.32 to i24595 %y.321 = lshr i32 %y, 8596 %y.1 = trunc i32 %y.321 to i8597 %y.32 = lshr i32 %y, 16598 %y.2 = trunc i32 %y.32 to i24599 %c.1 = icmp eq i8 %x.1, %y.1600 %c.2 = icmp eq i24 %x.2, %y.2601 %c.210 = and i1 %c.2, %c.1602 ret i1 %c.210603}604 605define i1 @eq_21_wrong_pred1(i32 %x, i32 %y) {606; CHECK-LABEL: @eq_21_wrong_pred1(607; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8608; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8609; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16610; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8611; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8612; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8613; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16614; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8615; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]616; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]617; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_2]], [[C_1]]618; CHECK-NEXT: ret i1 [[C_210]]619;620 %x.321 = lshr i32 %x, 8621 %x.1 = trunc i32 %x.321 to i8622 %x.32 = lshr i32 %x, 16623 %x.2 = trunc i32 %x.32 to i8624 %y.321 = lshr i32 %y, 8625 %y.1 = trunc i32 %y.321 to i8626 %y.32 = lshr i32 %y, 16627 %y.2 = trunc i32 %y.32 to i8628 %c.1 = icmp eq i8 %x.1, %y.1629 %c.2 = icmp ne i8 %x.2, %y.2630 %c.210 = and i1 %c.2, %c.1631 ret i1 %c.210632}633 634define i1 @eq_21_wrong_pred2(i32 %x, i32 %y) {635; CHECK-LABEL: @eq_21_wrong_pred2(636; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8637; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8638; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16639; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8640; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8641; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8642; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16643; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8644; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]645; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]646; CHECK-NEXT: [[C_210:%.*]] = and i1 [[C_2]], [[C_1]]647; CHECK-NEXT: ret i1 [[C_210]]648;649 %x.321 = lshr i32 %x, 8650 %x.1 = trunc i32 %x.321 to i8651 %x.32 = lshr i32 %x, 16652 %x.2 = trunc i32 %x.32 to i8653 %y.321 = lshr i32 %y, 8654 %y.1 = trunc i32 %y.321 to i8655 %y.32 = lshr i32 %y, 16656 %y.2 = trunc i32 %y.32 to i8657 %c.1 = icmp ne i8 %x.1, %y.1658 %c.2 = icmp ne i8 %x.2, %y.2659 %c.210 = and i1 %c.2, %c.1660 ret i1 %c.210661}662 663;664; Now the same thing again, but for or ne instead of and eq.665;666 667define i1 @ne_10(i32 %x, i32 %y) {668; CHECK-LABEL: @ne_10(669; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i16670; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[Y:%.*]] to i16671; CHECK-NEXT: [[C_10:%.*]] = icmp ne i16 [[TMP1]], [[TMP2]]672; CHECK-NEXT: ret i1 [[C_10]]673;674 %x.0 = trunc i32 %x to i8675 %x.321 = lshr i32 %x, 8676 %x.1 = trunc i32 %x.321 to i8677 %y.0 = trunc i32 %y to i8678 %y.321 = lshr i32 %y, 8679 %y.1 = trunc i32 %y.321 to i8680 %c.0 = icmp ne i8 %x.0, %y.0681 %c.1 = icmp ne i8 %x.1, %y.1682 %c.10 = or i1 %c.0, %c.1683 ret i1 %c.10684}685 686define i1 @ne_210(i32 %x, i32 %y) {687; CHECK-LABEL: @ne_210(688; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i24689; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[Y:%.*]] to i24690; CHECK-NEXT: [[C_210:%.*]] = icmp ne i24 [[TMP1]], [[TMP2]]691; CHECK-NEXT: ret i1 [[C_210]]692;693 %x.0 = trunc i32 %x to i8694 %x.321 = lshr i32 %x, 8695 %x.1 = trunc i32 %x.321 to i8696 %x.32 = lshr i32 %x, 16697 %x.2 = trunc i32 %x.32 to i8698 %y.0 = trunc i32 %y to i8699 %y.321 = lshr i32 %y, 8700 %y.1 = trunc i32 %y.321 to i8701 %y.32 = lshr i32 %y, 16702 %y.2 = trunc i32 %y.32 to i8703 %c.0 = icmp ne i8 %x.0, %y.0704 %c.1 = icmp ne i8 %x.1, %y.1705 %c.2 = icmp ne i8 %x.2, %y.2706 %c.10 = or i1 %c.0, %c.1707 %c.210 = or i1 %c.2, %c.10708 ret i1 %c.210709}710 711define i1 @ne_3210(i32 %x, i32 %y) {712; CHECK-LABEL: @ne_3210(713; CHECK-NEXT: [[C_3210:%.*]] = icmp ne i32 [[X:%.*]], [[Y:%.*]]714; CHECK-NEXT: ret i1 [[C_3210]]715;716 %x.0 = trunc i32 %x to i8717 %x.321 = lshr i32 %x, 8718 %x.1 = trunc i32 %x.321 to i8719 %x.32 = lshr i32 %x, 16720 %x.2 = trunc i32 %x.32 to i8721 %x.3.ext = lshr i32 %x, 24722 %x.3 = trunc i32 %x.3.ext to i8723 %y.0 = trunc i32 %y to i8724 %y.321 = lshr i32 %y, 8725 %y.1 = trunc i32 %y.321 to i8726 %y.32 = lshr i32 %y, 16727 %y.2 = trunc i32 %y.32 to i8728 %y.3.ext = lshr i32 %y, 24729 %y.3 = trunc i32 %y.3.ext to i8730 %c.0 = icmp ne i8 %x.0, %y.0731 %c.1 = icmp ne i8 %x.1, %y.1732 %c.2 = icmp ne i8 %x.2, %y.2733 %c.3 = icmp ne i8 %x.3, %y.3734 %c.10 = or i1 %c.0, %c.1735 %c.210 = or i1 %c.2, %c.10736 %c.3210 = or i1 %c.3, %c.210737 ret i1 %c.3210738}739 740define i1 @ne_21(i32 %x, i32 %y) {741; CHECK-LABEL: @ne_21(742; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8743; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16744; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[Y:%.*]], 8745; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16746; CHECK-NEXT: [[C_210:%.*]] = icmp ne i16 [[TMP2]], [[TMP4]]747; CHECK-NEXT: ret i1 [[C_210]]748;749 %x.321 = lshr i32 %x, 8750 %x.1 = trunc i32 %x.321 to i8751 %x.32 = lshr i32 %x, 16752 %x.2 = trunc i32 %x.32 to i8753 %y.321 = lshr i32 %y, 8754 %y.1 = trunc i32 %y.321 to i8755 %y.32 = lshr i32 %y, 16756 %y.2 = trunc i32 %y.32 to i8757 %c.1 = icmp ne i8 %x.1, %y.1758 %c.2 = icmp ne i8 %x.2, %y.2759 %c.210 = or i1 %c.2, %c.1760 ret i1 %c.210761}762 763; Test commuted variants of ne_21.764 765define i1 @ne_21_comm_or(i32 %x, i32 %y) {766; CHECK-LABEL: @ne_21_comm_or(767; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8768; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16769; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[Y:%.*]], 8770; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16771; CHECK-NEXT: [[C_210:%.*]] = icmp ne i16 [[TMP2]], [[TMP4]]772; CHECK-NEXT: ret i1 [[C_210]]773;774 %x.321 = lshr i32 %x, 8775 %x.1 = trunc i32 %x.321 to i8776 %x.32 = lshr i32 %x, 16777 %x.2 = trunc i32 %x.32 to i8778 %y.321 = lshr i32 %y, 8779 %y.1 = trunc i32 %y.321 to i8780 %y.32 = lshr i32 %y, 16781 %y.2 = trunc i32 %y.32 to i8782 %c.1 = icmp ne i8 %x.1, %y.1783 %c.2 = icmp ne i8 %x.2, %y.2784 %c.210 = or i1 %c.1, %c.2785 ret i1 %c.210786}787 788define i1 @ne_21_comm_ne(i32 %x, i32 %y) {789; CHECK-LABEL: @ne_21_comm_ne(790; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[Y:%.*]], 8791; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16792; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[X:%.*]], 8793; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16794; CHECK-NEXT: [[C_210:%.*]] = icmp ne i16 [[TMP2]], [[TMP4]]795; CHECK-NEXT: ret i1 [[C_210]]796;797 %x.321 = lshr i32 %x, 8798 %x.1 = trunc i32 %x.321 to i8799 %x.32 = lshr i32 %x, 16800 %x.2 = trunc i32 %x.32 to i8801 %y.321 = lshr i32 %y, 8802 %y.1 = trunc i32 %y.321 to i8803 %y.32 = lshr i32 %y, 16804 %y.2 = trunc i32 %y.32 to i8805 %c.1 = icmp ne i8 %x.1, %y.1806 %c.2 = icmp ne i8 %y.2, %x.2807 %c.210 = or i1 %c.2, %c.1808 ret i1 %c.210809}810 811define i1 @ne_21_comm_ne2(i32 %x, i32 %y) {812; CHECK-LABEL: @ne_21_comm_ne2(813; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8814; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16815; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[Y:%.*]], 8816; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16817; CHECK-NEXT: [[C_210:%.*]] = icmp ne i16 [[TMP2]], [[TMP4]]818; CHECK-NEXT: ret i1 [[C_210]]819;820 %x.321 = lshr i32 %x, 8821 %x.1 = trunc i32 %x.321 to i8822 %x.32 = lshr i32 %x, 16823 %x.2 = trunc i32 %x.32 to i8824 %y.321 = lshr i32 %y, 8825 %y.1 = trunc i32 %y.321 to i8826 %y.32 = lshr i32 %y, 16827 %y.2 = trunc i32 %y.32 to i8828 %c.1 = icmp ne i8 %y.1, %x.1829 %c.2 = icmp ne i8 %x.2, %y.2830 %c.210 = or i1 %c.2, %c.1831 ret i1 %c.210832}833 834; Test vector variant.835 836define <2x i1> @ne_21_vector(<2x i32> %x, <2x i32> %y) {837; CHECK-LABEL: @ne_21_vector(838; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X:%.*]], splat (i32 8)839; CHECK-NEXT: [[TMP2:%.*]] = trunc <2 x i32> [[TMP1]] to <2 x i16>840; CHECK-NEXT: [[TMP3:%.*]] = lshr <2 x i32> [[Y:%.*]], splat (i32 8)841; CHECK-NEXT: [[TMP4:%.*]] = trunc <2 x i32> [[TMP3]] to <2 x i16>842; CHECK-NEXT: [[C_210:%.*]] = icmp ne <2 x i16> [[TMP2]], [[TMP4]]843; CHECK-NEXT: ret <2 x i1> [[C_210]]844;845 %x.321 = lshr <2x i32> %x, <i32 8, i32 8>846 %x.1 = trunc <2x i32> %x.321 to <2x i8>847 %x.32 = lshr <2x i32> %x, <i32 16, i32 16>848 %x.2 = trunc <2x i32> %x.32 to <2x i8>849 %y.321 = lshr <2x i32> %y, <i32 8, i32 8>850 %y.1 = trunc <2x i32> %y.321 to <2x i8>851 %y.32 = lshr <2x i32> %y, <i32 16, i32 16>852 %y.2 = trunc <2x i32> %y.32 to <2x i8>853 %c.1 = icmp ne <2x i8> %x.1, %y.1854 %c.2 = icmp ne <2x i8> %x.2, %y.2855 %c.210 = or <2x i1> %c.2, %c.1856 ret <2 x i1> %c.210857}858 859; Test irregular bit widths. This also tests the case where860; all the involved bit widths or offsets are different.861 862define i1 @ne_irregular_bit_widths(i31 %x, i31 %y) {863; CHECK-LABEL: @ne_irregular_bit_widths(864; CHECK-NEXT: [[TMP1:%.*]] = lshr i31 [[X:%.*]], 7865; CHECK-NEXT: [[TMP2:%.*]] = trunc i31 [[TMP1]] to i11866; CHECK-NEXT: [[TMP3:%.*]] = lshr i31 [[Y:%.*]], 7867; CHECK-NEXT: [[TMP4:%.*]] = trunc i31 [[TMP3]] to i11868; CHECK-NEXT: [[C_210:%.*]] = icmp ne i11 [[TMP2]], [[TMP4]]869; CHECK-NEXT: ret i1 [[C_210]]870;871 %x.321 = lshr i31 %x, 7872 %x.1 = trunc i31 %x.321 to i6873 %x.32 = lshr i31 %x, 13874 %x.2 = trunc i31 %x.32 to i5875 %y.321 = lshr i31 %y, 7876 %y.1 = trunc i31 %y.321 to i6877 %y.32 = lshr i31 %y, 13878 %y.2 = trunc i31 %y.32 to i5879 %c.1 = icmp ne i6 %x.1, %y.1880 %c.2 = icmp ne i5 %x.2, %y.2881 %c.210 = or i1 %c.2, %c.1882 ret i1 %c.210883}884 885; Test variants with extra uses.886 887define i1 @ne_21_extra_use_lshr(i32 %x, i32 %y) {888; CHECK-LABEL: @ne_21_extra_use_lshr(889; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8890; CHECK-NEXT: call void @use.i32(i32 [[X_321]])891; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8892; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16893; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8894; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8895; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8896; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16897; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8898; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]899; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]900; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_1]], [[C_2]]901; CHECK-NEXT: ret i1 [[C_210]]902;903 %x.321 = lshr i32 %x, 8904 call void @use.i32(i32 %x.321)905 %x.1 = trunc i32 %x.321 to i8906 %x.32 = lshr i32 %x, 16907 %x.2 = trunc i32 %x.32 to i8908 %y.321 = lshr i32 %y, 8909 %y.1 = trunc i32 %y.321 to i8910 %y.32 = lshr i32 %y, 16911 %y.2 = trunc i32 %y.32 to i8912 %c.1 = icmp ne i8 %x.1, %y.1913 %c.2 = icmp ne i8 %x.2, %y.2914 %c.210 = or i1 %c.1, %c.2915 ret i1 %c.210916}917 918define i1 @ne_21_extra_use_trunc(i32 %x, i32 %y) {919; CHECK-LABEL: @ne_21_extra_use_trunc(920; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8921; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8922; CHECK-NEXT: call void @use.i8(i8 [[X_1]])923; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16924; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8925; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8926; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8927; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16928; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8929; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]930; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]931; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_1]], [[C_2]]932; CHECK-NEXT: ret i1 [[C_210]]933;934 %x.321 = lshr i32 %x, 8935 %x.1 = trunc i32 %x.321 to i8936 call void @use.i8(i8 %x.1)937 %x.32 = lshr i32 %x, 16938 %x.2 = trunc i32 %x.32 to i8939 %y.321 = lshr i32 %y, 8940 %y.1 = trunc i32 %y.321 to i8941 %y.32 = lshr i32 %y, 16942 %y.2 = trunc i32 %y.32 to i8943 %c.1 = icmp ne i8 %x.1, %y.1944 %c.2 = icmp ne i8 %x.2, %y.2945 %c.210 = or i1 %c.1, %c.2946 ret i1 %c.210947}948 949define i1 @ne_21_extra_use_ne1(i32 %x, i32 %y) {950; CHECK-LABEL: @ne_21_extra_use_ne1(951; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8952; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8953; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16954; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8955; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8956; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8957; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16958; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8959; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]960; CHECK-NEXT: call void @use.i1(i1 [[C_1]])961; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]962; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_1]], [[C_2]]963; CHECK-NEXT: ret i1 [[C_210]]964;965 %x.321 = lshr i32 %x, 8966 %x.1 = trunc i32 %x.321 to i8967 %x.32 = lshr i32 %x, 16968 %x.2 = trunc i32 %x.32 to i8969 %y.321 = lshr i32 %y, 8970 %y.1 = trunc i32 %y.321 to i8971 %y.32 = lshr i32 %y, 16972 %y.2 = trunc i32 %y.32 to i8973 %c.1 = icmp ne i8 %x.1, %y.1974 call void @use.i1(i1 %c.1)975 %c.2 = icmp ne i8 %x.2, %y.2976 %c.210 = or i1 %c.1, %c.2977 ret i1 %c.210978}979 980define i1 @ne_21_extra_use_ne2(i32 %x, i32 %y) {981; CHECK-LABEL: @ne_21_extra_use_ne2(982; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 8983; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i8984; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 16985; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i8986; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 8987; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i8988; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 16989; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i8990; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]991; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]992; CHECK-NEXT: call void @use.i1(i1 [[C_2]])993; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_1]], [[C_2]]994; CHECK-NEXT: ret i1 [[C_210]]995;996 %x.321 = lshr i32 %x, 8997 %x.1 = trunc i32 %x.321 to i8998 %x.32 = lshr i32 %x, 16999 %x.2 = trunc i32 %x.32 to i81000 %y.321 = lshr i32 %y, 81001 %y.1 = trunc i32 %y.321 to i81002 %y.32 = lshr i32 %y, 161003 %y.2 = trunc i32 %y.32 to i81004 %c.1 = icmp ne i8 %x.1, %y.11005 %c.2 = icmp ne i8 %x.2, %y.21006 call void @use.i1(i1 %c.2)1007 %c.210 = or i1 %c.1, %c.21008 ret i1 %c.2101009}1010 1011; Logical or instead of bitwise or.1012 1013define i1 @ne_21_logical(i32 %x, i32 %y) {1014; CHECK-LABEL: @ne_21_logical(1015; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 81016; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i161017; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[Y:%.*]], 81018; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i161019; CHECK-NEXT: [[C_210:%.*]] = icmp ne i16 [[TMP2]], [[TMP4]]1020; CHECK-NEXT: ret i1 [[C_210]]1021;1022 %x.321 = lshr i32 %x, 81023 %x.1 = trunc i32 %x.321 to i81024 %x.32 = lshr i32 %x, 161025 %x.2 = trunc i32 %x.32 to i81026 %y.321 = lshr i32 %y, 81027 %y.1 = trunc i32 %y.321 to i81028 %y.32 = lshr i32 %y, 161029 %y.2 = trunc i32 %y.32 to i81030 %c.1 = icmp ne i8 %x.1, %y.11031 %c.2 = icmp ne i8 %x.2, %y.21032 %c.210 = select i1 %c.2, i1 true, i1 %c.11033 ret i1 %c.2101034}1035 1036; Negative tests.1037 1038define i1 @ne_21_wrong_op1(i32 %x, i32 %y, i32 %z) {1039; CHECK-LABEL: @ne_21_wrong_op1(1040; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[Z:%.*]], 81041; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i81042; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X:%.*]], 161043; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i81044; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 81045; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i81046; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 161047; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i81048; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]1049; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]1050; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_2]], [[C_1]]1051; CHECK-NEXT: ret i1 [[C_210]]1052;1053 %x.321 = lshr i32 %z, 81054 %x.1 = trunc i32 %x.321 to i81055 %x.32 = lshr i32 %x, 161056 %x.2 = trunc i32 %x.32 to i81057 %y.321 = lshr i32 %y, 81058 %y.1 = trunc i32 %y.321 to i81059 %y.32 = lshr i32 %y, 161060 %y.2 = trunc i32 %y.32 to i81061 %c.1 = icmp ne i8 %x.1, %y.11062 %c.2 = icmp ne i8 %x.2, %y.21063 %c.210 = or i1 %c.2, %c.11064 ret i1 %c.2101065}1066 1067define i1 @ne_21_wrong_op2(i32 %x, i32 %y, i32 %z) {1068; CHECK-LABEL: @ne_21_wrong_op2(1069; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 81070; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i81071; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[Z:%.*]], 161072; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i81073; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 81074; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i81075; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 161076; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i81077; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]1078; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]1079; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_2]], [[C_1]]1080; CHECK-NEXT: ret i1 [[C_210]]1081;1082 %x.321 = lshr i32 %x, 81083 %x.1 = trunc i32 %x.321 to i81084 %x.32 = lshr i32 %z, 161085 %x.2 = trunc i32 %x.32 to i81086 %y.321 = lshr i32 %y, 81087 %y.1 = trunc i32 %y.321 to i81088 %y.32 = lshr i32 %y, 161089 %y.2 = trunc i32 %y.32 to i81090 %c.1 = icmp ne i8 %x.1, %y.11091 %c.2 = icmp ne i8 %x.2, %y.21092 %c.210 = or i1 %c.2, %c.11093 ret i1 %c.2101094}1095 1096define i1 @ne_21_wrong_op3(i32 %x, i32 %y, i32 %z) {1097; CHECK-LABEL: @ne_21_wrong_op3(1098; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 81099; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i81100; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 161101; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i81102; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Z:%.*]], 81103; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i81104; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y:%.*]], 161105; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i81106; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]1107; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]1108; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_2]], [[C_1]]1109; CHECK-NEXT: ret i1 [[C_210]]1110;1111 %x.321 = lshr i32 %x, 81112 %x.1 = trunc i32 %x.321 to i81113 %x.32 = lshr i32 %x, 161114 %x.2 = trunc i32 %x.32 to i81115 %y.321 = lshr i32 %z, 81116 %y.1 = trunc i32 %y.321 to i81117 %y.32 = lshr i32 %y, 161118 %y.2 = trunc i32 %y.32 to i81119 %c.1 = icmp ne i8 %x.1, %y.11120 %c.2 = icmp ne i8 %x.2, %y.21121 %c.210 = or i1 %c.2, %c.11122 ret i1 %c.2101123}1124 1125define i1 @ne_21_wrong_op4(i32 %x, i32 %y, i32 %z) {1126; CHECK-LABEL: @ne_21_wrong_op4(1127; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 81128; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i81129; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 161130; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i81131; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 81132; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i81133; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Z:%.*]], 161134; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i81135; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]1136; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]1137; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_2]], [[C_1]]1138; CHECK-NEXT: ret i1 [[C_210]]1139;1140 %x.321 = lshr i32 %x, 81141 %x.1 = trunc i32 %x.321 to i81142 %x.32 = lshr i32 %x, 161143 %x.2 = trunc i32 %x.32 to i81144 %y.321 = lshr i32 %y, 81145 %y.1 = trunc i32 %y.321 to i81146 %y.32 = lshr i32 %z, 161147 %y.2 = trunc i32 %y.32 to i81148 %c.1 = icmp ne i8 %x.1, %y.11149 %c.2 = icmp ne i8 %x.2, %y.21150 %c.210 = or i1 %c.2, %c.11151 ret i1 %c.2101152}1153 1154define i1 @ne_21_wrong_shift1(i32 %x, i32 %y) {1155; CHECK-LABEL: @ne_21_wrong_shift1(1156; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 81157; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i81158; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 161159; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i81160; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 71161; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i81162; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 161163; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i81164; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]1165; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]1166; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_2]], [[C_1]]1167; CHECK-NEXT: ret i1 [[C_210]]1168;1169 %x.321 = lshr i32 %x, 81170 %x.1 = trunc i32 %x.321 to i81171 %x.32 = lshr i32 %x, 161172 %x.2 = trunc i32 %x.32 to i81173 %y.321 = lshr i32 %y, 71174 %y.1 = trunc i32 %y.321 to i81175 %y.32 = lshr i32 %y, 161176 %y.2 = trunc i32 %y.32 to i81177 %c.1 = icmp ne i8 %x.1, %y.11178 %c.2 = icmp ne i8 %x.2, %y.21179 %c.210 = or i1 %c.2, %c.11180 ret i1 %c.2101181}1182 1183define i1 @ne_21_wrong_shift2(i32 %x, i32 %y) {1184; CHECK-LABEL: @ne_21_wrong_shift2(1185; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 81186; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i81187; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 161188; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i81189; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 81190; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i81191; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 151192; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i81193; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]1194; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]1195; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_2]], [[C_1]]1196; CHECK-NEXT: ret i1 [[C_210]]1197;1198 %x.321 = lshr i32 %x, 81199 %x.1 = trunc i32 %x.321 to i81200 %x.32 = lshr i32 %x, 161201 %x.2 = trunc i32 %x.32 to i81202 %y.321 = lshr i32 %y, 81203 %y.1 = trunc i32 %y.321 to i81204 %y.32 = lshr i32 %y, 151205 %y.2 = trunc i32 %y.32 to i81206 %c.1 = icmp ne i8 %x.1, %y.11207 %c.2 = icmp ne i8 %x.2, %y.21208 %c.210 = or i1 %c.2, %c.11209 ret i1 %c.2101210}1211 1212define i1 @ne_21_not_adjacent(i32 %x, i32 %y) {1213; CHECK-LABEL: @ne_21_not_adjacent(1214; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 81215; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i81216; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 171217; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i81218; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 81219; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i81220; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 171221; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i81222; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]1223; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X_2]], [[Y_2]]1224; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_2]], [[C_1]]1225; CHECK-NEXT: ret i1 [[C_210]]1226;1227 %x.321 = lshr i32 %x, 81228 %x.1 = trunc i32 %x.321 to i81229 %x.32 = lshr i32 %x, 171230 %x.2 = trunc i32 %x.32 to i81231 %y.321 = lshr i32 %y, 81232 %y.1 = trunc i32 %y.321 to i81233 %y.32 = lshr i32 %y, 171234 %y.2 = trunc i32 %y.32 to i81235 %c.1 = icmp ne i8 %x.1, %y.11236 %c.2 = icmp ne i8 %x.2, %y.21237 %c.210 = or i1 %c.2, %c.11238 ret i1 %c.2101239}1240 1241define i1 @ne_shift_in_zeros(i32 %x, i32 %y) {1242; CHECK-LABEL: @ne_shift_in_zeros(1243; CHECK-NEXT: [[C_210_UNSHIFTED:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]1244; CHECK-NEXT: [[C_210:%.*]] = icmp ugt i32 [[C_210_UNSHIFTED]], 2551245; CHECK-NEXT: ret i1 [[C_210]]1246;1247 %x.321 = lshr i32 %x, 81248 %x.1 = trunc i32 %x.321 to i81249 %x.32 = lshr i32 %x, 161250 %x.2 = trunc i32 %x.32 to i241251 %y.321 = lshr i32 %y, 81252 %y.1 = trunc i32 %y.321 to i81253 %y.32 = lshr i32 %y, 161254 %y.2 = trunc i32 %y.32 to i241255 %c.1 = icmp ne i8 %x.1, %y.11256 %c.2 = icmp ne i24 %x.2, %y.21257 %c.210 = or i1 %c.2, %c.11258 ret i1 %c.2101259}1260 1261define i1 @ne_21_wrong_pred1(i32 %x, i32 %y) {1262; CHECK-LABEL: @ne_21_wrong_pred1(1263; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 81264; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i81265; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 161266; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i81267; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 81268; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i81269; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 161270; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i81271; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[X_1]], [[Y_1]]1272; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]1273; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_2]], [[C_1]]1274; CHECK-NEXT: ret i1 [[C_210]]1275;1276 %x.321 = lshr i32 %x, 81277 %x.1 = trunc i32 %x.321 to i81278 %x.32 = lshr i32 %x, 161279 %x.2 = trunc i32 %x.32 to i81280 %y.321 = lshr i32 %y, 81281 %y.1 = trunc i32 %y.321 to i81282 %y.32 = lshr i32 %y, 161283 %y.2 = trunc i32 %y.32 to i81284 %c.1 = icmp ne i8 %x.1, %y.11285 %c.2 = icmp eq i8 %x.2, %y.21286 %c.210 = or i1 %c.2, %c.11287 ret i1 %c.2101288}1289 1290define i1 @ne_21_wrong_pred2(i32 %x, i32 %y) {1291; CHECK-LABEL: @ne_21_wrong_pred2(1292; CHECK-NEXT: [[X_321:%.*]] = lshr i32 [[X:%.*]], 81293; CHECK-NEXT: [[X_1:%.*]] = trunc i32 [[X_321]] to i81294; CHECK-NEXT: [[X_32:%.*]] = lshr i32 [[X]], 161295; CHECK-NEXT: [[X_2:%.*]] = trunc i32 [[X_32]] to i81296; CHECK-NEXT: [[Y_321:%.*]] = lshr i32 [[Y:%.*]], 81297; CHECK-NEXT: [[Y_1:%.*]] = trunc i32 [[Y_321]] to i81298; CHECK-NEXT: [[Y_32:%.*]] = lshr i32 [[Y]], 161299; CHECK-NEXT: [[Y_2:%.*]] = trunc i32 [[Y_32]] to i81300; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X_1]], [[Y_1]]1301; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X_2]], [[Y_2]]1302; CHECK-NEXT: [[C_210:%.*]] = or i1 [[C_2]], [[C_1]]1303; CHECK-NEXT: ret i1 [[C_210]]1304;1305 %x.321 = lshr i32 %x, 81306 %x.1 = trunc i32 %x.321 to i81307 %x.32 = lshr i32 %x, 161308 %x.2 = trunc i32 %x.32 to i81309 %y.321 = lshr i32 %y, 81310 %y.1 = trunc i32 %y.321 to i81311 %y.32 = lshr i32 %y, 161312 %y.2 = trunc i32 %y.32 to i81313 %c.1 = icmp eq i8 %x.1, %y.11314 %c.2 = icmp eq i8 %x.2, %y.21315 %c.210 = or i1 %c.2, %c.11316 ret i1 %c.2101317}1318 1319define i1 @eq_optimized_highbits_cmp(i32 %x, i32 %y) {1320; CHECK-LABEL: @eq_optimized_highbits_cmp(1321; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[Y:%.*]], [[X:%.*]]1322; CHECK-NEXT: ret i1 [[R]]1323;1324 %xor = xor i32 %y, %x1325 %cmp_hi = icmp ult i32 %xor, 335544321326 %tx = trunc i32 %x to i251327 %ty = trunc i32 %y to i251328 %cmp_lo = icmp eq i25 %tx, %ty1329 %r = and i1 %cmp_hi, %cmp_lo1330 ret i1 %r1331}1332 1333define i1 @eq_optimized_highbits_cmp_todo_overlapping(i32 %x, i32 %y) {1334; CHECK-LABEL: @eq_optimized_highbits_cmp_todo_overlapping(1335; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]1336; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ult i32 [[XOR]], 167772161337; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i251338; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i251339; CHECK-NEXT: [[CMP_LO:%.*]] = icmp eq i25 [[TX]], [[TY]]1340; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP_HI]], [[CMP_LO]]1341; CHECK-NEXT: ret i1 [[R]]1342;1343 %xor = xor i32 %y, %x1344 %cmp_hi = icmp ult i32 %xor, 167772161345 %tx = trunc i32 %x to i251346 %ty = trunc i32 %y to i251347 %cmp_lo = icmp eq i25 %tx, %ty1348 %r = and i1 %cmp_hi, %cmp_lo1349 ret i1 %r1350}1351 1352define i1 @eq_optimized_highbits_cmp_fail_not_pow2(i32 %x, i32 %y) {1353; CHECK-LABEL: @eq_optimized_highbits_cmp_fail_not_pow2(1354; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]1355; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ult i32 [[XOR]], 167772151356; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i241357; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i241358; CHECK-NEXT: [[CMP_LO:%.*]] = icmp eq i24 [[TX]], [[TY]]1359; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP_HI]], [[CMP_LO]]1360; CHECK-NEXT: ret i1 [[R]]1361;1362 %xor = xor i32 %y, %x1363 %cmp_hi = icmp ult i32 %xor, 167772151364 %tx = trunc i32 %x to i241365 %ty = trunc i32 %y to i241366 %cmp_lo = icmp eq i24 %tx, %ty1367 %r = and i1 %cmp_hi, %cmp_lo1368 ret i1 %r1369}1370 1371define i1 @ne_optimized_highbits_cmp(i32 %x, i32 %y) {1372; CHECK-LABEL: @ne_optimized_highbits_cmp(1373; CHECK-NEXT: [[R:%.*]] = icmp ne i32 [[Y:%.*]], [[X:%.*]]1374; CHECK-NEXT: ret i1 [[R]]1375;1376 %xor = xor i32 %y, %x1377 %cmp_hi = icmp ugt i32 %xor, 167772151378 %tx = trunc i32 %x to i241379 %ty = trunc i32 %y to i241380 %cmp_lo = icmp ne i24 %tx, %ty1381 %r = or i1 %cmp_hi, %cmp_lo1382 ret i1 %r1383}1384 1385define i1 @ne_optimized_highbits_cmp_fail_not_mask(i32 %x, i32 %y) {1386; CHECK-LABEL: @ne_optimized_highbits_cmp_fail_not_mask(1387; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]1388; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ugt i32 [[XOR]], 167772161389; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i241390; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i241391; CHECK-NEXT: [[CMP_LO:%.*]] = icmp ne i24 [[TX]], [[TY]]1392; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP_HI]], [[CMP_LO]]1393; CHECK-NEXT: ret i1 [[R]]1394;1395 %xor = xor i32 %y, %x1396 %cmp_hi = icmp ugt i32 %xor, 167772161397 %tx = trunc i32 %x to i241398 %ty = trunc i32 %y to i241399 %cmp_lo = icmp ne i24 %tx, %ty1400 %r = or i1 %cmp_hi, %cmp_lo1401 ret i1 %r1402}1403 1404define i1 @ne_optimized_highbits_cmp_fail_no_combined_int(i32 %x, i32 %y) {1405; CHECK-LABEL: @ne_optimized_highbits_cmp_fail_no_combined_int(1406; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]1407; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ugt i32 [[XOR]], 167772151408; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i231409; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i231410; CHECK-NEXT: [[CMP_LO:%.*]] = icmp ne i23 [[TX]], [[TY]]1411; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP_HI]], [[CMP_LO]]1412; CHECK-NEXT: ret i1 [[R]]1413;1414 %xor = xor i32 %y, %x1415 %cmp_hi = icmp ugt i32 %xor, 167772151416 %tx = trunc i32 %x to i231417 %ty = trunc i32 %y to i231418 %cmp_lo = icmp ne i23 %tx, %ty1419 %r = or i1 %cmp_hi, %cmp_lo1420 ret i1 %r1421}1422 1423define i1 @ne_optimized_highbits_cmp_todo_overlapping(i32 %x, i32 %y) {1424; CHECK-LABEL: @ne_optimized_highbits_cmp_todo_overlapping(1425; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]1426; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ugt i32 [[XOR]], 83886071427; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i241428; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i241429; CHECK-NEXT: [[CMP_LO:%.*]] = icmp ne i24 [[TX]], [[TY]]1430; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP_HI]], [[CMP_LO]]1431; CHECK-NEXT: ret i1 [[R]]1432;1433 %xor = xor i32 %y, %x1434 %cmp_hi = icmp ugt i32 %xor, 83886071435 %tx = trunc i32 %x to i241436 %ty = trunc i32 %y to i241437 %cmp_lo = icmp ne i24 %tx, %ty1438 %r = or i1 %cmp_hi, %cmp_lo1439 ret i1 %r1440}1441 1442define i1 @and_trunc_i1(i8 %a1, i8 %a2) {1443; CHECK-LABEL: @and_trunc_i1(1444; CHECK-NEXT: [[AND:%.*]] = icmp eq i8 [[A1:%.*]], [[A2:%.*]]1445; CHECK-NEXT: ret i1 [[AND]]1446;1447 %xor = xor i8 %a1, %a21448 %cmp = icmp ult i8 %xor, 21449 %lobit = trunc i8 %xor to i11450 %lobit.inv = xor i1 %lobit, true1451 %and = and i1 %cmp, %lobit.inv1452 ret i1 %and1453}1454 1455define i1 @and_trunc_i1_wrong_const(i8 %a1, i8 %a2) {1456; CHECK-LABEL: @and_trunc_i1_wrong_const(1457; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[A1:%.*]], [[A2:%.*]]1458; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[XOR]], -31459; CHECK-NEXT: [[AND:%.*]] = icmp eq i8 [[TMP1]], 01460; CHECK-NEXT: ret i1 [[AND]]1461;1462 %xor = xor i8 %a1, %a21463 %cmp = icmp ult i8 %xor, 41464 %lobit = trunc i8 %xor to i11465 %lobit.inv = xor i1 %lobit, true1466 %and = and i1 %cmp, %lobit.inv1467 ret i1 %and1468}1469 1470define i1 @and_trunc_i1_wrong_operands(i8 %a1, i8 %a2, i8 %a3) {1471; CHECK-LABEL: @and_trunc_i1_wrong_operands(1472; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[A1:%.*]], [[A2:%.*]]1473; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[XOR]], 21474; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[A1]], [[A3:%.*]]1475; CHECK-NEXT: [[LOBIT:%.*]] = trunc i8 [[XOR2]] to i11476; CHECK-NEXT: [[LOBIT_INV:%.*]] = xor i1 [[LOBIT]], true1477; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[LOBIT_INV]]1478; CHECK-NEXT: ret i1 [[AND]]1479;1480 %xor = xor i8 %a1, %a21481 %cmp = icmp ult i8 %xor, 21482 %xor2 = xor i8 %a1, %a31483 %lobit = trunc i8 %xor2 to i11484 %lobit.inv = xor i1 %lobit, true1485 %and = and i1 %cmp, %lobit.inv1486 ret i1 %and1487}1488 1489define i1 @or_trunc_i1(i64 %a1, i64 %a2) {1490; CHECK-LABEL: @or_trunc_i1(1491; CHECK-NEXT: [[OR:%.*]] = icmp ne i64 [[A2:%.*]], [[A1:%.*]]1492; CHECK-NEXT: ret i1 [[OR]]1493;1494 %xor = xor i64 %a2, %a11495 %cmp = icmp ugt i64 %xor, 11496 %trunc = trunc i64 %xor to i11497 %or = or i1 %cmp, %trunc1498 ret i1 %or1499}1500 1501define i1 @or_trunc_i1_wrong_const(i64 %a1, i64 %a2) {1502; CHECK-LABEL: @or_trunc_i1_wrong_const(1503; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[A2:%.*]], [[A1:%.*]]1504; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[XOR]], 21505; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[XOR]] to i11506; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP]], [[TRUNC]]1507; CHECK-NEXT: ret i1 [[OR]]1508;1509 %xor = xor i64 %a2, %a11510 %cmp = icmp ugt i64 %xor, 21511 %trunc = trunc i64 %xor to i11512 %or = or i1 %cmp, %trunc1513 ret i1 %or1514}1515 1516define i1 @or_trunc_i1_wrong_operands(i64 %a1, i64 %a2, i64 %a3) {1517; CHECK-LABEL: @or_trunc_i1_wrong_operands(1518; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[A2:%.*]], [[A1:%.*]]1519; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[XOR]], 11520; CHECK-NEXT: [[XOR2:%.*]] = xor i64 [[A3:%.*]], [[A1]]1521; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[XOR2]] to i11522; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP]], [[TRUNC]]1523; CHECK-NEXT: ret i1 [[OR]]1524;1525 %xor = xor i64 %a2, %a11526 %cmp = icmp ugt i64 %xor, 11527 %xor2 = xor i64 %a3, %a11528 %trunc = trunc i64 %xor2 to i11529 %or = or i1 %cmp, %trunc1530 ret i1 %or1531}1532 1533define i1 @jv_identical(i64 %arg1, i64 %arg2) {1534; CHECK-LABEL: @jv_identical(1535; CHECK-NEXT: [[ARG1_TRUNC:%.*]] = trunc i64 [[ARG1:%.*]] to i81536; CHECK-NEXT: [[ARG2_TRUNC:%.*]] = trunc i64 [[ARG2:%.*]] to i81537; CHECK-NEXT: [[EQ1:%.*]] = icmp eq i8 [[ARG1_TRUNC]], [[ARG2_TRUNC]]1538; CHECK-NEXT: [[DOTUNSHIFTED:%.*]] = xor i64 [[ARG2]], [[ARG1]]1539; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[DOTUNSHIFTED]], 655361540; CHECK-NEXT: [[AND2:%.*]] = and i1 [[EQ1]], [[TMP1]]1541; CHECK-NEXT: ret i1 [[AND2]]1542;1543 %arg1.trunc = trunc i64 %arg1 to i81544 %arg1.shift = lshr i64 %arg1, 161545 %arg1.shift.trunc = trunc i64 %arg1.shift to i161546 %arg2.trunc = trunc i64 %arg2 to i81547 %arg2.shift = lshr i64 %arg2, 161548 %arg2.shift.trunc = trunc i64 %arg2.shift to i161549 %eq1 = icmp eq i8 %arg1.trunc, %arg2.trunc1550 %eq2 = icmp eq i16 %arg1.shift.trunc, %arg2.shift.trunc1551 %and1 = and i1 %eq1, %eq21552 %xor = xor i64 %arg2, %arg11553 %cmp = icmp ult i64 %xor, 42949672961554 %and2 = and i1 %cmp, %and11555 ret i1 %and21556}1557