182 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -mtriple=armv8.1m.main -mattr=+mve.fp -passes="print<cost-model>" -cost-kind=all 2>&1 -disable-output < %s | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"5 6; Test a cross-section of intrinsics for various cost-kinds.7; Other test files may check for accuracy of a particular intrinsic8; across subtargets or types. This is just a basic correctness check using an9; ARM target and a legal scalar type (i32/float) and/or an10; illegal vector type (16 x i32/float).11 12declare i32 @llvm.smax.i32(i32, i32)13declare <16 x i32> @llvm.smax.v16i32(<16 x i32>, <16 x i32>)14 15declare float @llvm.fmuladd.f32(float, float, float)16declare <16 x float> @llvm.fmuladd.v16f32(<16 x float>, <16 x float>, <16 x float>)17 18declare float @llvm.log2.f32(float)19declare <16 x float> @llvm.log2.v16f32(<16 x float>)20 21declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)22declare <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float>, <16 x float>, metadata, metadata)23 24declare float @llvm.maximum.f32(float, float)25declare <16 x float> @llvm.maximum.v16f32(<16 x float>, <16 x float>)26 27declare i32 @llvm.cttz.i32(i32, i1)28declare <16 x i32> @llvm.cttz.v16i32(<16 x i32>, i1)29 30declare i32 @llvm.ctlz.i32(i32, i1)31declare <16 x i32> @llvm.ctlz.v16i32(<16 x i32>, i1)32 33declare i32 @llvm.fshl.i32(i32, i32, i32)34declare <16 x i32> @llvm.fshl.v16i32(<16 x i32>, <16 x i32>, <16 x i32>)35 36declare <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x float>)37declare void @llvm.masked.scatter.v16f32.v16p0(<16 x float>, <16 x ptr>, i32, <16 x i1>)38declare float @llvm.vector.reduce.fmax.v16f32(<16 x float>)39 40declare void @llvm.memcpy.p0.p0.i32(ptr, ptr, i32, i1)41 42declare i32 @llvm.ssa.copy.i32(i32)43declare float @llvm.ssa.copy.f32(float)44declare ptr @llvm.ssa.copy.p0(ptr)45 46define void @smax(i32 %a, i32 %b, <16 x i32> %va, <16 x i32> %vb) {47; CHECK-LABEL: 'smax'48; CHECK-NEXT: Cost Model: Found costs of RThru:2 CodeSize:3 Lat:2 SizeLat:2 for: %s = call i32 @llvm.smax.i32(i32 %a, i32 %b)49; CHECK-NEXT: Cost Model: Found costs of RThru:8 CodeSize:4 Lat:8 SizeLat:8 for: %v = call <16 x i32> @llvm.smax.v16i32(<16 x i32> %va, <16 x i32> %vb)50; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void51;52 %s = call i32 @llvm.smax.i32(i32 %a, i32 %b)53 %v = call <16 x i32> @llvm.smax.v16i32(<16 x i32> %va, <16 x i32> %vb)54 ret void55}56 57define void @fmuladd(float %a, float %b, float %c, <16 x float> %va, <16 x float> %vb, <16 x float> %vc) {58; CHECK-LABEL: 'fmuladd'59; CHECK-NEXT: Cost Model: Found costs of 1 for: %s = call float @llvm.fmuladd.f32(float %a, float %b, float %c)60; CHECK-NEXT: Cost Model: Found costs of 8 for: %v = call <16 x float> @llvm.fmuladd.v16f32(<16 x float> %va, <16 x float> %vb, <16 x float> %vc)61; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void62;63 %s = call float @llvm.fmuladd.f32(float %a, float %b, float %c)64 %v = call <16 x float> @llvm.fmuladd.v16f32(<16 x float> %va, <16 x float> %vb, <16 x float> %vc)65 ret void66}67 68define void @log2(float %a, <16 x float> %va) {69; CHECK-LABEL: 'log2'70; CHECK-NEXT: Cost Model: Found costs of RThru:10 CodeSize:1 Lat:10 SizeLat:10 for: %s = call float @llvm.log2.f32(float %a)71; CHECK-NEXT: Cost Model: Found costs of RThru:192 CodeSize:48 Lat:192 SizeLat:192 for: %v = call <16 x float> @llvm.log2.v16f32(<16 x float> %va)72; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void73;74 %s = call float @llvm.log2.f32(float %a)75 %v = call <16 x float> @llvm.log2.v16f32(<16 x float> %va)76 ret void77}78 79define void @constrained_fadd(float %a, <16 x float> %va) strictfp {80; CHECK-LABEL: 'constrained_fadd'81; CHECK-NEXT: Cost Model: Found costs of 1 for: %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")82; CHECK-NEXT: Cost Model: Found costs of 48 for: %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")83; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void84;85 %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")86 %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")87 ret void88}89 90define void @fmaximum(float %a, float %b, <16 x float> %va, <16 x float> %vb) {91; CHECK-LABEL: 'fmaximum'92; CHECK-NEXT: Cost Model: Found costs of RThru:10 CodeSize:1 Lat:10 SizeLat:10 for: %s = call float @llvm.maximum.f32(float %a, float %b)93; CHECK-NEXT: Cost Model: Found costs of RThru:208 CodeSize:64 Lat:208 SizeLat:208 for: %v = call <16 x float> @llvm.maximum.v16f32(<16 x float> %va, <16 x float> %vb)94; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void95;96 %s = call float @llvm.maximum.f32(float %a, float %b)97 %v = call <16 x float> @llvm.maximum.v16f32(<16 x float> %va, <16 x float> %vb)98 ret void99}100 101define void @cttz(i32 %a, <16 x i32> %va) {102; CHECK-LABEL: 'cttz'103; CHECK-NEXT: Cost Model: Found costs of 1 for: %s = call i32 @llvm.cttz.i32(i32 %a, i1 false)104; CHECK-NEXT: Cost Model: Found costs of 8 for: %v = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %va, i1 false)105; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void106;107 %s = call i32 @llvm.cttz.i32(i32 %a, i1 false)108 %v = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %va, i1 false)109 ret void110}111 112define void @ctlz(i32 %a, <16 x i32> %va) {113; CHECK-LABEL: 'ctlz'114; CHECK-NEXT: Cost Model: Found costs of 1 for: %s = call i32 @llvm.ctlz.i32(i32 %a, i1 true)115; CHECK-NEXT: Cost Model: Found costs of 8 for: %v = call <16 x i32> @llvm.ctlz.v16i32(<16 x i32> %va, i1 true)116; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void117;118 %s = call i32 @llvm.ctlz.i32(i32 %a, i1 true)119 %v = call <16 x i32> @llvm.ctlz.v16i32(<16 x i32> %va, i1 true)120 ret void121}122 123define void @fshl(i32 %a, i32 %b, i32 %c, <16 x i32> %va, <16 x i32> %vb, <16 x i32> %vc) {124; CHECK-LABEL: 'fshl'125; CHECK-NEXT: Cost Model: Found costs of RThru:7 CodeSize:8 Lat:7 SizeLat:7 for: %s = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %c)126; CHECK-NEXT: Cost Model: Found costs of RThru:120 CodeSize:92 Lat:120 SizeLat:120 for: %v = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i32> %vc)127; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void128;129 %s = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %c)130 %v = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i32> %vc)131 ret void132}133 134define void @maskedgather(<16 x ptr> %va, <16 x i1> %vb, <16 x float> %vc) {135; CHECK-LABEL: 'maskedgather'136; CHECK-NEXT: Cost Model: Found costs of 176 for: %v = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> align 1 %va, <16 x i1> %vb, <16 x float> %vc)137; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void138;139 %v = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %va, i32 1, <16 x i1> %vb, <16 x float> %vc)140 ret void141}142 143define void @maskedscatter(<16 x float> %va, <16 x ptr> %vb, <16 x i1> %vc) {144; CHECK-LABEL: 'maskedscatter'145; CHECK-NEXT: Cost Model: Found costs of 176 for: call void @llvm.masked.scatter.v16f32.v16p0(<16 x float> %va, <16 x ptr> align 1 %vb, <16 x i1> %vc)146; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void147;148 call void @llvm.masked.scatter.v16f32.v16p0(<16 x float> %va, <16 x ptr> %vb, i32 1, <16 x i1> %vc)149 ret void150}151 152define void @reduce_fmax(<16 x float> %va) {153; CHECK-LABEL: 'reduce_fmax'154; CHECK-NEXT: Cost Model: Found costs of RThru:9 CodeSize:6 Lat:9 SizeLat:9 for: %v = call float @llvm.vector.reduce.fmax.v16f32(<16 x float> %va)155; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void156;157 %v = call float @llvm.vector.reduce.fmax.v16f32(<16 x float> %va)158 ret void159}160 161define void @memcpy(ptr %a, ptr %b, i32 %c) {162; CHECK-LABEL: 'memcpy'163; CHECK-NEXT: Cost Model: Found costs of 4 for: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %a, ptr align 1 %b, i32 32, i1 false)164; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void165;166 call void @llvm.memcpy.p0.p0.i32(ptr align 1 %a, ptr align 1 %b, i32 32, i1 false)167 ret void168}169 170define void @ssa_copy() {171; CHECK-LABEL: 'ssa_copy'172; CHECK-NEXT: Cost Model: Found costs of 0 for: %i = call i32 @llvm.ssa.copy.i32(i32 undef)173; CHECK-NEXT: Cost Model: Found costs of 0 for: %f = call float @llvm.ssa.copy.f32(float undef)174; CHECK-NEXT: Cost Model: Found costs of 0 for: %p = call ptr @llvm.ssa.copy.p0(ptr undef)175; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret void176;177 %i = call i32 @llvm.ssa.copy.i32(i32 undef)178 %f = call float @llvm.ssa.copy.f32(float undef)179 %p = call ptr @llvm.ssa.copy.p0(ptr undef)180 ret void181}182