From fceb978fd36cb74ec8f457d927484a38bf51ea28 Mon Sep 17 00:00:00 2001 From: Richard Diamond Date: Wed, 5 Aug 2015 22:10:57 +0000 Subject: [PATCH] Divide the primitive size in bits by eight so the initial load's alignment is in bytes as expected. Tested with the included unit test. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244155 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AtomicExpandPass.cpp | 2 +- .../AtomicExpand/expand-atomic-rmw-initial-load.ll | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/AtomicExpand/expand-atomic-rmw-initial-load.ll diff --git a/lib/CodeGen/AtomicExpandPass.cpp b/lib/CodeGen/AtomicExpandPass.cpp index 03b0ff32f15..c10648c6e3b 100644 --- a/lib/CodeGen/AtomicExpandPass.cpp +++ b/lib/CodeGen/AtomicExpandPass.cpp @@ -550,7 +550,7 @@ bool llvm::expandAtomicRMWToCmpXchg(AtomicRMWInst *AI, Builder.SetInsertPoint(BB); LoadInst *InitLoaded = Builder.CreateLoad(Addr); // Atomics require at least natural alignment. - InitLoaded->setAlignment(AI->getType()->getPrimitiveSizeInBits()); + InitLoaded->setAlignment(AI->getType()->getPrimitiveSizeInBits() / 8); Builder.CreateBr(LoopBB); // Start the main loop block now that we've taken care of the preliminaries. diff --git a/test/Transforms/AtomicExpand/expand-atomic-rmw-initial-load.ll b/test/Transforms/AtomicExpand/expand-atomic-rmw-initial-load.ll new file mode 100644 index 00000000000..197250ef455 --- /dev/null +++ b/test/Transforms/AtomicExpand/expand-atomic-rmw-initial-load.ll @@ -0,0 +1,8 @@ +; RUN: opt -S %s -atomic-expand -mtriple=i686-linux-gnu | FileCheck %s + +define i8 @test_initial_load(i8* %ptr, i8 %value) { + %res = atomicrmw nand i8* %ptr, i8 %value seq_cst + ret i8 %res +} +; CHECK-LABEL: @test_initial_load +; CHECK-NEXT: %1 = load i8, i8* %ptr, align 1 -- 2.34.1