diff options
-rw-r--r-- | lib/Transforms/NaCl/ExpandI64.cpp | 10 | ||||
-rw-r--r-- | test/Transforms/NaCl/expand-i64.ll | 29 |
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() |