Skip to content

Commit

Permalink
Make instcombine set explicit alignments on load or store
Browse files Browse the repository at this point in the history
instructions with alignment 0, so that subsequent passes don't
need to bother checking the TargetData ABI size manually.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110128 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Dan Gohman committed Aug 3, 2010
1 parent efb59d2 commit 0fd3533
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 20 deletions.
20 changes: 14 additions & 6 deletions lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,10 +146,14 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
if (TD) {
unsigned KnownAlign =
GetOrEnforceKnownAlignment(Op, TD->getPrefTypeAlignment(LI.getType()));
if (KnownAlign >
(LI.getAlignment() == 0 ? TD->getABITypeAlignment(LI.getType()) :
LI.getAlignment()))
unsigned LoadAlign = LI.getAlignment();
unsigned EffectiveLoadAlign = LoadAlign != 0 ? LoadAlign :
TD->getABITypeAlignment(LI.getType());

if (KnownAlign > EffectiveLoadAlign)
LI.setAlignment(KnownAlign);
else if (LoadAlign == 0)
LI.setAlignment(EffectiveLoadAlign);
}

// load (cast X) --> cast (load X) iff safe.
Expand Down Expand Up @@ -411,10 +415,14 @@ Instruction *InstCombiner::visitStoreInst(StoreInst &SI) {
if (TD) {
unsigned KnownAlign =
GetOrEnforceKnownAlignment(Ptr, TD->getPrefTypeAlignment(Val->getType()));
if (KnownAlign >
(SI.getAlignment() == 0 ? TD->getABITypeAlignment(Val->getType()) :
SI.getAlignment()))
unsigned StoreAlign = SI.getAlignment();
unsigned EffectiveStoreAlign = StoreAlign != 0 ? StoreAlign :
TD->getABITypeAlignment(Val->getType());

if (KnownAlign > EffectiveStoreAlign)
SI.setAlignment(KnownAlign);
else if (StoreAlign == 0)
SI.setAlignment(EffectiveStoreAlign);
}

// Do really simple DSE, to catch cases where there are several consecutive
Expand Down
33 changes: 31 additions & 2 deletions test/Transforms/InstCombine/align-addr.ll
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
; RUN: opt < %s -instcombine -S | grep {align 16} | count 1
; RUN: opt < %s -instcombine -S | FileCheck %s
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"

; Instcombine should be able to prove vector alignment in the
; presence of a few mild address computation tricks.

define void @foo(i8* %b, i64 %n, i64 %u, i64 %y) nounwind {
; CHECK: @test0(
; CHECK: align 16

define void @test0(i8* %b, i64 %n, i64 %u, i64 %y) nounwind {
entry:
%c = ptrtoint i8* %b to i64
%d = and i64 %c, -16
Expand All @@ -29,3 +32,29 @@ return:
ret void
}

; When we see a unaligned load from an insufficiently aligned global or
; alloca, increase the alignment of the load, turning it into an aligned load.

; CHECK: @test1(
; CHECK: tmp = load
; CHECK: GLOBAL{{.*}}align 16

@GLOBAL = internal global [4 x i32] zeroinitializer

define <16 x i8> @test1(<2 x i64> %x) {
entry:
%tmp = load <16 x i8>* bitcast ([4 x i32]* @GLOBAL to <16 x i8>*), align 1
ret <16 x i8> %tmp
}

; When a load or store lacks an explicit alignment, add one.

; CHECK: @test2(
; CHECK: load double* %p, align 8
; CHECK: store double %n, double* %p, align 8

define double @test2(double* %p, double %n) nounwind {
%t = load double* %p
store double %n, double* %p
ret double %t
}
12 changes: 0 additions & 12 deletions test/Transforms/InstCombine/align-inc.ll

This file was deleted.

0 comments on commit 0fd3533

Please sign in to comment.