[llvm-dev] Questions about getGEPCost()

Haicheng Wu via llvm-dev llvm-dev at lists.llvm.org
Fri Nov 18 13:27:36 PST 2016


Hi Jingyue,

 

When I look at the cost model of GEP for the following IR on AArch64, I have a question about getGEPCost() that you implemented in 2015.

 

%"class.boost::array.16" = type { [24 x i32] }

%arrayidx.i17 = getelementptr inbounds %"class.boost::array.16", %"class.boost::array.16"* %moves, i64 0, i32 0, i64 %conv7                                                                               

store i32 %add, i32* %arrayidx.i17, align 4, !tbaa !18

 

GEP can be folded into the Store and the assembly is simple as 

 

str     w24, [x20, x8, lsl #2]

 

But the cost model says the GEP cannot be folded.  

 

getGEPCost() calls isLegalAddressingMode() in the following way to check the GEP can be folded or not

 

static_cast<T *>(this)->isLegalAddressingMode(                                                

            PointerType::get(*GTI, AS), const_cast<GlobalValue *>(BaseGV),

            BaseOffset, HasBaseReg, Scale, AS)

 

It seems to me that the first argument should be *GTI, rather than PointerType::get(*GTI, AS).  In my example, *GTI is i32 and PointerType::get(*GTI, AS) is i32*.  The current implementation fails the last check of AArch64TargetLowering::isLegalAddressingMode() which is 

 

AM.Scale > 0 && (uint64_t)AM.Scale == NumBytes

 

Because AM.Scale = 4 and NumBytes = 8

 

I checked the implementation of isLegalAddressingMode() in several different backends and several other passes (LoopStrengthReduce and CodeGenPrepare) that call isLegalAddressingMode().  It seems my understanding is correct.  Would you please take a look at this?

 

A simplified test case can be

 

gep.ll

 

%"class.boost::array.16" = type { [24 x i32] }

define void @test_geps(%"class.boost::array.16"* %moves, i64 %conv7) {

  %arrayidx.i17 = getelementptr inbounds %"class.boost::array.16", %"class.boost::array.16"* %moves, i64 0, i32 0, i64 %conv7

  ret void

}

 

Just run it with following command and the cost of GEP should be 0.

opt -cost-model -analyze -mtriple=aarch64-gnu-linux  gep.ll

 

Thank you in advance,

 

Haicheng Wu

Employee of Qualcomm Datacenter Technologies, Inc.

Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc.  Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161118/7439fd25/attachment.html>


More information about the llvm-dev mailing list