diff options
author | Dan Gohman <gohman@apple.com> | 2009-01-13 20:18:38 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-01-13 20:18:38 +0000 |
commit | 6893cd76152e805291c3c9f36fa81b330846434d (patch) | |
tree | 7f565f242173d6387ffe674d2384b309a816cf14 | |
parent | 1b0469411628d8f2d6a234016481bf9aafb14362 (diff) | |
download | external_llvm-6893cd76152e805291c3c9f36fa81b330846434d.zip external_llvm-6893cd76152e805291c3c9f36fa81b330846434d.tar.gz external_llvm-6893cd76152e805291c3c9f36fa81b330846434d.tar.bz2 |
Make instcombine ensure that all allocas are explicitly aligned at at
least their preferred alignment.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62176 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 17 | ||||
-rw-r--r-- | test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll | 4 | ||||
-rw-r--r-- | test/Transforms/InstCombine/loadstore-alignment.ll | 2 |
3 files changed, 15 insertions, 8 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index ee3596b..f640915 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -10775,12 +10775,17 @@ Instruction *InstCombiner::visitAllocationInst(AllocationInst &AI) { } } - // If alloca'ing a zero byte object, replace the alloca with a null pointer. - // Note that we only do this for alloca's, because malloc should allocate and - // return a unique pointer, even for a zero byte allocation. - if (isa<AllocaInst>(AI) && AI.getAllocatedType()->isSized() && - TD->getTypePaddedSize(AI.getAllocatedType()) == 0) - return ReplaceInstUsesWith(AI, Constant::getNullValue(AI.getType())); + if (isa<AllocaInst>(AI) && AI.getAllocatedType()->isSized()) { + // If alloca'ing a zero byte object, replace the alloca with a null pointer. + // Note that we only do this for alloca's, because malloc should allocate and + // return a unique pointer, even for a zero byte allocation. + if (TD->getTypePaddedSize(AI.getAllocatedType()) == 0) + return ReplaceInstUsesWith(AI, Constant::getNullValue(AI.getType())); + + // If the alignment is 0 (unspecified), assign it the preferred alignment. + if (AI.getAlignment() == 0) + AI.setAlignment(TD->getPrefTypeAlignment(AI.getAllocatedType())); + } return 0; } diff --git a/test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll b/test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll index c4c79a9..82b923a 100644 --- a/test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll +++ b/test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll @@ -1,4 +1,6 @@ -; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {, align 4} | count 4 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis > %t +; RUN: grep {, align 4} %t | count 3 +; RUN: grep {, align 8} %t | count 3 ; 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" diff --git a/test/Transforms/InstCombine/loadstore-alignment.ll b/test/Transforms/InstCombine/loadstore-alignment.ll index 82be575..ebea3e4 100644 --- a/test/Transforms/InstCombine/loadstore-alignment.ll +++ b/test/Transforms/InstCombine/loadstore-alignment.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {, align 16} | count 12 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {, align 16} | count 14 @x = external global <2 x i64>, align 16 @xx = external global [13 x <2 x i64>], align 16 |