diff --git a/llvm/lib/Analysis/TargetTransformInfo.cpp b/llvm/lib/Analysis/TargetTransformInfo.cpp --- a/llvm/lib/Analysis/TargetTransformInfo.cpp +++ b/llvm/lib/Analysis/TargetTransformInfo.cpp @@ -1043,6 +1043,16 @@ 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/llvm/test/Analysis/CostModel/X86/arith-fp.ll b/llvm/test/Analysis/CostModel/X86/arith-fp.ll --- a/llvm/test/Analysis/CostModel/X86/arith-fp.ll +++ b/llvm/test/Analysis/CostModel/X86/arith-fp.ll @@ -354,48 +354,92 @@ } 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