[llvm] r186425 - When the inliner merges allocas, it must keep the larger alignment
Duncan Sands
duncan.sands at gmail.com
Wed Jul 17 04:01:23 PDT 2013
Hi Hal,
> When the inliner merges allocas, it must keep the larger alignment
>
> For safety, the inliner cannot decrease the allignment on an alloca when
> merging it with another.
>
> I've included two variants of the test case for this: one with DataLayout
> available, and one without. When DataLayout is not available, if only one of
> the allocas uses the default alignment (getAlignment() == 0), then they cannot
> be safely merged.
> --- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Tue Jul 16 12:10:55 2013
> @@ -189,6 +190,14 @@ static bool InlineCallIfPossible(CallSit
> bool MergedAwayAlloca = false;
> for (unsigned i = 0, e = AllocasForType.size(); i != e; ++i) {
> AllocaInst *AvailableAlloca = AllocasForType[i];
> +
> + unsigned Align1 = AI->getAlignment(),
> + Align2 = AvailableAlloca->getAlignment();
> + // If we don't have data layout information, and only one alloca is using
> + // the target default, then we can't safely merge them because we can't
> + // pick the greater alignment.
> + if (!TD && (!Align1 || !Align2) && Align1 != Align2)
> + continue;
>
> // The available alloca has to be in the right function, not in some other
> // function in this SCC.
> @@ -206,6 +215,11 @@ static bool InlineCallIfPossible(CallSit
> << *AvailableAlloca << '\n');
>
> AI->replaceAllUsesWith(AvailableAlloca);
> +
> + if (Align1 > Align2 || (!Align1 && TD &&
> + TD->getABITypeAlignment(AI->getAllocatedType()) > Align2))
> + AvailableAlloca->setAlignment(Align1);
If Align1 is 1 and Align2 is zero then you set the alignment to Align1 but
Align2 might represent a larger alignment. How about something like this:
if (Align1 != Align2) {
if (!Align1 || !Align2) {
assert(TD && "Should have bailed out earlier!");
unsigned TypeAlign = TD->getABITypeAlignment(AI->getAllocatedType());
if (!Align1)
Align1 = TypeAlign;
if (!Align2)
Align2 = TypeAlign;
}
if (Align1 > Align2)
AvailableAlloca->setAlignment(Align1);
}
Ciao, Duncan.
> +
> AI->eraseFromParent();
> MergedAwayAlloca = true;
> ++NumMergedAllocas;
More information about the llvm-commits
mailing list