From 6893cd76152e805291c3c9f36fa81b330846434d Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 13 Jan 2009 20:18:38 +0000 Subject: [PATCH] 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 --- lib/Transforms/Scalar/InstructionCombining.cpp | 17 +++++++++++------ .../InstCombine/2009-01-08-AlignAlloca.ll | 4 +++- .../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 ee3596bde43..f640915386d 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(AI) && AI.getAllocatedType()->isSized() && - TD->getTypePaddedSize(AI.getAllocatedType()) == 0) - return ReplaceInstUsesWith(AI, Constant::getNullValue(AI.getType())); + if (isa(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 c4c79a948ca..82b923ac95c 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 82be575b328..ebea3e4fe83 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