[llvm] b6b1c0d - [RISCV] Add cost model for fp-mask cast op.
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 10 02:15:24 PDT 2022
Author: jacquesguan
Date: 2022-08-10T17:14:37+08:00
New Revision: b6b1c0d1c4ca5fede720a1a8a1b70230376e2b3b
URL: https://github.com/llvm/llvm-project/commit/b6b1c0d1c4ca5fede720a1a8a1b70230376e2b3b
DIFF: https://github.com/llvm/llvm-project/commit/b6b1c0d1c4ca5fede720a1a8a1b70230376e2b3b.diff
LOG: [RISCV] Add cost model for fp-mask cast op.
The cost of convert from or to mask vector is different from other cases. We could not use PowDiff to calculate it. This patch set it to 3 as we use 3 instruction to make it.
Differential Revision: https://reviews.llvm.org/D131149
Added:
Modified:
llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
llvm/test/Analysis/CostModel/RISCV/cast.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
index cc360483053c..feb4e8f57118 100644
--- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
@@ -300,6 +300,20 @@ InstructionCost RISCVTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
case ISD::FP_TO_UINT:
case ISD::SINT_TO_FP:
case ISD::UINT_TO_FP:
+ if (Src->getScalarSizeInBits() == 1 || Dst->getScalarSizeInBits() == 1) {
+ // The cost of convert from or to mask vector is
diff erent from other
+ // cases. We could not use PowDiff to calculate it.
+ // For mask vector to fp, we should use the following instructions:
+ // vmv.v.i v8, 0
+ // vmerge.vim v8, v8, -1, v0
+ // vfcvt.f.x.v v8, v8
+
+ // And for fp vector to mask, we use:
+ // vfncvt.rtz.x.f.w v9, v8
+ // vand.vi v8, v9, 1
+ // vmsne.vi v0, v8, 0
+ return 3;
+ }
if (std::abs(PowDiff) <= 1)
return 1;
// Backend could lower (v[sz]ext i8 to double) to vfcvt(v[sz]ext.f8 i8),
diff --git a/llvm/test/Analysis/CostModel/RISCV/cast.ll b/llvm/test/Analysis/CostModel/RISCV/cast.ll
index 981c2cb98aeb..4109eac11ac5 100644
--- a/llvm/test/Analysis/CostModel/RISCV/cast.ll
+++ b/llvm/test/Analysis/CostModel/RISCV/cast.ll
@@ -159,6 +159,7 @@ define void @fp_to_int() {
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %s9 = fptosi <4 x half> undef to <4 x i64>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s10 = fptosi <4 x float> undef to <4 x i64>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %s11 = fptosi <4 x double> undef to <4 x i16>
+; RISCV32-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %s12 = fptosi <4 x double> undef to <4 x i1>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %u0 = fptoui <4 x half> undef to <4 x i8>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u1 = fptoui <4 x float> undef to <4 x i8>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %u2 = fptoui <4 x double> undef to <4 x i8>
@@ -171,6 +172,7 @@ define void @fp_to_int() {
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u9 = fptoui <4 x half> undef to <4 x i64>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %u10 = fptoui <4 x float> undef to <4 x i64>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u11 = fptoui <4 x double> undef to <4 x i16>
+; RISCV32-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %u12 = fptoui <4 x double> undef to <4 x i1>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
;
; RISCV64-LABEL: 'fp_to_int'
@@ -186,6 +188,7 @@ define void @fp_to_int() {
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %s9 = fptosi <4 x half> undef to <4 x i64>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s10 = fptosi <4 x float> undef to <4 x i64>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %s11 = fptosi <4 x double> undef to <4 x i16>
+; RISCV64-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %s12 = fptosi <4 x double> undef to <4 x i1>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %u0 = fptoui <4 x half> undef to <4 x i8>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u1 = fptoui <4 x float> undef to <4 x i8>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %u2 = fptoui <4 x double> undef to <4 x i8>
@@ -198,6 +201,7 @@ define void @fp_to_int() {
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u9 = fptoui <4 x half> undef to <4 x i64>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %u10 = fptoui <4 x float> undef to <4 x i64>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u11 = fptoui <4 x double> undef to <4 x i16>
+; RISCV64-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %u12 = fptoui <4 x double> undef to <4 x i1>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
;
%s0 = fptosi <4 x half> undef to <4 x i8>
@@ -212,6 +216,7 @@ define void @fp_to_int() {
%s9 = fptosi <4 x half> undef to <4 x i64>
%s10 = fptosi <4 x float> undef to <4 x i64>
%s11 = fptosi <4 x double> undef to <4 x i16>
+ %s12 = fptosi <4 x double> undef to <4 x i1>
%u0 = fptoui <4 x half> undef to <4 x i8>
%u1 = fptoui <4 x float> undef to <4 x i8>
@@ -225,6 +230,8 @@ define void @fp_to_int() {
%u9 = fptoui <4 x half> undef to <4 x i64>
%u10 = fptoui <4 x float> undef to <4 x i64>
%u11 = fptoui <4 x double> undef to <4 x i16>
+ %u12 = fptoui <4 x double> undef to <4 x i1>
+
ret void
}
@@ -242,6 +249,7 @@ define void @int_to_fp() {
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %s9 = sitofp <4 x i64> undef to <4 x half>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s10 = sitofp <4 x i64> undef to <4 x float>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %s11 = sitofp <4 x i16> undef to <4 x double>
+; RISCV32-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %s12 = sitofp <4 x i1> undef to <4 x double>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %u0 = uitofp <4 x i8> undef to <4 x half>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u1 = uitofp <4 x i8> undef to <4 x float>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u2 = uitofp <4 x i8> undef to <4 x double>
@@ -254,6 +262,7 @@ define void @int_to_fp() {
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u9 = uitofp <4 x i64> undef to <4 x half>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %u10 = uitofp <4 x i64> undef to <4 x float>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u11 = uitofp <4 x i16> undef to <4 x double>
+; RISCV32-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %u12 = uitofp <4 x i1> undef to <4 x double>
; RISCV32-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
;
; RISCV64-LABEL: 'int_to_fp'
@@ -269,6 +278,7 @@ define void @int_to_fp() {
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %s9 = sitofp <4 x i64> undef to <4 x half>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s10 = sitofp <4 x i64> undef to <4 x float>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %s11 = sitofp <4 x i16> undef to <4 x double>
+; RISCV64-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %s12 = sitofp <4 x i1> undef to <4 x double>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %u0 = uitofp <4 x i8> undef to <4 x half>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u1 = uitofp <4 x i8> undef to <4 x float>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u2 = uitofp <4 x i8> undef to <4 x double>
@@ -281,6 +291,7 @@ define void @int_to_fp() {
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u9 = uitofp <4 x i64> undef to <4 x half>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %u10 = uitofp <4 x i64> undef to <4 x float>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %u11 = uitofp <4 x i16> undef to <4 x double>
+; RISCV64-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %u12 = uitofp <4 x i1> undef to <4 x double>
; RISCV64-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
;
%s0 = sitofp <4 x i8> undef to <4 x half>
@@ -295,6 +306,7 @@ define void @int_to_fp() {
%s9 = sitofp <4 x i64> undef to <4 x half>
%s10 = sitofp <4 x i64> undef to <4 x float>
%s11 = sitofp <4 x i16> undef to <4 x double>
+ %s12 = sitofp <4 x i1> undef to <4 x double>
%u0 = uitofp <4 x i8> undef to <4 x half>
%u1 = uitofp <4 x i8> undef to <4 x float>
@@ -308,5 +320,7 @@ define void @int_to_fp() {
%u9 = uitofp <4 x i64> undef to <4 x half>
%u10 = uitofp <4 x i64> undef to <4 x float>
%u11 = uitofp <4 x i16> undef to <4 x double>
+ %u12 = uitofp <4 x i1> undef to <4 x double>
+
ret void
}
More information about the llvm-commits
mailing list