Index: llvm/lib/CodeGen/CodeGenPrepare.cpp =================================================================== --- llvm/lib/CodeGen/CodeGenPrepare.cpp +++ llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -6717,7 +6717,8 @@ SplitStoreType, Addr, ConstantInt::get(Type::getInt32Ty(SI.getContext()), 1)); Builder.CreateAlignedStore( - V, Addr, Upper ? SI.getAlignment() / 2 : SI.getAlignment()); + V, Addr, Upper ? SI.getAlignment() / 2 : SI.getAlignment(), + SI.isVolatile()); }; CreateSplitStore(LValue, false); Index: llvm/test/CodeGen/PowerPC/splitstore-check-volatile.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/PowerPC/splitstore-check-volatile.ll @@ -0,0 +1,18 @@ +; Test that CodeGenPrepare keeps the volatile flag when splitting a store. +; +; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -stop-after codegenprepare -force-split-store < %s | FileCheck %s + +define void @fun(i16* %Src, i16* %Dst) { +; CHECK: store volatile i8 %2, i8* %9 +; CHECK: store volatile i8 %4, i8* %11 + %1 = load i16, i16* %Src + %2 = trunc i16 %1 to i8 + %3 = lshr i16 %1, 8 + %4 = trunc i16 %3 to i8 + %5 = zext i8 %2 to i16 + %6 = zext i8 %4 to i16 + %7 = shl nuw i16 %6, 8 + %8 = or i16 %7, %5 + store volatile i16 %8, i16* %Dst + ret void +}