From 315a86c2f2a7ce1209d40767a2bde813f11e7573 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 28 May 2019 04:09:18 +0000 Subject: [PATCH] [CostModel] Add really basic support for being able to query the cost of the FNeg instruction. Summary: This reuses the getArithmeticInstrCost, but passes dummy values of the second operand flags. The X86 costs are wrong and can be improved in a follow up. I just wanted to stop it from reporting an unknown cost first. Reviewers: RKSimon, spatel, andrew.w.kaylor, cameron.mcinally Reviewed By: spatel Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D62444 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361788 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/TargetTransformInfo.cpp | 10 +++ test/Analysis/CostModel/X86/arith-fp.ll | 112 +++++++++++++++++------- 2 files changed, 88 insertions(+), 34 deletions(-) diff --git a/lib/Analysis/TargetTransformInfo.cpp b/lib/Analysis/TargetTransformInfo.cpp index 2f9f1e069f8..53dd2bf2304 100644 --- a/lib/Analysis/TargetTransformInfo.cpp +++ b/lib/Analysis/TargetTransformInfo.cpp @@ -1043,6 +1043,16 @@ int TargetTransformInfo::getInstructionThroughput(const Instruction *I) const { return getArithmeticInstrCost(I->getOpcode(), I->getType(), Op1VK, Op2VK, Op1VP, Op2VP, Operands); } + case Instruction::FNeg: { + TargetTransformInfo::OperandValueKind Op1VK, Op2VK; + TargetTransformInfo::OperandValueProperties Op1VP, Op2VP; + Op1VK = getOperandInfo(I->getOperand(0), Op1VP); + Op2VK = OK_AnyValue; + Op2VP = OP_None; + SmallVector Operands(I->operand_values()); + return getArithmeticInstrCost(I->getOpcode(), I->getType(), Op1VK, Op2VK, + Op1VP, Op2VP, Operands); + } case Instruction::Select: { const SelectInst *SI = cast(I); Type *CondTy = SI->getCondition()->getType(); diff --git a/test/Analysis/CostModel/X86/arith-fp.ll b/test/Analysis/CostModel/X86/arith-fp.ll index 1e95e9a5116..d1cffde7b74 100644 --- a/test/Analysis/CostModel/X86/arith-fp.ll +++ b/test/Analysis/CostModel/X86/arith-fp.ll @@ -354,48 +354,92 @@ define i32 @fneg_idiom(i32 %arg) { } define i32 @fneg(i32 %arg) { -; CHECK-LABEL: 'fneg' -; CHECK-NEXT: Cost Model: Unknown cost for instruction: %F32 = fneg float undef -; CHECK-NEXT: Cost Model: Unknown cost for instruction: %V4F32 = fneg <4 x float> undef -; CHECK-NEXT: Cost Model: Unknown cost for instruction: %V8F32 = fneg <8 x float> undef -; CHECK-NEXT: Cost Model: Unknown cost for instruction: %V16F32 = fneg <16 x float> undef -; CHECK-NEXT: Cost Model: Unknown cost for instruction: %F64 = fneg double undef -; CHECK-NEXT: Cost Model: Unknown cost for instruction: %V2F64 = fneg <2 x double> undef -; CHECK-NEXT: Cost Model: Unknown cost for instruction: %V4F64 = fneg <4 x double> undef -; CHECK-NEXT: Cost Model: Unknown cost for instruction: %V8F64 = fneg <8 x double> undef -; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef +; SSE1-LABEL: 'fneg' +; SSE1-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F32 = fneg float undef +; SSE1-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F32 = fneg <4 x float> undef +; SSE1-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V8F32 = fneg <8 x float> undef +; SSE1-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V16F32 = fneg <16 x float> undef +; SSE1-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %F64 = fneg double undef +; SSE1-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V2F64 = fneg <2 x double> undef +; SSE1-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V4F64 = fneg <4 x double> undef +; SSE1-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V8F64 = fneg <8 x double> undef +; SSE1-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef +; +; SSE2-LABEL: 'fneg' +; SSE2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F32 = fneg float undef +; SSE2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F32 = fneg <4 x float> undef +; SSE2-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V8F32 = fneg <8 x float> undef +; SSE2-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V16F32 = fneg <16 x float> undef +; SSE2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F64 = fneg double undef +; SSE2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V2F64 = fneg <2 x double> undef +; SSE2-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V4F64 = fneg <4 x double> undef +; SSE2-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V8F64 = fneg <8 x double> undef +; SSE2-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef +; +; SSE42-LABEL: 'fneg' +; SSE42-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F32 = fneg float undef +; SSE42-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F32 = fneg <4 x float> undef +; SSE42-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V8F32 = fneg <8 x float> undef +; SSE42-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V16F32 = fneg <16 x float> undef +; SSE42-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F64 = fneg double undef +; SSE42-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V2F64 = fneg <2 x double> undef +; SSE42-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V4F64 = fneg <4 x double> undef +; SSE42-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V8F64 = fneg <8 x double> undef +; SSE42-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef +; +; AVX-LABEL: 'fneg' +; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F32 = fneg float undef +; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F32 = fneg <4 x float> undef +; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V8F32 = fneg <8 x float> undef +; AVX-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V16F32 = fneg <16 x float> undef +; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F64 = fneg double undef +; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V2F64 = fneg <2 x double> undef +; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F64 = fneg <4 x double> undef +; AVX-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V8F64 = fneg <8 x double> undef +; AVX-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef +; +; AVX512-LABEL: 'fneg' +; AVX512-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F32 = fneg float undef +; AVX512-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F32 = fneg <4 x float> undef +; AVX512-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V8F32 = fneg <8 x float> undef +; AVX512-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V16F32 = fneg <16 x float> undef +; AVX512-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F64 = fneg double undef +; AVX512-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V2F64 = fneg <2 x double> undef +; AVX512-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F64 = fneg <4 x double> undef +; AVX512-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V8F64 = fneg <8 x double> undef +; AVX512-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef ; ; SLM-LABEL: 'fneg' -; SLM-NEXT: Cost Model: Unknown cost for instruction: %F32 = fneg float undef -; SLM-NEXT: Cost Model: Unknown cost for instruction: %V4F32 = fneg <4 x float> undef -; SLM-NEXT: Cost Model: Unknown cost for instruction: %V8F32 = fneg <8 x float> undef -; SLM-NEXT: Cost Model: Unknown cost for instruction: %V16F32 = fneg <16 x float> undef -; SLM-NEXT: Cost Model: Unknown cost for instruction: %F64 = fneg double undef -; SLM-NEXT: Cost Model: Unknown cost for instruction: %V2F64 = fneg <2 x double> undef -; SLM-NEXT: Cost Model: Unknown cost for instruction: %V4F64 = fneg <4 x double> undef -; SLM-NEXT: Cost Model: Unknown cost for instruction: %V8F64 = fneg <8 x double> undef +; SLM-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F32 = fneg float undef +; SLM-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F32 = fneg <4 x float> undef +; SLM-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V8F32 = fneg <8 x float> undef +; SLM-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V16F32 = fneg <16 x float> undef +; SLM-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F64 = fneg double undef +; SLM-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V2F64 = fneg <2 x double> undef +; SLM-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V4F64 = fneg <4 x double> undef +; SLM-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V8F64 = fneg <8 x double> undef ; SLM-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef ; ; GLM-LABEL: 'fneg' -; GLM-NEXT: Cost Model: Unknown cost for instruction: %F32 = fneg float undef -; GLM-NEXT: Cost Model: Unknown cost for instruction: %V4F32 = fneg <4 x float> undef -; GLM-NEXT: Cost Model: Unknown cost for instruction: %V8F32 = fneg <8 x float> undef -; GLM-NEXT: Cost Model: Unknown cost for instruction: %V16F32 = fneg <16 x float> undef -; GLM-NEXT: Cost Model: Unknown cost for instruction: %F64 = fneg double undef -; GLM-NEXT: Cost Model: Unknown cost for instruction: %V2F64 = fneg <2 x double> undef -; GLM-NEXT: Cost Model: Unknown cost for instruction: %V4F64 = fneg <4 x double> undef -; GLM-NEXT: Cost Model: Unknown cost for instruction: %V8F64 = fneg <8 x double> undef +; GLM-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F32 = fneg float undef +; GLM-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F32 = fneg <4 x float> undef +; GLM-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V8F32 = fneg <8 x float> undef +; GLM-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V16F32 = fneg <16 x float> undef +; GLM-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F64 = fneg double undef +; GLM-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V2F64 = fneg <2 x double> undef +; GLM-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V4F64 = fneg <4 x double> undef +; GLM-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V8F64 = fneg <8 x double> undef ; GLM-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef ; ; BTVER2-LABEL: 'fneg' -; BTVER2-NEXT: Cost Model: Unknown cost for instruction: %F32 = fneg float undef -; BTVER2-NEXT: Cost Model: Unknown cost for instruction: %V4F32 = fneg <4 x float> undef -; BTVER2-NEXT: Cost Model: Unknown cost for instruction: %V8F32 = fneg <8 x float> undef -; BTVER2-NEXT: Cost Model: Unknown cost for instruction: %V16F32 = fneg <16 x float> undef -; BTVER2-NEXT: Cost Model: Unknown cost for instruction: %F64 = fneg double undef -; BTVER2-NEXT: Cost Model: Unknown cost for instruction: %V2F64 = fneg <2 x double> undef -; BTVER2-NEXT: Cost Model: Unknown cost for instruction: %V4F64 = fneg <4 x double> undef -; BTVER2-NEXT: Cost Model: Unknown cost for instruction: %V8F64 = fneg <8 x double> undef +; BTVER2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F32 = fneg float undef +; BTVER2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F32 = fneg <4 x float> undef +; BTVER2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V8F32 = fneg <8 x float> undef +; BTVER2-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V16F32 = fneg <16 x float> undef +; BTVER2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %F64 = fneg double undef +; BTVER2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V2F64 = fneg <2 x double> undef +; BTVER2-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4F64 = fneg <4 x double> undef +; BTVER2-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V8F64 = fneg <8 x double> undef ; BTVER2-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef ; %F32 = fneg float undef -- 2.50.1