diff --git a/include/llvm/Transforms/Scalar.h b/include/llvm/Transforms/Scalar.h index a0f51fccb36..948d6b5aaed 100644 --- a/include/llvm/Transforms/Scalar.h +++ b/include/llvm/Transforms/Scalar.h @@ -76,7 +76,7 @@ FunctionPass *createAggressiveDCEPass(); // ScalarReplAggregates - Break up alloca's of aggregates into multiple allocas // if possible. // -FunctionPass *createScalarReplAggregatesPass(); +FunctionPass *createScalarReplAggregatesPass(signed Threshold = -1); //===----------------------------------------------------------------------===// // diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index e31fdd16e1b..5e7dbc2ff8f 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -48,7 +48,12 @@ STATISTIC(NumGlobals, "Number of allocas copied from constant global"); namespace { struct VISIBILITY_HIDDEN SROA : public FunctionPass { static char ID; // Pass identification, replacement for typeid - SROA() : FunctionPass((intptr_t)&ID) {} + SROA(signed T = -1) : FunctionPass((intptr_t)&ID) { + if (T == -1) + SRThreshold = 128; + else + SRThreshold = T; + } bool runOnFunction(Function &F); @@ -87,6 +92,8 @@ namespace { isMemCpySrc(false), isMemCpyDst(false) {} }; + unsigned SRThreshold; + void MarkUnsafe(AllocaInfo &I) { I.isUnsafe = true; } int isSafeAllocaToScalarRepl(AllocationInst *AI); @@ -119,7 +126,9 @@ namespace { } // Public interface to the ScalarReplAggregates pass -FunctionPass *llvm::createScalarReplAggregatesPass() { return new SROA(); } +FunctionPass *llvm::createScalarReplAggregatesPass(signed int Threshold) { + return new SROA(Threshold); +} bool SROA::runOnFunction(Function &F) { @@ -211,7 +220,7 @@ bool SROA::performScalarRepl(Function &F) { (isa(AI->getAllocatedType()) || isa(AI->getAllocatedType())) && AI->getAllocatedType()->isSized() && - TD.getTypeSize(AI->getAllocatedType()) < 128) { + TD.getTypeSize(AI->getAllocatedType()) < SRThreshold) { // Check that all of the users of the allocation are capable of being // transformed. switch (isSafeAllocaToScalarRepl(AI)) {