[llvm] r178459 - X86TTI: Add accurate costs for itofp operations, based on the actual instruction counts.

Arnold Schwaighofer aschwaighofer at apple.com
Mon Apr 1 12:27:15 PDT 2013


Agreed. But I can't think of an effective way how to do this retroactively/automatically.

The only thing that comes close to this is to co-locate tests that check the cost with tests that check that the lowering (produced assembly) has changed.

We are already doing (should already be doing) this or something that comes close:

When we change lowering of an instruction we (should):
   * update the cost model and add a cost model test 
   * add a test case that makes sure the produced assembly is right

The first point is being enforced by an undocumented rule that a change to lowering also requires a change (inspection) of the cost model. Nadav and I are trying to enforce this.
The second point is part of the normal requirements for a change.

Co-locating them in one file retroactively would mean we would have to do this for every existing test/CodeGen/<ARCH>/<test lowering>.ll test.


Best,
Arnold

On Apr 1, 2013, at 1:29 PM, Evan Cheng <evan.cheng at apple.com> wrote:

> I have a generic question about these tables. If the cost is impacted by how the target / sdisel lowers the node, then the entries can be outdated if lowering changes. It would be nice if we have a mechanism to detect that.
> 
> Evan
> 
> On Apr 1, 2013, at 3:23 AM, Benjamin Kramer <benny.kra at googlemail.com> wrote:
> 
>> Author: d0k
>> Date: Mon Apr  1 05:23:49 2013
>> New Revision: 178459
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=178459&view=rev
>> Log:
>> X86TTI: Add accurate costs for itofp operations, based on the actual instruction counts.
>> 
>> Modified:
>>    llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp
>>    llvm/trunk/test/Analysis/CostModel/X86/cast.ll
>>    llvm/trunk/test/Transforms/LoopVectorize/X86/conversion-cost.ll
>> 
>> Modified: llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp?rev=178459&r1=178458&r2=178459&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp Mon Apr  1 05:23:49 2013
>> @@ -271,10 +271,33 @@ unsigned X86TTI::getCastInstrCost(unsign
>>     { ISD::ZERO_EXTEND, MVT::v4i64, MVT::v4i32, 1 },
>>     { ISD::TRUNCATE,    MVT::v4i32, MVT::v4i64, 1 },
>>     { ISD::TRUNCATE,    MVT::v8i16, MVT::v8i32, 1 },
>> -    { ISD::SINT_TO_FP,  MVT::v8f32, MVT::v8i8,  1 },
>> -    { ISD::SINT_TO_FP,  MVT::v4f32, MVT::v4i8,  1 },
>> -    { ISD::UINT_TO_FP,  MVT::v8f32, MVT::v8i8,  1 },
>> -    { ISD::UINT_TO_FP,  MVT::v4f32, MVT::v4i8,  1 },
>> +
>> +    { ISD::SINT_TO_FP,  MVT::v8f32, MVT::v8i1,  8 },
>> +    { ISD::SINT_TO_FP,  MVT::v8f32, MVT::v8i8,  8 },
>> +    { ISD::SINT_TO_FP,  MVT::v8f32, MVT::v8i16, 5 },
>> +    { ISD::SINT_TO_FP,  MVT::v8f32, MVT::v8i32, 1 },
>> +    { ISD::SINT_TO_FP,  MVT::v4f32, MVT::v4i1,  3 },
>> +    { ISD::SINT_TO_FP,  MVT::v4f32, MVT::v4i8,  3 },
>> +    { ISD::SINT_TO_FP,  MVT::v4f32, MVT::v4i16, 3 },
>> +    { ISD::SINT_TO_FP,  MVT::v4f32, MVT::v4i32, 1 },
>> +    { ISD::SINT_TO_FP,  MVT::v4f64, MVT::v4i1,  3 },
>> +    { ISD::SINT_TO_FP,  MVT::v4f64, MVT::v4i8,  3 },
>> +    { ISD::SINT_TO_FP,  MVT::v4f64, MVT::v4i16, 3 },
>> +    { ISD::SINT_TO_FP,  MVT::v4f64, MVT::v4i32, 1 },
>> +
>> +    { ISD::UINT_TO_FP,  MVT::v8f32, MVT::v8i1,  6 },
>> +    { ISD::UINT_TO_FP,  MVT::v8f32, MVT::v8i8,  5 },
>> +    { ISD::UINT_TO_FP,  MVT::v8f32, MVT::v8i16, 5 },
>> +    { ISD::UINT_TO_FP,  MVT::v8f32, MVT::v8i32, 9 },
>> +    { ISD::UINT_TO_FP,  MVT::v4f32, MVT::v4i1,  7 },
>> +    { ISD::UINT_TO_FP,  MVT::v4f32, MVT::v4i8,  2 },
>> +    { ISD::UINT_TO_FP,  MVT::v4f32, MVT::v4i16, 2 },
>> +    { ISD::UINT_TO_FP,  MVT::v4f32, MVT::v4i32, 6 },
>> +    { ISD::UINT_TO_FP,  MVT::v4f64, MVT::v4i1,  7 },
>> +    { ISD::UINT_TO_FP,  MVT::v4f64, MVT::v4i8,  2 },
>> +    { ISD::UINT_TO_FP,  MVT::v4f64, MVT::v4i16, 2 },
>> +    { ISD::UINT_TO_FP,  MVT::v4f64, MVT::v4i32, 6 },
>> +
>>     { ISD::FP_TO_SINT,  MVT::v8i8,  MVT::v8f32, 1 },
>>     { ISD::FP_TO_SINT,  MVT::v4i8,  MVT::v4f32, 1 },
>>     { ISD::ZERO_EXTEND, MVT::v8i32, MVT::v8i1,  6 },
>> 
>> Modified: llvm/trunk/test/Analysis/CostModel/X86/cast.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/CostModel/X86/cast.ll?rev=178459&r1=178458&r2=178459&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/Analysis/CostModel/X86/cast.ll (original)
>> +++ llvm/trunk/test/Analysis/CostModel/X86/cast.ll Mon Apr  1 05:23:49 2013
>> @@ -77,3 +77,78 @@ define i32 @masks4(<4 x i1> %in) {
>>   ret i32 undef
>> }
>> 
>> +define void @sitofp4(<4 x i1> %a, <4 x i8> %b, <4 x i16> %c, <4 x i32> %d) {
>> +  ; CHECK: cost of 3 {{.*}} sitofp
>> +  %A1 = sitofp <4 x i1> %a to <4 x float>
>> +  ; CHECK: cost of 3 {{.*}} sitofp
>> +  %A2 = sitofp <4 x i1> %a to <4 x double>
>> +
>> +  ; CHECK: cost of 3 {{.*}} sitofp
>> +  %B1 = sitofp <4 x i8> %b to <4 x float>
>> +  ; CHECK: cost of 3 {{.*}} sitofp
>> +  %B2 = sitofp <4 x i8> %b to <4 x double>
>> +
>> +  ; CHECK: cost of 3 {{.*}} sitofp
>> +  %C1 = sitofp <4 x i16> %c to <4 x float>
>> +  ; CHECK: cost of 3 {{.*}} sitofp
>> +  %C2 = sitofp <4 x i16> %c to <4 x double>
>> +
>> +  ; CHECK: cost of 1 {{.*}} sitofp
>> +  %D1 = sitofp <4 x i32> %d to <4 x float>
>> +  ; CHECK: cost of 1 {{.*}} sitofp
>> +  %D2 = sitofp <4 x i32> %d to <4 x double>
>> +  ret void
>> +}
>> +
>> +define void @sitofp8(<8 x i1> %a, <8 x i8> %b, <8 x i16> %c, <8 x i32> %d) {
>> +  ; CHECK: cost of 8 {{.*}} sitofp
>> +  %A1 = sitofp <8 x i1> %a to <8 x float>
>> +
>> +  ; CHECK: cost of 8 {{.*}} sitofp
>> +  %B1 = sitofp <8 x i8> %b to <8 x float>
>> +
>> +  ; CHECK: cost of 5 {{.*}} sitofp
>> +  %C1 = sitofp <8 x i16> %c to <8 x float>
>> +
>> +  ; CHECK: cost of 1 {{.*}} sitofp
>> +  %D1 = sitofp <8 x i32> %d to <8 x float>
>> +  ret void
>> +}
>> +
>> +define void @uitofp4(<4 x i1> %a, <4 x i8> %b, <4 x i16> %c, <4 x i32> %d) {
>> +  ; CHECK: cost of 7 {{.*}} uitofp
>> +  %A1 = uitofp <4 x i1> %a to <4 x float>
>> +  ; CHECK: cost of 7 {{.*}} uitofp
>> +  %A2 = uitofp <4 x i1> %a to <4 x double>
>> +
>> +  ; CHECK: cost of 2 {{.*}} uitofp
>> +  %B1 = uitofp <4 x i8> %b to <4 x float>
>> +  ; CHECK: cost of 2 {{.*}} uitofp
>> +  %B2 = uitofp <4 x i8> %b to <4 x double>
>> +
>> +  ; CHECK: cost of 2 {{.*}} uitofp
>> +  %C1 = uitofp <4 x i16> %c to <4 x float>
>> +  ; CHECK: cost of 2 {{.*}} uitofp
>> +  %C2 = uitofp <4 x i16> %c to <4 x double>
>> +
>> +  ; CHECK: cost of 6 {{.*}} uitofp
>> +  %D1 = uitofp <4 x i32> %d to <4 x float>
>> +  ; CHECK: cost of 6 {{.*}} uitofp
>> +  %D2 = uitofp <4 x i32> %d to <4 x double>
>> +  ret void
>> +}
>> +
>> +define void @uitofp8(<8 x i1> %a, <8 x i8> %b, <8 x i16> %c, <8 x i32> %d) {
>> +  ; CHECK: cost of 6 {{.*}} uitofp
>> +  %A1 = uitofp <8 x i1> %a to <8 x float>
>> +
>> +  ; CHECK: cost of 5 {{.*}} uitofp
>> +  %B1 = uitofp <8 x i8> %b to <8 x float>
>> +
>> +  ; CHECK: cost of 5 {{.*}} uitofp
>> +  %C1 = uitofp <8 x i16> %c to <8 x float>
>> +
>> +  ; CHECK: cost of 9 {{.*}} uitofp
>> +  %D1 = uitofp <8 x i32> %d to <8 x float>
>> +  ret void
>> +}
>> 
>> Modified: llvm/trunk/test/Transforms/LoopVectorize/X86/conversion-cost.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/X86/conversion-cost.ll?rev=178459&r1=178458&r2=178459&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/LoopVectorize/X86/conversion-cost.ll (original)
>> +++ llvm/trunk/test/Transforms/LoopVectorize/X86/conversion-cost.ll Mon Apr  1 05:23:49 2013
>> @@ -33,11 +33,10 @@ define i32 @conversion_cost2(i32 %n, i8*
>> 
>> .lr.ph:                                           ; preds = %0, %.lr.ph
>>   %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 9, %0 ]
>> -  %2 = add nsw i64 %indvars.iv, 3
>> -  %3 = trunc i64 %2 to i32
>> -  %4 = sitofp i32 %3 to float
>> -  %5 = getelementptr inbounds float* %B, i64 %indvars.iv
>> -  store float %4, float* %5, align 4
>> +  %add = add nsw i64 %indvars.iv, 3
>> +  %tofp = sitofp i64 %add to float
>> +  %gep = getelementptr inbounds float* %B, i64 %indvars.iv
>> +  store float %tofp, float* %gep, align 4
>>   %indvars.iv.next = add i64 %indvars.iv, 1
>>   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
>>   %exitcond = icmp eq i32 %lftr.wideiv, %n
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list