Index: llvm/trunk/lib/CodeGen/AtomicExpandPass.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AtomicExpandPass.cpp +++ llvm/trunk/lib/CodeGen/AtomicExpandPass.cpp @@ -550,7 +550,7 @@ 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. Index: llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-initial-load.ll =================================================================== --- llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-initial-load.ll +++ llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-initial-load.ll @@ -0,0 +1,11 @@ +; RUN: opt -S %s -atomic-expand -mtriple=i686-linux-gnu | FileCheck %s + +; This file tests the function `llvm::expandAtomicRMWToCmpXchg`. +; It isn't technically target specific, but is exposed through a pass that is. + +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 Index: llvm/trunk/test/Transforms/AtomicExpand/X86/lit.local.cfg =================================================================== --- llvm/trunk/test/Transforms/AtomicExpand/X86/lit.local.cfg +++ llvm/trunk/test/Transforms/AtomicExpand/X86/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'X86' in config.root.targets: + config.unsupported = True