]> granicus.if.org Git - llvm/commitdiff
NVPTX: Fix not preserving volatile when expanding memset
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 2 Feb 2017 01:20:34 +0000 (01:20 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 2 Feb 2017 01:20:34 +0000 (01:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293851 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp
test/CodeGen/NVPTX/lower-aggr-copies.ll

index b925b632ee4a7647c7ed294f15dd51568dd94bfb..cbb60a004e10db4f7732ae6531d480f976b201b4 100644 (file)
@@ -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);
     }
index ef570982b8081f7474382b292fd49f6f0942554b..c487c9bab4b6c26fa7b87ad1a25c411221d63e7c 100644 (file)
@@ -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)