diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-01-08 19:28:38 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-01-08 19:28:38 +0000 |
| commit | f3e696bc5a89e4212623c67bfb69f66d982be05f (patch) | |
| tree | 830931b82a963619523e7b4cb0d920d29e13e4d7 | |
| parent | 8c1cc34d6a2bbf68a2e507c31207dd957b91f43f (diff) | |
| download | bcm5719-llvm-f3e696bc5a89e4212623c67bfb69f66d982be05f.tar.gz bcm5719-llvm-f3e696bc5a89e4212623c67bfb69f66d982be05f.zip | |
ValueTracker can't assume that an alloca with no specified alignment
will get its preferred alignment. It has to be careful and cautiously assume
it will just get the ABI alignment. This prevents instcombine from rounding
up the alignment of a load/store without adjusting the alignment of the alloca.
llvm-svn: 61934
| -rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll | 26 |
2 files changed, 27 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index c51a719313f..b8aac9deb79 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -416,7 +416,7 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask, unsigned Align = AI->getAlignment(); if (Align == 0 && TD) { if (isa<AllocaInst>(AI)) - Align = TD->getPrefTypeAlignment(AI->getType()->getElementType()); + Align = TD->getABITypeAlignment(AI->getType()->getElementType()); else if (isa<MallocInst>(AI)) { // Malloc returns maximally aligned memory. Align = TD->getABITypeAlignment(AI->getType()->getElementType()); diff --git a/llvm/test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll b/llvm/test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll new file mode 100644 index 00000000000..c4c79a948ca --- /dev/null +++ b/llvm/test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll @@ -0,0 +1,26 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {, align 4} | count 4 +; rdar://6480438 +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" +target triple = "i386-apple-darwin9.6" + %struct.Key = type { { i32, i32 } } + %struct.anon = type <{ i8, [3 x i8], i32 }> + +define i32 @bar(i64 %key_token2) nounwind { +entry: + %iospec = alloca %struct.Key ; <%struct.Key*> [#uses=3] + %ret = alloca i32 ; <i32*> [#uses=2] + %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + %0 = getelementptr %struct.Key* %iospec, i32 0, i32 0 ; <{ i32, i32 }*> [#uses=2] + %1 = getelementptr { i32, i32 }* %0, i32 0, i32 0 ; <i32*> [#uses=1] + store i32 0, i32* %1, align 4 + %2 = getelementptr { i32, i32 }* %0, i32 0, i32 1 ; <i32*> [#uses=1] + store i32 0, i32* %2, align 4 + %3 = getelementptr %struct.Key* %iospec, i32 0, i32 0 ; <{ i32, i32 }*> [#uses=1] + %4 = bitcast { i32, i32 }* %3 to i64* ; <i64*> [#uses=1] + store i64 %key_token2, i64* %4, align 4 + %5 = call i32 (...)* @foo(%struct.Key* byval align 4 %iospec, i32* %ret) nounwind ; <i32> [#uses=0] + %6 = load i32* %ret, align 4 ; <i32> [#uses=1] + ret i32 %6 +} + +declare i32 @foo(...) |

