brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.5 KiB · c2d03b1 Raw
236 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare i8 @llvm.fshl.i8(i8, i8, i8)5declare i8 @llvm.fshr.i8(i8, i8, i8)6declare <2 x i5> @llvm.fshl.v2i5(<2 x i5>, <2 x i5>, <2 x i5>)7declare <2 x i5> @llvm.fshr.v2i5(<2 x i5>, <2 x i5>, <2 x i5>)8declare void @use(i8)9 10define i1 @rol_eq(i8 %x, i8 %y, i8 %z) {11; CHECK-LABEL: @rol_eq(12; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]]13; CHECK-NEXT:    ret i1 [[R]]14;15  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %z)16  %f2 = tail call i8 @llvm.fshl.i8(i8 %y, i8 %y, i8 %z)17  %r = icmp eq i8 %f, %f218  ret i1 %r19}20 21define i1 @rol_ne(i8 %x, i8 %y, i8 %z) {22; CHECK-LABEL: @rol_ne(23; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]]24; CHECK-NEXT:    ret i1 [[R]]25;26  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %z)27  %f2 = tail call i8 @llvm.fshl.i8(i8 %y, i8 %y, i8 %z)28  %r = icmp ne i8 %f, %f229  ret i1 %r30}31 32define i1 @ror_eq(i8 %x, i8 %y, i8 %z) {33; CHECK-LABEL: @ror_eq(34; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]]35; CHECK-NEXT:    ret i1 [[R]]36;37  %f = tail call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %z)38  %f2 = tail call i8 @llvm.fshr.i8(i8 %y, i8 %y, i8 %z)39  %r = icmp eq i8 %f, %f240  ret i1 %r41}42 43 44define i1 @ror_ne(i8 %x, i8 %y, i8 %z) {45; CHECK-LABEL: @ror_ne(46; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]]47; CHECK-NEXT:    ret i1 [[R]]48;49  %f = tail call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %z)50  %f2 = tail call i8 @llvm.fshr.i8(i8 %y, i8 %y, i8 %z)51  %r = icmp ne i8 %f, %f252  ret i1 %r53}54 55define i1 @rol_eq_use(i8 %x, i8 %y, i8 %z) {56; CHECK-LABEL: @rol_eq_use(57; CHECK-NEXT:    [[F:%.*]] = tail call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 [[Z:%.*]])58; CHECK-NEXT:    call void @use(i8 [[F]])59; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X]], [[Y:%.*]]60; CHECK-NEXT:    ret i1 [[R]]61;62  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %z)63  call void @use(i8 %f)64  %f2 = tail call i8 @llvm.fshl.i8(i8 %y, i8 %y, i8 %z)65  %r = icmp eq i8 %f, %f266  ret i1 %r67}68 69define i1 @rol_eq_uses(i8 %x, i8 %y, i8 %z) {70; CHECK-LABEL: @rol_eq_uses(71; CHECK-NEXT:    [[F:%.*]] = tail call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 [[Z:%.*]])72; CHECK-NEXT:    call void @use(i8 [[F]])73; CHECK-NEXT:    [[F2:%.*]] = tail call i8 @llvm.fshl.i8(i8 [[Y:%.*]], i8 [[Y]], i8 [[Z]])74; CHECK-NEXT:    call void @use(i8 [[F2]])75; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X]], [[Y]]76; CHECK-NEXT:    ret i1 [[R]]77;78  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %z)79  call void @use(i8 %f)80  %f2 = tail call i8 @llvm.fshl.i8(i8 %y, i8 %y, i8 %z)81  call void @use(i8 %f2)82  %r = icmp eq i8 %f, %f283  ret i1 %r84}85 86define <2 x i1> @rol_eq_vec(<2 x i5> %x, <2 x i5> %y, <2 x i5> %z) {87; CHECK-LABEL: @rol_eq_vec(88; CHECK-NEXT:    [[R:%.*]] = icmp eq <2 x i5> [[X:%.*]], [[Y:%.*]]89; CHECK-NEXT:    ret <2 x i1> [[R]]90;91  %f = tail call <2 x i5> @llvm.fshl.v2i5(<2 x i5> %x, <2 x i5> %x, <2 x i5> %z)92  %f2 = tail call <2 x i5> @llvm.fshl.v2i5(<2 x i5> %y, <2 x i5> %y, <2 x i5> %z)93  %r = icmp eq <2 x i5> %f, %f294  ret <2 x i1> %r95}96 97define <2 x i1> @ror_eq_vec(<2 x i5> %x, <2 x i5> %y, <2 x i5> %z) {98; CHECK-LABEL: @ror_eq_vec(99; CHECK-NEXT:    [[R:%.*]] = icmp eq <2 x i5> [[X:%.*]], [[Y:%.*]]100; CHECK-NEXT:    ret <2 x i1> [[R]]101;102  %f = tail call <2 x i5> @llvm.fshr.v2i5(<2 x i5> %x, <2 x i5> %x, <2 x i5> %z)103  %f2 = tail call <2 x i5> @llvm.fshr.v2i5(<2 x i5> %y, <2 x i5> %y, <2 x i5> %z)104  %r = icmp eq <2 x i5> %f, %f2105  ret <2 x i1> %r106}107 108 109define i1 @rol_eq_cst(i8 %x) {110; CHECK-LABEL: @rol_eq_cst(111; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X:%.*]], 64112; CHECK-NEXT:    ret i1 [[R]]113;114  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 3)115  %r = icmp eq i8 %f, 2116  ret i1 %r117}118 119define i1 @rol_ne_cst(i8 %x) {120; CHECK-LABEL: @rol_ne_cst(121; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[X:%.*]], 64122; CHECK-NEXT:    ret i1 [[R]]123;124  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 3)125  %r = icmp ne i8 %f, 2126  ret i1 %r127}128 129define i1 @rol_eq_cst_use(i8 %x) {130; CHECK-LABEL: @rol_eq_cst_use(131; CHECK-NEXT:    [[F:%.*]] = tail call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 3)132; CHECK-NEXT:    call void @use(i8 [[F]])133; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X]], 64134; CHECK-NEXT:    ret i1 [[R]]135;136  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 3)137  call void @use(i8 %f)138  %r = icmp eq i8 %f, 2139  ret i1 %r140}141 142define i1 @ror_eq_cst(i8 %x) {143; CHECK-LABEL: @ror_eq_cst(144; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X:%.*]], 12145; CHECK-NEXT:    ret i1 [[R]]146;147  %f = tail call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 2)148  %r = icmp eq i8 %f, 3149  ret i1 %r150}151 152define i1 @ror_ne_cst(i8 %x) {153; CHECK-LABEL: @ror_ne_cst(154; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[X:%.*]], 12155; CHECK-NEXT:    ret i1 [[R]]156;157  %f = tail call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 2)158  %r = icmp ne i8 %f, 3159  ret i1 %r160}161 162define <2 x i1> @rol_eq_cst_vec(<2 x i5> %x) {163; CHECK-LABEL: @rol_eq_cst_vec(164; CHECK-NEXT:    [[R:%.*]] = icmp eq <2 x i5> [[X:%.*]], splat (i5 8)165; CHECK-NEXT:    ret <2 x i1> [[R]]166;167  %f = tail call <2 x i5> @llvm.fshl.v2i5(<2 x i5> %x, <2 x i5> %x, <2 x i5> <i5 3, i5 3>)168  %r = icmp eq <2 x i5> %f, <i5 2, i5 2>169  ret <2 x i1> %r170}171 172define <2 x i1> @rol_eq_cst_undef(<2 x i5> %x) {173; CHECK-LABEL: @rol_eq_cst_undef(174; CHECK-NEXT:    [[F:%.*]] = tail call <2 x i5> @llvm.fshl.v2i5(<2 x i5> [[X:%.*]], <2 x i5> [[X]], <2 x i5> splat (i5 3))175; CHECK-NEXT:    [[R:%.*]] = icmp eq <2 x i5> [[F]], <i5 2, i5 undef>176; CHECK-NEXT:    ret <2 x i1> [[R]]177;178  %f = tail call <2 x i5> @llvm.fshl.v2i5(<2 x i5> %x, <2 x i5> %x, <2 x i5> <i5 3, i5 3>)179  %r = icmp eq <2 x i5> %f, <i5 2, i5 undef>180  ret <2 x i1> %r181}182 183; negative test - not a rotate184define i1 @no_rotate(i8 %x, i8 %y, i8 %z) {185; CHECK-LABEL: @no_rotate(186; CHECK-NEXT:    [[F:%.*]] = tail call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]])187; CHECK-NEXT:    [[F2:%.*]] = tail call i8 @llvm.fshl.i8(i8 [[Y]], i8 [[Y]], i8 [[Z]])188; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[F]], [[F2]]189; CHECK-NEXT:    ret i1 [[R]]190;191  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %y, i8 %z)192  %f2 = tail call i8 @llvm.fshl.i8(i8 %y, i8 %y, i8 %z)193  %r = icmp eq i8 %f, %f2194  ret i1 %r195}196 197; negative test - wrong predicate198define i1 @wrong_pred(i8 %x, i8 %y, i8 %z) {199; CHECK-LABEL: @wrong_pred(200; CHECK-NEXT:    [[F:%.*]] = tail call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 [[Z:%.*]])201; CHECK-NEXT:    [[F2:%.*]] = tail call i8 @llvm.fshl.i8(i8 [[Y:%.*]], i8 [[Y]], i8 [[Z]])202; CHECK-NEXT:    [[R:%.*]] = icmp ult i8 [[F]], [[F2]]203; CHECK-NEXT:    ret i1 [[R]]204;205  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %z)206  %f2 = tail call i8 @llvm.fshl.i8(i8 %y, i8 %y, i8 %z)207  %r = icmp ult i8 %f, %f2208  ret i1 %r209}210 211; negative test - rotate amounts mismatch212define i1 @amounts_mismatch(i8 %x, i8 %y, i8 %z, i8 %w) {213; CHECK-LABEL: @amounts_mismatch(214; CHECK-NEXT:    [[TMP1:%.*]] = sub i8 [[Z:%.*]], [[W:%.*]]215; CHECK-NEXT:    [[TMP2:%.*]] = call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 [[TMP1]])216; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[Y:%.*]], [[TMP2]]217; CHECK-NEXT:    ret i1 [[R]]218;219  %f = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %z)220  %f2 = tail call i8 @llvm.fshl.i8(i8 %y, i8 %y, i8 %w)221  %r = icmp eq i8 %f, %f2222  ret i1 %r223}224 225; negative test - wrong predicate226define i1 @wrong_pred2(i8 %x) {227; CHECK-LABEL: @wrong_pred2(228; CHECK-NEXT:    [[F:%.*]] = call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 5)229; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[F]], 2230; CHECK-NEXT:    ret i1 [[R]]231;232  %f = tail call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 27)233  %r = icmp ugt i8 %f, 2234  ret i1 %r235}236