brintos

brintos / llvm-project-archived public Read only

0
0
Text · 52.7 KiB · 4dc5027 Raw
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