aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/NaCl/ExpandI64.cpp10
-rw-r--r--test/Transforms/NaCl/expand-i64.ll29
2 files changed, 37 insertions, 2 deletions
diff --git a/lib/Transforms/NaCl/ExpandI64.cpp b/lib/Transforms/NaCl/ExpandI64.cpp
index ae3b67e6e7..6034880613 100644
--- a/lib/Transforms/NaCl/ExpandI64.cpp
+++ b/lib/Transforms/NaCl/ExpandI64.cpp
@@ -389,7 +389,10 @@ bool ExpandI64::splitInst(Instruction *I) {
Instruction *Add = i == 0 ? AI : CopyDebug(BinaryOperator::Create(Instruction::Add, AI, ConstantInt::get(i32, 4*i), "", I), I);
Instruction *Ptr = CopyDebug(new IntToPtrInst(Add, i32P, "", I), I);
LoadInst *Chunk = new LoadInst(Ptr, "", I); CopyDebug(Chunk, I);
- Chunk->setAlignment(std::min(4U, LI->getAlignment()));
+ Chunk->setAlignment(MinAlign(LI->getAlignment() == 0 ?
+ DL->getABITypeAlignment(LI->getType()) :
+ LI->getAlignment(),
+ 4*i));
Chunk->setVolatile(LI->isVolatile());
Chunk->setOrdering(LI->getOrdering());
Chunk->setSynchScope(LI->getSynchScope());
@@ -406,7 +409,10 @@ bool ExpandI64::splitInst(Instruction *I) {
Instruction *Add = i == 0 ? AI : CopyDebug(BinaryOperator::Create(Instruction::Add, AI, ConstantInt::get(i32, 4*i), "", I), I);
Instruction *Ptr = CopyDebug(new IntToPtrInst(Add, i32P, "", I), I);
StoreInst *Chunk = new StoreInst(InputChunks[i], Ptr, I);
- Chunk->setAlignment(std::min(4U, SI->getAlignment()));
+ Chunk->setAlignment(MinAlign(SI->getAlignment() == 0 ?
+ DL->getABITypeAlignment(SI->getValueOperand()->getType()) :
+ SI->getAlignment(),
+ 4*i));
Chunk->setVolatile(SI->isVolatile());
Chunk->setOrdering(SI->getOrdering());
Chunk->setSynchScope(SI->getSynchScope());
diff --git a/test/Transforms/NaCl/expand-i64.ll b/test/Transforms/NaCl/expand-i64.ll
index df4804d19b..fd468fc6d1 100644
--- a/test/Transforms/NaCl/expand-i64.ll
+++ b/test/Transforms/NaCl/expand-i64.ll
@@ -217,6 +217,21 @@ define i64 @load(i64 *%a) {
ret i64 %c
}
+; CHECK: define i32 @aligned_load(i64* %a) {
+; CHECK: %1 = ptrtoint i64* %a to i32
+; CHECK: %2 = inttoptr i32 %1 to i32*
+; CHECK: %3 = load i32* %2, align 16
+; CHECK: %4 = add i32 %1, 4
+; CHECK: %5 = inttoptr i32 %4 to i32*
+; CHECK: %6 = load i32* %5, align 4
+; CHECK: call void @setHigh32(i32 %6)
+; CHECK: ret i32 %3
+; CHECK: }
+define i64 @aligned_load(i64 *%a) {
+ %c = load i64* %a, align 16
+ ret i64 %c
+}
+
; CHECK: define void @store(i64* %a, i32, i32) {
; CHECK: %3 = ptrtoint i64* %a to i32
; CHECK: %4 = inttoptr i32 %3 to i32*
@@ -231,6 +246,20 @@ define void @store(i64 *%a, i64 %b) {
ret void
}
+; CHECK: define void @aligned_store(i64* %a, i32, i32) {
+; CHECK: %3 = ptrtoint i64* %a to i32
+; CHECK: %4 = inttoptr i32 %3 to i32*
+; CHECK: store i32 %0, i32* %4, align 16
+; CHECK: %5 = add i32 %3, 4
+; CHECK: %6 = inttoptr i32 %5 to i32*
+; CHECK: store i32 %1, i32* %6, align 4
+; CHECK: ret void
+; CHECK: }
+define void @aligned_store(i64 *%a, i64 %b) {
+ store i64 %b, i64* %a, align 16
+ ret void
+}
+
; CHECK: define i32 @call(i32, i32) {
; CHECK: %3 = call i32 @foo(i32 %0, i32 %1)
; CHECK: %4 = call i32 @getHigh32()