[llvm-commits] [llvm] r60608 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86Subtarget.cpp lib/Transforms/Scalar/LoopStrengthReduce.cpp test/CodeGen/X86/loop-strength-reduce-2.ll test/CodeGen/X86/loop-strength-reduce-3.ll test/CodeGen/X86/loop-strength-reduce.ll
Evan Cheng
evan.cheng at apple.com
Fri Dec 5 16:12:33 PST 2008
On Dec 5, 2008, at 3:58 PM, Dale Johannesen wrote:
>
> On Dec 5, 2008, at 3:52 PMPST, Evan Cheng wrote:
>>> On Dec 5, 2008, at 2:01 PMPST, Anton Korobeynikov wrote:
>>>
>>>> Hi, Dale
>>>>
>>>>>
>>>>> +/// True if accessing the GV requires a register. This is a
>>>>> superset of the
>>>>> +/// cases where GVRequiresExtraLoad is true. Some variations of
>>>>> PIC require
>>>>> +/// a register, but not an extra load.
>>>>> +bool X86Subtarget::GVRequiresRegister(const GlobalValue *GV,
>>>>> + const TargetMachine& TM,
>>>>> + bool isDirectCall) const
>>>>> +{
>>>>> + if (GVRequiresExtraLoad(GV, TM, isDirectCall))
>>>>> + return true;
>>>>> + // Code below here need only consider cases where
>>>>> GVRequiresExtraLoad
>>>>> + // returns false.
>>>>> + if (TM.getRelocationModel() == Reloc::PIC_)
>>>>> + return !isDirectCall &&
>>>>> + (GV->hasInternalLinkage() || GV->hasExternalLinkage());
>>>> I don't understand this. Why only internal and external linkage?
>>>
>>> All the others are already handled by GVRequiresExtraLoad. (At
>>> least
>>> for Darwin.)
>>
>> That doesn't sound right. For Darwin x86 32-bit PIC, all data load
>> requires the pic base register. This has nothing to do with whether a
>> stub is needed.
>
> What is it that doesn't sound right? You're quite right this has
> nothing to do with stubs, why do you think it does?
>
> There is a difference between requiring the pic register and requiring
> an extra
> load; the former was not being modelled. Externals are referenced via
> leal L_x5$non_lazy_ptr-"L00000000001$pb"(%ebx), %eax
> movl (%eax), %eax << loading address
> movl (%eax), %eax << loading value
> This case returns true from GVRequiresExtraLoad.
>
> Statics and globals are referenced via
> leal _x0-"L00000000001$pb"(%ebx), %eax
> movl (%eax), %eax << loading value
> This case returns false from GVRequiresExtraLoad but true from
> GVRequiresRegister.
I don't think GVRequiresRegister needs to call GVRequiresExtraLoad
though. Even if it returns false, GVRequiresRegister should always
return true for PIC && !DirectCall. It needs PIC base even if linkage
is weak, common, etc.
Plus, you should check relocation model first which is cheaper than
GVRequiresExtraLoad.
Evan
>
>
> _______________________________________________
> 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