mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-09 05:31:37 +00:00
[InstCombine] Make max size array combine a tunable.
Requested by Sanjoy/Hal a while ago, and forgotten by me (r283612). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294323 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
051dda606b
commit
4b54eb2c37
@ -230,7 +230,9 @@ Instruction *InstCombiner::foldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP,
|
||||
return nullptr;
|
||||
|
||||
uint64_t ArrayElementCount = Init->getType()->getArrayNumElements();
|
||||
if (ArrayElementCount > 1024) return nullptr; // Don't blow up on huge arrays.
|
||||
// Don't blow up on huge arrays.
|
||||
if (ArrayElementCount > MaxArraySizeForCombine)
|
||||
return nullptr;
|
||||
|
||||
// There are many forms of this optimization we can handle, for now, just do
|
||||
// the simple index into a single-dimensional array.
|
||||
|
@ -508,6 +508,9 @@ public:
|
||||
return llvm::computeOverflowForUnsignedAdd(LHS, RHS, DL, &AC, CxtI, &DT);
|
||||
}
|
||||
|
||||
/// Maximum size of array considered when transforming.
|
||||
int MaxArraySizeForCombine;
|
||||
|
||||
private:
|
||||
/// \brief Performs a few simplifications for operators which are associative
|
||||
/// or commutative.
|
||||
|
@ -609,7 +609,7 @@ static Instruction *unpackLoadToAggregate(InstCombiner &IC, LoadInst &LI) {
|
||||
// arrays of arbitrary size but this has a terrible impact on compile time.
|
||||
// The threshold here is chosen arbitrarily, maybe needs a little bit of
|
||||
// tuning.
|
||||
if (NumElements > 1024)
|
||||
if (NumElements > IC.MaxArraySizeForCombine)
|
||||
return nullptr;
|
||||
|
||||
const DataLayout &DL = IC.getDataLayout();
|
||||
@ -1114,7 +1114,7 @@ static bool unpackStoreToAggregate(InstCombiner &IC, StoreInst &SI) {
|
||||
// arrays of arbitrary size but this has a terrible impact on compile time.
|
||||
// The threshold here is chosen arbitrarily, maybe needs a little bit of
|
||||
// tuning.
|
||||
if (NumElements > 1024)
|
||||
if (NumElements > IC.MaxArraySizeForCombine)
|
||||
return false;
|
||||
|
||||
const DataLayout &DL = IC.getDataLayout();
|
||||
|
@ -82,6 +82,10 @@ static cl::opt<bool>
|
||||
EnableExpensiveCombines("expensive-combines",
|
||||
cl::desc("Enable expensive instruction combines"));
|
||||
|
||||
static cl::opt<unsigned>
|
||||
MaxArraySize("instcombine-maxarray-size", cl::init(1024),
|
||||
cl::desc("Maximum array size considered when doing a combine"));
|
||||
|
||||
Value *InstCombiner::EmitGEPOffset(User *GEP) {
|
||||
return llvm::EmitGEPOffset(Builder, DL, GEP);
|
||||
}
|
||||
@ -3148,6 +3152,7 @@ combineInstructionsOverFunction(Function &F, InstCombineWorklist &Worklist,
|
||||
|
||||
InstCombiner IC(Worklist, &Builder, F.optForMinSize(), ExpensiveCombines,
|
||||
AA, AC, TLI, DT, DL, LI);
|
||||
IC.MaxArraySizeForCombine = MaxArraySize;
|
||||
Changed |= IC.run();
|
||||
|
||||
if (!Changed)
|
||||
|
Loading…
Reference in New Issue
Block a user