mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61934 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1e407c338f
commit
0f2831c820
@ -416,7 +416,7 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask,
|
|||||||
unsigned Align = AI->getAlignment();
|
unsigned Align = AI->getAlignment();
|
||||||
if (Align == 0 && TD) {
|
if (Align == 0 && TD) {
|
||||||
if (isa<AllocaInst>(AI))
|
if (isa<AllocaInst>(AI))
|
||||||
Align = TD->getPrefTypeAlignment(AI->getType()->getElementType());
|
Align = TD->getABITypeAlignment(AI->getType()->getElementType());
|
||||||
else if (isa<MallocInst>(AI)) {
|
else if (isa<MallocInst>(AI)) {
|
||||||
// Malloc returns maximally aligned memory.
|
// Malloc returns maximally aligned memory.
|
||||||
Align = TD->getABITypeAlignment(AI->getType()->getElementType());
|
Align = TD->getABITypeAlignment(AI->getType()->getElementType());
|
||||||
|
26
test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll
Normal file
26
test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll
Normal file
@ -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(...)
|
Loading…
Reference in New Issue
Block a user