brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.6 KiB · 047b2aa Raw
425 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i1 @or_implies_sle(i8 %x, i8 %y, i1 %other) {5; CHECK-LABEL: @or_implies_sle(6; CHECK-NEXT:    [[OR:%.*]] = or i8 [[X:%.*]], 237; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp sgt i8 [[OR]], [[Y:%.*]]8; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]9; CHECK:       T:10; CHECK-NEXT:    ret i1 true11; CHECK:       F:12; CHECK-NEXT:    ret i1 [[OTHER:%.*]]13;14  %or = or i8 %x, 2315  %cond = icmp sle i8 %or, %y16  br i1 %cond, label %T, label %F17T:18  %r = icmp sle i8 %x, %y19  ret i1 %r20F:21  ret i1 %other22}23 24define i1 @or_implies_sle_fail(i8 %x, i8 %y, i1 %other) {25; CHECK-LABEL: @or_implies_sle_fail(26; CHECK-NEXT:    [[OR:%.*]] = or i8 [[X:%.*]], -3427; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp sgt i8 [[OR]], [[Y:%.*]]28; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]29; CHECK:       T:30; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[X]], [[Y]]31; CHECK-NEXT:    ret i1 [[R]]32; CHECK:       F:33; CHECK-NEXT:    ret i1 [[OTHER:%.*]]34;35  %or = or i8 %x, -3436  %cond = icmp sle i8 %or, %y37  br i1 %cond, label %T, label %F38T:39  %r = icmp sle i8 %x, %y40  ret i1 %r41F:42  ret i1 %other43}44 45define i1 @or_distjoint_implies_ule(i8 %x, i8 %y, i1 %other) {46; CHECK-LABEL: @or_distjoint_implies_ule(47; CHECK-NEXT:    [[X2:%.*]] = or disjoint i8 [[X:%.*]], 2448; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ugt i8 [[X2]], [[Y:%.*]]49; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]50; CHECK:       T:51; CHECK-NEXT:    ret i1 true52; CHECK:       F:53; CHECK-NEXT:    ret i1 [[OTHER:%.*]]54;55  %x1 = or disjoint i8 %x, 2356  %x2 = or disjoint i8 %x, 2457 58  %cond = icmp ule i8 %x2, %y59  br i1 %cond, label %T, label %F60T:61  %r = icmp ule i8 %x1, %y62  ret i1 %r63F:64  ret i1 %other65}66 67define i1 @or_distjoint_implies_ule_fail(i8 %x, i8 %y, i1 %other) {68; CHECK-LABEL: @or_distjoint_implies_ule_fail(69; CHECK-NEXT:    [[X2:%.*]] = or disjoint i8 [[X:%.*]], 2470; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ugt i8 [[X2]], [[Y:%.*]]71; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]72; CHECK:       T:73; CHECK-NEXT:    [[X1:%.*]] = or disjoint i8 [[X]], 2874; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[X1]], [[Y]]75; CHECK-NEXT:    ret i1 [[R]]76; CHECK:       F:77; CHECK-NEXT:    ret i1 [[OTHER:%.*]]78;79  %x1 = or disjoint i8 %x, 2880  %x2 = or disjoint i8 %x, 2481 82  %cond = icmp ule i8 %x2, %y83  br i1 %cond, label %T, label %F84T:85  %r = icmp ule i8 %x1, %y86  ret i1 %r87F:88  ret i1 %other89}90 91define i1 @or_prove_distjoin_implies_ule(i8 %xx, i8 %y, i1 %other) {92; CHECK-LABEL: @or_prove_distjoin_implies_ule(93; CHECK-NEXT:    [[X:%.*]] = and i8 [[XX:%.*]], -1694; CHECK-NEXT:    [[X2:%.*]] = or disjoint i8 [[X]], 1095; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ugt i8 [[X2]], [[Y:%.*]]96; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]97; CHECK:       T:98; CHECK-NEXT:    ret i1 true99; CHECK:       F:100; CHECK-NEXT:    ret i1 [[OTHER:%.*]]101;102  %x = and i8 %xx, -16103  %x1 = or i8 %x, 7104  %x2 = or i8 %x, 10105 106  %cond = icmp ule i8 %x2, %y107  br i1 %cond, label %T, label %F108T:109  %r = icmp ule i8 %x1, %y110  ret i1 %r111F:112  ret i1 %other113}114 115define i1 @src_or_distjoint_implies_sle(i8 %x, i8 %y, i1 %other) {116; CHECK-LABEL: @src_or_distjoint_implies_sle(117; CHECK-NEXT:    [[X2:%.*]] = or disjoint i8 [[X:%.*]], 24118; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp sgt i8 [[X2]], [[Y:%.*]]119; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]120; CHECK:       T:121; CHECK-NEXT:    ret i1 true122; CHECK:       F:123; CHECK-NEXT:    ret i1 [[OTHER:%.*]]124;125  %x1 = or disjoint i8 %x, 23126  %x2 = or disjoint i8 %x, 24127 128  %cond = icmp sle i8 %x2, %y129  br i1 %cond, label %T, label %F130T:131  %r = icmp sle i8 %x1, %y132  ret i1 %r133F:134  ret i1 %other135}136 137define i1 @src_or_distjoint_implies_sle_fail(i8 %x, i8 %y, i1 %other) {138; CHECK-LABEL: @src_or_distjoint_implies_sle_fail(139; CHECK-NEXT:    [[X2:%.*]] = or disjoint i8 [[X:%.*]], 24140; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp sgt i8 [[Y:%.*]], [[X2]]141; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]142; CHECK:       T:143; CHECK-NEXT:    [[X1:%.*]] = or disjoint i8 [[X]], 23144; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[X1]], [[Y]]145; CHECK-NEXT:    ret i1 [[R]]146; CHECK:       F:147; CHECK-NEXT:    ret i1 [[OTHER:%.*]]148;149  %x1 = or disjoint i8 %x, 23150  %x2 = or disjoint i8 %x, 24151 152  %cond = icmp sle i8 %y, %x2153  br i1 %cond, label %T, label %F154T:155  %r = icmp sle i8 %x1, %y156  ret i1 %r157F:158  ret i1 %other159}160 161define i1 @src_addnsw_implies_sle(i8 %x, i8 %y, i1 %other) {162; CHECK-LABEL: @src_addnsw_implies_sle(163; CHECK-NEXT:    [[X2:%.*]] = add nsw i8 [[X:%.*]], 24164; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp sgt i8 [[X2]], [[Y:%.*]]165; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]166; CHECK:       T:167; CHECK-NEXT:    ret i1 true168; CHECK:       F:169; CHECK-NEXT:    ret i1 [[OTHER:%.*]]170;171  %x1 = add nsw i8 %x, 23172  %x2 = add nsw i8 %x, 24173 174  %cond = icmp sle i8 %x2, %y175  br i1 %cond, label %T, label %F176T:177  %r = icmp sle i8 %x1, %y178  ret i1 %r179F:180  ret i1 %other181}182 183define i1 @src_addnsw_implies_sle_fail(i8 %x, i8 %y, i1 %other) {184; CHECK-LABEL: @src_addnsw_implies_sle_fail(185; CHECK-NEXT:    [[X2:%.*]] = add nsw i8 [[X:%.*]], 23186; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp sgt i8 [[X2]], [[Y:%.*]]187; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]188; CHECK:       T:189; CHECK-NEXT:    [[X1:%.*]] = add nsw i8 [[X]], 24190; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[X1]], [[Y]]191; CHECK-NEXT:    ret i1 [[R]]192; CHECK:       F:193; CHECK-NEXT:    ret i1 [[OTHER:%.*]]194;195  %x1 = add nsw i8 %x, 24196  %x2 = add nsw i8 %x, 23197 198  %cond = icmp sle i8 %x2, %y199  br i1 %cond, label %T, label %F200T:201  %r = icmp sle i8 %x1, %y202  ret i1 %r203F:204  ret i1 %other205}206 207define i1 @src_and_implies_ult(i8 %x, i8 %y, i8 %z, i1 %other) {208; CHECK-LABEL: @src_and_implies_ult(209; CHECK-NEXT:    [[COND:%.*]] = icmp ult i8 [[X:%.*]], [[Z:%.*]]210; CHECK-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]211; CHECK:       T:212; CHECK-NEXT:    ret i1 true213; CHECK:       F:214; CHECK-NEXT:    ret i1 [[OTHER:%.*]]215;216  %cond = icmp ult i8 %x, %z217  br i1 %cond, label %T, label %F218T:219  %and = and i8 %z, %x220  %r = icmp ult i8 %and, %z221  ret i1 %r222F:223  ret i1 %other224}225 226define i1 @src_and_implies_ult_fail(i8 %x, i8 %y, i8 %z, i1 %other) {227; CHECK-LABEL: @src_and_implies_ult_fail(228; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ugt i8 [[X:%.*]], [[Z:%.*]]229; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]230; CHECK:       T:231; CHECK-NEXT:    [[AND:%.*]] = and i8 [[X]], [[Z]]232; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[AND]], [[Z]]233; CHECK-NEXT:    ret i1 [[R]]234; CHECK:       F:235; CHECK-NEXT:    ret i1 [[OTHER:%.*]]236;237  %cond = icmp ule i8 %x, %z238  br i1 %cond, label %T, label %F239T:240  %and = and i8 %x, %z241  %r = icmp ult i8 %and, %z242  ret i1 %r243F:244  ret i1 %other245}246 247define i1 @src_and_implies_slt_fail(i8 %x, i8 %y, i8 %z, i1 %other) {248; CHECK-LABEL: @src_and_implies_slt_fail(249; CHECK-NEXT:    [[COND:%.*]] = icmp slt i8 [[X:%.*]], [[Z:%.*]]250; CHECK-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]251; CHECK:       T:252; CHECK-NEXT:    [[AND:%.*]] = and i8 [[X]], [[Y:%.*]]253; CHECK-NEXT:    [[R:%.*]] = icmp slt i8 [[AND]], [[Z]]254; CHECK-NEXT:    ret i1 [[R]]255; CHECK:       F:256; CHECK-NEXT:    ret i1 [[OTHER:%.*]]257;258  %cond = icmp slt i8 %x, %z259  br i1 %cond, label %T, label %F260T:261  %and = and i8 %x, %y262  %r = icmp slt i8 %and, %z263  ret i1 %r264F:265  ret i1 %other266}267 268define i1 @src_or_implies_ule(i8 %x, i8 %y, i8 %z, i1 %other) {269; CHECK-LABEL: @src_or_implies_ule(270; CHECK-NEXT:    [[OR:%.*]] = or i8 [[Y:%.*]], [[X:%.*]]271; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ult i8 [[Z:%.*]], [[OR]]272; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]273; CHECK:       T:274; CHECK-NEXT:    ret i1 true275; CHECK:       F:276; CHECK-NEXT:    ret i1 [[OTHER:%.*]]277;278  %or = or i8 %y, %x279  %cond = icmp uge i8 %z, %or280  br i1 %cond, label %T, label %F281T:282  %r = icmp ule i8 %x, %z283  ret i1 %r284F:285  ret i1 %other286}287 288define i1 @src_or_implies_false_ugt_todo(i8 %x, i8 %y, i8 %z, i1 %other) {289; CHECK-LABEL: @src_or_implies_false_ugt_todo(290; CHECK-NEXT:    [[OR:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]291; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i8 [[OR]], [[Z:%.*]]292; CHECK-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]293; CHECK:       T:294; CHECK-NEXT:    ret i1 [[OTHER:%.*]]295; CHECK:       F:296; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[X]], [[Z]]297; CHECK-NEXT:    ret i1 [[R]]298;299  %or = or i8 %x, %y300  %cond = icmp ugt i8 %or, %z301  br i1 %cond, label %T, label %F302T:303  ret i1 %other304F:305  %r = icmp ugt i8 %x, %z306  ret i1 %r307 308}309 310define i1 @src_udiv_implies_ult(i8 %x, i8 %z, i1 %other) {311; CHECK-LABEL: @src_udiv_implies_ult(312; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i8 [[Z:%.*]], [[X:%.*]]313; CHECK-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]314; CHECK:       T:315; CHECK-NEXT:    ret i1 true316; CHECK:       F:317; CHECK-NEXT:    ret i1 [[OTHER:%.*]]318;319  %cond = icmp ugt i8 %z, %x320  br i1 %cond, label %T, label %F321T:322  %and = udiv i8 %x, 3323  %r = icmp ult i8 %and, %z324  ret i1 %r325F:326  ret i1 %other327}328 329define i1 @src_udiv_implies_ult2(i8 %x, i8 %z, i1 %other) {330; CHECK-LABEL: @src_udiv_implies_ult2(331; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ugt i8 [[Z:%.*]], [[X:%.*]]332; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]333; CHECK:       T:334; CHECK-NEXT:    ret i1 [[OTHER:%.*]]335; CHECK:       F:336; CHECK-NEXT:    ret i1 true337;338  %cond = icmp ule i8 %z, %x339  br i1 %cond, label %T, label %F340T:341  ret i1 %other342F:343  %and = udiv i8 %x, 3344  %r = icmp ult i8 %and, %z345  ret i1 %r346}347 348define i1 @src_smin_implies_sle(i8 %x, i8 %y, i8 %z, i1 %other) {349; CHECK-LABEL: @src_smin_implies_sle(350; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp sgt i8 [[X:%.*]], [[Z:%.*]]351; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]352; CHECK:       T:353; CHECK-NEXT:    ret i1 true354; CHECK:       F:355; CHECK-NEXT:    ret i1 [[OTHER:%.*]]356;357  %cond = icmp sle i8 %x, %z358  br i1 %cond, label %T, label %F359T:360  %um = call i8 @llvm.smin.i8(i8 %x, i8 %y)361  %r = icmp sle i8 %um, %z362  ret i1 %r363F:364  ret i1 %other365}366 367define i1 @src_umin_implies_ule(i8 %x, i8 %y, i8 %z, i1 %other) {368; CHECK-LABEL: @src_umin_implies_ule(369; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ugt i8 [[X:%.*]], [[Z:%.*]]370; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]371; CHECK:       T:372; CHECK-NEXT:    ret i1 true373; CHECK:       F:374; CHECK-NEXT:    ret i1 [[OTHER:%.*]]375;376  %cond = icmp ule i8 %x, %z377  br i1 %cond, label %T, label %F378T:379  %um = call i8 @llvm.umin.i8(i8 %x, i8 %y)380  %r = icmp ule i8 %um, %z381  ret i1 %r382F:383  ret i1 %other384}385 386define i1 @src_umax_implies_ule(i8 %x, i8 %y, i8 %z, i1 %other) {387; CHECK-LABEL: @src_umax_implies_ule(388; CHECK-NEXT:    [[UM:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])389; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ugt i8 [[UM]], [[Z:%.*]]390; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]391; CHECK:       T:392; CHECK-NEXT:    ret i1 true393; CHECK:       F:394; CHECK-NEXT:    ret i1 [[OTHER:%.*]]395;396  %um = call i8 @llvm.umax.i8(i8 %x, i8 %y)397  %cond = icmp ule i8 %um, %z398  br i1 %cond, label %T, label %F399T:400  %r = icmp ule i8 %x, %z401  ret i1 %r402F:403  ret i1 %other404}405 406define i1 @src_smax_implies_sle(i8 %x, i8 %y, i8 %z, i1 %other) {407; CHECK-LABEL: @src_smax_implies_sle(408; CHECK-NEXT:    [[UM:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])409; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp sgt i8 [[UM]], [[Z:%.*]]410; CHECK-NEXT:    br i1 [[COND_NOT]], label [[F:%.*]], label [[T:%.*]]411; CHECK:       T:412; CHECK-NEXT:    ret i1 true413; CHECK:       F:414; CHECK-NEXT:    ret i1 [[OTHER:%.*]]415;416  %um = call i8 @llvm.smax.i8(i8 %x, i8 %y)417  %cond = icmp sle i8 %um, %z418  br i1 %cond, label %T, label %F419T:420  %r = icmp sle i8 %x, %z421  ret i1 %r422F:423  ret i1 %other424}425