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