brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.2 KiB · 4f65827 Raw
333 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4declare void @use.i1(i1)5declare void @use.i8(i8)6declare void @use.i16(i16)7 8define i1 @and_test1(ptr %x) {9; CHECK-LABEL: @and_test1(10; CHECK-NEXT:    [[LOAD:%.*]] = load i16, ptr [[X:%.*]], align 411; CHECK-NEXT:    [[OR:%.*]] = icmp eq i16 [[LOAD]], 1779112; CHECK-NEXT:    ret i1 [[OR]]13;14  %load = load i16, ptr %x, align 415  %trunc = trunc i16 %load to i816  %cmp1 = icmp eq i8 %trunc, 12717  %and = and i16 %load, -25618  %cmp2 = icmp eq i16 %and, 1766419  %or = and i1 %cmp1, %cmp220  ret i1 %or21}22 23define i1 @and_test1_logical(ptr %x) {24; CHECK-LABEL: @and_test1_logical(25; CHECK-NEXT:    [[LOAD:%.*]] = load i16, ptr [[X:%.*]], align 426; CHECK-NEXT:    [[OR:%.*]] = icmp eq i16 [[LOAD]], 1779127; CHECK-NEXT:    ret i1 [[OR]]28;29  %load = load i16, ptr %x, align 430  %trunc = trunc i16 %load to i831  %cmp1 = icmp eq i8 %trunc, 12732  %and = and i16 %load, -25633  %cmp2 = icmp eq i16 %and, 1766434  %or = select i1 %cmp1, i1 %cmp2, i1 false35  ret i1 %or36}37 38define <2 x i1> @and_test1_vector(ptr %x) {39; CHECK-LABEL: @and_test1_vector(40; CHECK-NEXT:    [[LOAD:%.*]] = load <2 x i16>, ptr [[X:%.*]], align 441; CHECK-NEXT:    [[OR:%.*]] = icmp eq <2 x i16> [[LOAD]], splat (i16 17791)42; CHECK-NEXT:    ret <2 x i1> [[OR]]43;44  %load = load <2 x i16>, ptr %x, align 445  %trunc = trunc <2 x i16> %load to <2 x i8>46  %cmp1 = icmp eq <2 x i8> %trunc, <i8 127, i8 127>47  %and = and <2 x i16> %load, <i16 -256, i16 -256>48  %cmp2 = icmp eq <2 x i16> %and, <i16 17664, i16 17664>49  %or = and <2 x i1> %cmp1, %cmp250  ret <2 x i1> %or51}52 53define i1 @and_test2(ptr %x) {54; CHECK-LABEL: @and_test2(55; CHECK-NEXT:    [[LOAD:%.*]] = load i16, ptr [[X:%.*]], align 456; CHECK-NEXT:    [[OR:%.*]] = icmp eq i16 [[LOAD]], 3258157; CHECK-NEXT:    ret i1 [[OR]]58;59  %load = load i16, ptr %x, align 460  %and = and i16 %load, -25661  %cmp1 = icmp eq i16 %and, 3251262  %trunc = trunc i16 %load to i863  %cmp2 = icmp eq i8 %trunc, 6964  %or = and i1 %cmp1, %cmp265  ret i1 %or66}67 68define i1 @and_test2_logical(ptr %x) {69; CHECK-LABEL: @and_test2_logical(70; CHECK-NEXT:    [[LOAD:%.*]] = load i16, ptr [[X:%.*]], align 471; CHECK-NEXT:    [[OR:%.*]] = icmp eq i16 [[LOAD]], 3258172; CHECK-NEXT:    ret i1 [[OR]]73;74  %load = load i16, ptr %x, align 475  %and = and i16 %load, -25676  %cmp1 = icmp eq i16 %and, 3251277  %trunc = trunc i16 %load to i878  %cmp2 = icmp eq i8 %trunc, 6979  %or = select i1 %cmp1, i1 %cmp2, i1 false80  ret i1 %or81}82 83define <2 x i1> @and_test2_vector(ptr %x) {84; CHECK-LABEL: @and_test2_vector(85; CHECK-NEXT:    [[LOAD:%.*]] = load <2 x i16>, ptr [[X:%.*]], align 486; CHECK-NEXT:    [[OR:%.*]] = icmp eq <2 x i16> [[LOAD]], splat (i16 32581)87; CHECK-NEXT:    ret <2 x i1> [[OR]]88;89  %load = load <2 x i16>, ptr %x, align 490  %and = and <2 x i16> %load, <i16 -256, i16 -256>91  %cmp1 = icmp eq <2 x i16> %and, <i16 32512, i16 32512>92  %trunc = trunc <2 x i16> %load to <2 x i8>93  %cmp2 = icmp eq <2 x i8> %trunc, <i8 69, i8 69>94  %or = and <2 x i1> %cmp1, %cmp295  ret <2 x i1> %or96}97 98define i1 @or_basic(i16 %load) {99; CHECK-LABEL: @or_basic(100; CHECK-NEXT:    [[OR:%.*]] = icmp ne i16 [[LOAD:%.*]], 17791101; CHECK-NEXT:    ret i1 [[OR]]102;103  %trunc = trunc i16 %load to i8104  %cmp1 = icmp ne i8 %trunc, 127105  %and = and i16 %load, -256106  %cmp2 = icmp ne i16 %and, 17664107  %or = or i1 %cmp1, %cmp2108  ret i1 %or109}110 111define i1 @or_basic_commuted(i16 %load) {112; CHECK-LABEL: @or_basic_commuted(113; CHECK-NEXT:    [[OR:%.*]] = icmp ne i16 [[LOAD:%.*]], 32581114; CHECK-NEXT:    ret i1 [[OR]]115;116  %and = and i16 %load, -256117  %cmp1 = icmp ne i16 %and, 32512118  %trunc = trunc i16 %load to i8119  %cmp2 = icmp ne i8 %trunc, 69120  %or = or i1 %cmp1, %cmp2121  ret i1 %or122}123 124define <2 x i1> @or_vector(<2 x i16> %load) {125; CHECK-LABEL: @or_vector(126; CHECK-NEXT:    [[OR:%.*]] = icmp ne <2 x i16> [[LOAD:%.*]], splat (i16 17791)127; CHECK-NEXT:    ret <2 x i1> [[OR]]128;129  %trunc = trunc <2 x i16> %load to <2 x i8>130  %cmp1 = icmp ne <2 x i8> %trunc, <i8 127, i8 127>131  %and = and <2 x i16> %load, <i16 -256, i16 -256>132  %cmp2 = icmp ne <2 x i16> %and, <i16 17664, i16 17664>133  %or = or <2 x i1> %cmp1, %cmp2134  ret <2 x i1> %or135}136 137define i1 @or_nontrivial_mask1(i16 %load) {138; CHECK-LABEL: @or_nontrivial_mask1(139; CHECK-NEXT:    [[TMP1:%.*]] = and i16 [[LOAD:%.*]], 4095140; CHECK-NEXT:    [[OR:%.*]] = icmp ne i16 [[TMP1]], 1407141; CHECK-NEXT:    ret i1 [[OR]]142;143  %trunc = trunc i16 %load to i8144  %cmp1 = icmp ne i8 %trunc, 127145  %and = and i16 %load, 3840146  %cmp2 = icmp ne i16 %and, 1280147  %or = or i1 %cmp1, %cmp2148  ret i1 %or149}150 151define i1 @or_nontrivial_mask2(i16 %load) {152; CHECK-LABEL: @or_nontrivial_mask2(153; CHECK-NEXT:    [[TMP1:%.*]] = and i16 [[LOAD:%.*]], -3841154; CHECK-NEXT:    [[OR:%.*]] = icmp ne i16 [[TMP1]], 20607155; CHECK-NEXT:    ret i1 [[OR]]156;157  %trunc = trunc i16 %load to i8158  %cmp1 = icmp ne i8 %trunc, 127159  %and = and i16 %load, -4096160  %cmp2 = icmp ne i16 %and, 20480161  %or = or i1 %cmp1, %cmp2162  ret i1 %or163}164 165define i1 @or_extra_use1(i16 %load) {166; CHECK-LABEL: @or_extra_use1(167; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i16 [[LOAD:%.*]] to i8168; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 [[TRUNC]], 127169; CHECK-NEXT:    call void @use.i1(i1 [[CMP1]])170; CHECK-NEXT:    [[AND:%.*]] = and i16 [[LOAD]], -4096171; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i16 [[AND]], 20480172; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]]173; CHECK-NEXT:    ret i1 [[OR]]174;175  %trunc = trunc i16 %load to i8176  %cmp1 = icmp ne i8 %trunc, 127177  call void @use.i1(i1 %cmp1)178  %and = and i16 %load, -4096179  %cmp2 = icmp ne i16 %and, 20480180  %or = or i1 %cmp1, %cmp2181  ret i1 %or182}183 184define i1 @or_extra_use2(i16 %load) {185; CHECK-LABEL: @or_extra_use2(186; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i16 [[LOAD:%.*]] to i8187; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 [[TRUNC]], 127188; CHECK-NEXT:    [[AND:%.*]] = and i16 [[LOAD]], -4096189; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i16 [[AND]], 20480190; CHECK-NEXT:    call void @use.i1(i1 [[CMP2]])191; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]]192; CHECK-NEXT:    ret i1 [[OR]]193;194  %trunc = trunc i16 %load to i8195  %cmp1 = icmp ne i8 %trunc, 127196  %and = and i16 %load, -4096197  %cmp2 = icmp ne i16 %and, 20480198  call void @use.i1(i1 %cmp2)199  %or = or i1 %cmp1, %cmp2200  ret i1 %or201}202 203define i1 @or_extra_use3(i16 %load) {204; CHECK-LABEL: @or_extra_use3(205; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i16 [[LOAD:%.*]] to i8206; CHECK-NEXT:    call void @use.i8(i8 [[TRUNC]])207; CHECK-NEXT:    [[TMP1:%.*]] = and i16 [[LOAD]], -3841208; CHECK-NEXT:    [[OR:%.*]] = icmp ne i16 [[TMP1]], 20607209; CHECK-NEXT:    ret i1 [[OR]]210;211  %trunc = trunc i16 %load to i8212  call void @use.i8(i8 %trunc)213  %cmp1 = icmp ne i8 %trunc, 127214  %and = and i16 %load, -4096215  %cmp2 = icmp ne i16 %and, 20480216  %or = or i1 %cmp1, %cmp2217  ret i1 %or218}219 220define i1 @or_extra_use4(i16 %load) {221; CHECK-LABEL: @or_extra_use4(222; CHECK-NEXT:    [[AND:%.*]] = and i16 [[LOAD:%.*]], -4096223; CHECK-NEXT:    call void @use.i16(i16 [[AND]])224; CHECK-NEXT:    [[TMP1:%.*]] = and i16 [[LOAD]], -3841225; CHECK-NEXT:    [[OR:%.*]] = icmp ne i16 [[TMP1]], 20607226; CHECK-NEXT:    ret i1 [[OR]]227;228  %trunc = trunc i16 %load to i8229  %cmp1 = icmp ne i8 %trunc, 127230  %and = and i16 %load, -4096231  call void @use.i16(i16 %and)232  %cmp2 = icmp ne i16 %and, 20480233  %or = or i1 %cmp1, %cmp2234  ret i1 %or235}236 237define i1 @or_wrong_pred1(i16 %load) {238; CHECK-LABEL: @or_wrong_pred1(239; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i16 [[LOAD:%.*]] to i8240; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[TRUNC]], 127241; CHECK-NEXT:    [[AND:%.*]] = and i16 [[LOAD]], -256242; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i16 [[AND]], 17664243; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]]244; CHECK-NEXT:    ret i1 [[OR]]245;246  %trunc = trunc i16 %load to i8247  %cmp1 = icmp eq i8 %trunc, 127248  %and = and i16 %load, -256249  %cmp2 = icmp ne i16 %and, 17664250  %or = or i1 %cmp1, %cmp2251  ret i1 %or252}253 254define i1 @or_wrong_pred2(i16 %load) {255; CHECK-LABEL: @or_wrong_pred2(256; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i16 [[LOAD:%.*]] to i8257; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 [[TRUNC]], 127258; CHECK-NEXT:    [[AND:%.*]] = and i16 [[LOAD]], -256259; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i16 [[AND]], 17664260; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]]261; CHECK-NEXT:    ret i1 [[OR]]262;263  %trunc = trunc i16 %load to i8264  %cmp1 = icmp ne i8 %trunc, 127265  %and = and i16 %load, -256266  %cmp2 = icmp eq i16 %and, 17664267  %or = or i1 %cmp1, %cmp2268  ret i1 %or269}270 271define i1 @or_wrong_pred3(i16 %load) {272; CHECK-LABEL: @or_wrong_pred3(273; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i16 [[LOAD:%.*]] to i8274; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[TRUNC]], 127275; CHECK-NEXT:    [[AND:%.*]] = and i16 [[LOAD]], -256276; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i16 [[AND]], 17664277; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]]278; CHECK-NEXT:    ret i1 [[OR]]279;280  %trunc = trunc i16 %load to i8281  %cmp1 = icmp eq i8 %trunc, 127282  %and = and i16 %load, -256283  %cmp2 = icmp eq i16 %and, 17664284  %or = or i1 %cmp1, %cmp2285  ret i1 %or286}287 288define i1 @or_wrong_op(i16 %load, i16 %other) {289; CHECK-LABEL: @or_wrong_op(290; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i16 [[LOAD:%.*]] to i8291; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 [[TRUNC]], 127292; CHECK-NEXT:    [[AND:%.*]] = and i16 [[OTHER:%.*]], -256293; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i16 [[AND]], 17664294; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]]295; CHECK-NEXT:    ret i1 [[OR]]296;297  %trunc = trunc i16 %load to i8298  %cmp1 = icmp ne i8 %trunc, 127299  %and = and i16 %other, -256300  %cmp2 = icmp ne i16 %and, 17664301  %or = or i1 %cmp1, %cmp2302  ret i1 %or303}304 305define i1 @or_wrong_const1(i16 %load) {306; CHECK-LABEL: @or_wrong_const1(307; CHECK-NEXT:    ret i1 true308;309  %trunc = trunc i16 %load to i8310  %cmp1 = icmp ne i8 %trunc, 127311  %and = and i16 %load, -256312  %cmp2 = icmp ne i16 %and, 17665313  %or = or i1 %cmp1, %cmp2314  ret i1 %or315}316 317define i1 @or_wrong_const2(i16 %load) {318; CHECK-LABEL: @or_wrong_const2(319; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i16 [[LOAD:%.*]] to i8320; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 [[TRUNC]], 127321; CHECK-NEXT:    [[AND:%.*]] = and i16 [[LOAD]], -255322; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i16 [[AND]], 17665323; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]]324; CHECK-NEXT:    ret i1 [[OR]]325;326  %trunc = trunc i16 %load to i8327  %cmp1 = icmp ne i8 %trunc, 127328  %and = and i16 %load, -255329  %cmp2 = icmp ne i16 %and, 17665330  %or = or i1 %cmp1, %cmp2331  ret i1 %or332}333