From a2a26b546c488b83b6c1e3955ebae941fb48b2d0 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Fri, 16 Mar 2012 07:40:08 +0000 Subject: [PATCH] The alignment of the pointer part of the store instruction may have an alignment. If that's the case, then we want to make sure that we don't increase the alignment of the store instruction. Because if we increase it to be "more aligned" than the pointer, code-gen may use instructions which require a greater alignment than the pointer guarantees. llvm-svn: 152907 --- .../InstCombine/InstCombineLoadStoreAlloca.cpp | 18 +++++++++++++++--- .../InstCombine/2012-03-16-StoreAlignment.ll | 12 ++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll diff --git a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index 7446a51a4db1..fa68000df584 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -379,10 +379,22 @@ Instruction *InstCombiner::visitStoreInst(StoreInst &SI) { unsigned EffectiveStoreAlign = StoreAlign != 0 ? StoreAlign : TD->getABITypeAlignment(Val->getType()); - if (KnownAlign > EffectiveStoreAlign) + if (KnownAlign > EffectiveStoreAlign) { SI.setAlignment(KnownAlign); - else if (StoreAlign == 0) - SI.setAlignment(EffectiveStoreAlign); + } else if (StoreAlign == 0) { + unsigned PtrAlign = 0; + if (GlobalValue *GV = dyn_cast(Ptr->stripPointerCasts())) + PtrAlign = GV->getAlignment(); + + if (PtrAlign != 0 && PtrAlign < EffectiveStoreAlign) + // The pointer alignment may be less than the effective store + // alignment. If so, then we don't want to increase the alignment here, + // since that could lead to code-gen using instructions which require a + // higher alignment than the pointer guarantees. + SI.setAlignment(PtrAlign); + else + SI.setAlignment(EffectiveStoreAlign); + } } // Don't hack volatile/atomic stores. diff --git a/llvm/test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll b/llvm/test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll new file mode 100644 index 000000000000..7f05a89c505d --- /dev/null +++ b/llvm/test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll @@ -0,0 +1,12 @@ +; RUN: opt < %s -S -instcombine | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" + +%0 = type { i32, i8, i8, i8 } + +@G = external hidden global %0, align 4 + +define void @f1(i64 %a1) nounwind ssp align 2 { +; CHECK: store i64 %a1, i64* bitcast (%0* @G to i64*), align 4 + store i64 %a1, i64* bitcast (%0* @G to i64*) + ret void +}