From 8c93ddba10f715953c695f955aa18c4cc9927d95 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 2 Feb 2017 01:20:34 +0000 Subject: [PATCH] NVPTX: Fix not preserving volatile when expanding memset git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293851 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp | 7 ++++--- test/CodeGen/NVPTX/lower-aggr-copies.ll | 13 +++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp b/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp index b925b632ee4..cbb60a004e1 100644 --- a/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp +++ b/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp @@ -204,8 +204,8 @@ void convertMemMoveToLoop(Instruction *ConvertedInst, Value *SrcAddr, // Lower memset to loop. void convertMemSetToLoop(Instruction *ConvertedInst, Value *DstAddr, - Value *CopyLen, Value *SetValue, LLVMContext &Context, - Function &F) { + Value *CopyLen, Value *SetValue, + bool IsVolatile, LLVMContext &Context, Function &F) { BasicBlock *OrigBB = ConvertedInst->getParent(); BasicBlock *NewBB = ConvertedInst->getParent()->splitBasicBlock(ConvertedInst, "split"); @@ -226,7 +226,7 @@ void convertMemSetToLoop(Instruction *ConvertedInst, Value *DstAddr, LoopBuilder.CreateStore( SetValue, LoopBuilder.CreateInBoundsGEP(SetValue->getType(), DstAddr, LoopIndex), - false); + IsVolatile); Value *NewIndex = LoopBuilder.CreateAdd(LoopIndex, ConstantInt::get(CopyLen->getType(), 1)); @@ -325,6 +325,7 @@ bool NVPTXLowerAggrCopies::runOnFunction(Function &F) { /* DstAddr */ Memset->getRawDest(), /* CopyLen */ Memset->getLength(), /* SetValue */ Memset->getValue(), + /* IsVolatile */ Memset->isVolatile(), /* Context */ Context, /* Function F */ F); } diff --git a/test/CodeGen/NVPTX/lower-aggr-copies.ll b/test/CodeGen/NVPTX/lower-aggr-copies.ll index ef570982b80..c487c9bab4b 100644 --- a/test/CodeGen/NVPTX/lower-aggr-copies.ll +++ b/test/CodeGen/NVPTX/lower-aggr-copies.ll @@ -86,6 +86,19 @@ entry: ; PTX-NEXT: @%p[[PRED]] bra LBB[[LABEL]] } +define i8* @volatile_memset_caller(i8* %dst, i32 %c, i64 %n) #0 { +entry: + %0 = trunc i32 %c to i8 + tail call void @llvm.memset.p0i8.i64(i8* %dst, i8 %0, i64 %n, i32 1, i1 true) + ret i8* %dst + +; IR-LABEL: @volatile_memset_caller +; IR: [[VAL:%[0-9]+]] = trunc i32 %c to i8 +; IR: loadstoreloop: +; IR: [[STOREPTR:%[0-9]+]] = getelementptr inbounds i8, i8* %dst, i64 +; IR-NEXT: store volatile i8 [[VAL]], i8* [[STOREPTR]] +} + define i8* @memmove_caller(i8* %dst, i8* %src, i64 %n) #0 { entry: tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %dst, i8* %src, i64 %n, i32 1, i1 false)