[llvm-commits] [llvm] r161232 - in /llvm/trunk: include/llvm/CodeGen/FastISel.h include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/FastISel.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/ARM/ARMFastISel.cpp lib/Target/ARM

Bob Wilson bob.wilson at apple.com
Thu Aug 2 22:16:29 PDT 2012


On Aug 2, 2012, at 9:59 PM, Eli Friedman <eli.friedman at gmail.com> wrote:

> On Thu, Aug 2, 2012 at 9:06 PM, Bob Wilson <bob.wilson at apple.com> wrote:
>> Author: bwilson
>> Date: Thu Aug  2 23:06:28 2012
>> New Revision: 161232
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=161232&view=rev
>> Log:
>> Fall back to selection DAG isel for calls to builtin functions.
>> 
>> Fast isel doesn't currently have support for translating builtin function
>> calls to target instructions.  For embedded environments where the library
>> functions are not available, this is a matter of correctness and not
>> just optimization.  Most of this patch is just arranging to make the
>> TargetLibraryInfo available in fast isel.  <rdar://problem/12008746>
>> 
>> Modified:
>>    llvm/trunk/include/llvm/CodeGen/FastISel.h
>>    llvm/trunk/include/llvm/Target/TargetLowering.h
>>    llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
>>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
>>    llvm/trunk/lib/Target/ARM/ARMFastISel.cpp
>>    llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
>>    llvm/trunk/lib/Target/ARM/ARMISelLowering.h
>>    llvm/trunk/lib/Target/X86/X86FastISel.cpp
>>    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>>    llvm/trunk/lib/Target/X86/X86ISelLowering.h
>>    llvm/trunk/test/CodeGen/X86/fabs.ll
>> 
>> Modified: llvm/trunk/include/llvm/CodeGen/FastISel.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/FastISel.h?rev=161232&r1=161231&r2=161232&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/CodeGen/FastISel.h (original)
>> +++ llvm/trunk/include/llvm/CodeGen/FastISel.h Thu Aug  2 23:06:28 2012
>> @@ -34,6 +34,7 @@
>> class MachineRegisterInfo;
>> class TargetData;
>> class TargetInstrInfo;
>> +class TargetLibraryInfo;
>> class TargetLowering;
>> class TargetMachine;
>> class TargetRegisterClass;
>> @@ -57,6 +58,7 @@
>>   const TargetInstrInfo &TII;
>>   const TargetLowering &TLI;
>>   const TargetRegisterInfo &TRI;
>> +  const TargetLibraryInfo *LibInfo;
>> 
>>   /// The position of the last instruction for materializing constants
>>   /// for use in the current block. It resets to EmitStartPt when it
>> @@ -144,7 +146,8 @@
>>   virtual ~FastISel();
>> 
>> protected:
>> -  explicit FastISel(FunctionLoweringInfo &funcInfo);
>> +  explicit FastISel(FunctionLoweringInfo &funcInfo,
>> +                    const TargetLibraryInfo *libInfo);
>> 
>>   /// TargetSelectInstruction - This method is called by target-independent
>>   /// code when the normal FastISel process fails to select an instruction.
>> 
>> Modified: llvm/trunk/include/llvm/Target/TargetLowering.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=161232&r1=161231&r2=161232&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
>> +++ llvm/trunk/include/llvm/Target/TargetLowering.h Thu Aug  2 23:06:28 2012
>> @@ -51,6 +51,7 @@
>>   template<typename T> class SmallVectorImpl;
>>   class TargetData;
>>   class TargetRegisterClass;
>> +  class TargetLibraryInfo;
>>   class TargetLoweringObjectFile;
>>   class Value;
>> 
>> @@ -1413,7 +1414,8 @@
>> 
>>   /// createFastISel - This method returns a target specific FastISel object,
>>   /// or null if the target does not support "fast" ISel.
>> -  virtual FastISel *createFastISel(FunctionLoweringInfo &) const {
>> +  virtual FastISel *createFastISel(FunctionLoweringInfo &,
>> +                                   const TargetLibraryInfo *) const {
>>     return 0;
>>   }
>> 
>> 
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=161232&r1=161231&r2=161232&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Thu Aug  2 23:06:28 2012
>> @@ -55,6 +55,7 @@
>> #include "llvm/Analysis/Loads.h"
>> #include "llvm/Target/TargetData.h"
>> #include "llvm/Target/TargetInstrInfo.h"
>> +#include "llvm/Target/TargetLibraryInfo.h"
>> #include "llvm/Target/TargetLowering.h"
>> #include "llvm/Target/TargetMachine.h"
>> #include "llvm/Support/ErrorHandling.h"
>> @@ -789,6 +790,18 @@
>> 
>>   MachineBasicBlock::iterator SavedInsertPt = FuncInfo.InsertPt;
>> 
>> +  // As a special case, don't even try to handle calls to builtin library
>> +  // functions so that calls to builtin functions get translated to
>> +  // instructions when supported by the target.
>> +  if (const CallInst *Call = dyn_cast<CallInst>(I)) {
>> +    const Function *F = Call->getCalledFunction();
>> +    LibFunc::Func Func;
>> +    if (F && !F->hasLocalLinkage() && F->hasName() &&
>> +        LibInfo->getLibFunc(F->getName(), Func) &&
>> +        LibInfo->has(Func))
>> +      return false;
>> +  }
> 
> This falls back to DAG-isel for any function recognized by
> TargetLibraryInfo.  This is means that we can't use fast-isel to
> select, for example, printf.  I'm slightly worried about the
> compile-time performance impact.

I was hoping it wouldn't occur that often, but I might be wrong.  I'll keep an eye out for regressions.  If necessary, I could limit it to specific functions.



More information about the llvm-commits mailing list