From: Evan Cheng Date: Wed, 16 May 2007 23:45:53 +0000 (+0000) Subject: Add target hook to specify block size limit for if-conversion. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d60483ef99a15630abba934001b1ff7d16a33b18;p=oota-llvm.git Add target hook to specify block size limit for if-conversion. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37134 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Target/TargetInstrInfo.h b/include/llvm/Target/TargetInstrInfo.h index 00a05569b95..4c0e1b8e941 100644 --- a/include/llvm/Target/TargetInstrInfo.h +++ b/include/llvm/Target/TargetInstrInfo.h @@ -394,6 +394,11 @@ public: virtual bool PredicateInstruction(MachineInstr *MI, std::vector &Cond) const; + /// getBlockSize - Calculate the size of the specified MachineBasicBlock. + /// Note the result may not be 100% accurate especially if there are inline + /// asm's in the block. + virtual unsigned getBlockSize(MachineBasicBlock *MBB) const; + /// getPointerRegClass - Returns a TargetRegisterClass used for pointer /// values. virtual const TargetRegisterClass *getPointerRegClass() const { diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index 68807081305..d736a3ad202 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -434,6 +434,12 @@ public: return JumpBufAlignment; } + /// getIfCvtBlockLimit - returns the target specific if-conversion block size + /// limit. Any block whose size is greater should not be predicated. + virtual unsigned getIfCvtBlockSizeLimit() const { + return IfCvtBlockSizeLimit; + } + /// getPreIndexedAddressParts - returns true by value, base pointer and /// offset pointer and addressing mode by reference if the node's address /// can be legally represented as pre-indexed load / store address. @@ -750,6 +756,12 @@ protected: void setJumpBufAlignment(unsigned Align) { JumpBufAlignment = Align; } + + /// setIfCvtBlockSizeLimit - Set the target's if-conversion block size limit; + /// default is 2. + void setIfCvtBlockSizeLimit(unsigned Limit) { + IfCvtBlockSizeLimit = Limit; + } public: @@ -982,6 +994,10 @@ private: /// JumpBufAlignment - The alignment, in bytes, of the target's jmp_buf /// buffers unsigned JumpBufAlignment; + + /// IfCvtBlockSizeLimit - The maximum allowed block size for if-conversion. + /// + unsigned IfCvtBlockSizeLimit; /// StackPointerRegisterToSaveRestore - If set to a physical register, this /// specifies the register that llvm.savestack/llvm.restorestack should save diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 1a8a4bc349f..970533b9a51 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -157,6 +157,7 @@ TargetLowering::TargetLowering(TargetMachine &tm) SchedPreferenceInfo = SchedulingForLatency; JumpBufSize = 0; JumpBufAlignment = 0; + IfCvtBlockSizeLimit = 2; InitLibcallNames(LibcallRoutineNames); InitCmpLibcallCCs(CmpLibcallCCs);