Created
August 6, 2012 17:35
-
-
Save d0k/3276987 to your computer and use it in GitHub Desktop.
c-ray inliner fix
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/Analysis/InlineCost.cpp b/lib/Analysis/InlineCost.cpp | |
index a6bf4a8..8e7377d 100644 | |
--- a/lib/Analysis/InlineCost.cpp | |
+++ b/lib/Analysis/InlineCost.cpp | |
@@ -797,9 +797,30 @@ bool CallAnalyzer::analyzeCall(CallSite CS) { | |
FiftyPercentVectorBonus = Threshold; | |
TenPercentVectorBonus = Threshold / 2; | |
- // Subtract off one instruction per call argument as those will be free after | |
- // inlining. | |
- Cost -= CS.arg_size() * InlineConstants::InstrCost; | |
+ // Give out bonuses per argument, as the instructions setting them up will | |
+ // be gone after inlining. | |
+ for (unsigned I = 0, E = CS.arg_size(); I != E; ++I) { | |
+ if (TD && CS.isByValArgument(I)) { | |
+ // We approximate the number of loads and stores needed by dividing the | |
+ // size of the byval type by the target's pointer size. | |
+ PointerType *PTy = cast<PointerType>(CS.getArgument(I)->getType()); | |
+ unsigned TypeSize = TD->getTypeSizeInBits(PTy->getElementType()); | |
+ unsigned PointerSize = TD->getPointerSizeInBits(); | |
+ // Ceiling division. | |
+ unsigned NumStores = (TypeSize + PointerSize - 1) / PointerSize; | |
+ | |
+ // If it generates more than 8 stores it is likely to be expanded as an | |
+ // inline memcpy so we take that as an upper bound. Otherwise we assume | |
+ // one load and one store per word copied. | |
+ NumStores = std::min(NumStores, 8U); | |
+ | |
+ Cost -= 2 * NumStores * InlineConstants::InstrCost; | |
+ } else { | |
+ // For non-byval arguments subtract off one instruction per call | |
+ // argument. | |
+ Cost -= InlineConstants::InstrCost; | |
+ } | |
+ } | |
// If there is only one call of the function, and it has internal linkage, | |
// the cost of inlining it drops dramatically. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment