fix a crash on a pointless but valid zero-length memset, rdar://6808691
authorChris Lattner <sabre@nondot.org>
Tue, 21 Apr 2009 16:52:12 +0000 (16:52 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 21 Apr 2009 16:52:12 +0000 (16:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69680 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/ScalarReplAggregates.cpp
test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll [new file with mode: 0644]

index 9cbe073e292c68e7ac8b6bed2b1dbb4014f609ca..1bc8a1e3ea82c0a7c610f6cd6b700bef893a1be5 100644 (file)
@@ -1431,20 +1431,22 @@ void SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, uint64_t Offset) {
     if (MemSetInst *MSI = dyn_cast<MemSetInst>(User)) {
       assert(MSI->getRawDest() == Ptr && "Consistency error!");
       unsigned NumBytes = cast<ConstantInt>(MSI->getLength())->getZExtValue();
-      unsigned Val = cast<ConstantInt>(MSI->getValue())->getZExtValue();
-      
-      // Compute the value replicated the right number of times.
-      APInt APVal(NumBytes*8, Val);
+      if (NumBytes != 0) {
+        unsigned Val = cast<ConstantInt>(MSI->getValue())->getZExtValue();
+        
+        // Compute the value replicated the right number of times.
+        APInt APVal(NumBytes*8, Val);
 
-      // Splat the value if non-zero.
-      if (Val)
-        for (unsigned i = 1; i != NumBytes; ++i)
-          APVal |= APVal << 8;
-      
-      Value *Old = Builder.CreateLoad(NewAI, (NewAI->getName()+".in").c_str());
-      Value *New = ConvertScalar_InsertValue(ConstantInt::get(APVal), Old,
-                                             Offset, Builder);
-      Builder.CreateStore(New, NewAI);
+        // Splat the value if non-zero.
+        if (Val)
+          for (unsigned i = 1; i != NumBytes; ++i)
+            APVal |= APVal << 8;
+        
+        Value *Old = Builder.CreateLoad(NewAI, (NewAI->getName()+".in").c_str());
+        Value *New = ConvertScalar_InsertValue(ConstantInt::get(APVal), Old,
+                                               Offset, Builder);
+        Builder.CreateStore(New, NewAI);
+      }
       MSI->eraseFromParent();
       continue;
     }
diff --git a/test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll b/test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll
new file mode 100644 (file)
index 0000000..2342f05
--- /dev/null
@@ -0,0 +1,16 @@
+; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis
+; rdar://6808691
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
+target triple = "x86_64-apple-darwin9.0"
+       type <{ i32, i16, i8, i8, i64, i64, i16, [0 x i16] }>           
+
+define i32 @foo() {
+entry:
+       %.compoundliteral = alloca %0           
+       %tmp228 = getelementptr %0* %.compoundliteral, i32 0, i32 7
+       %tmp229 = bitcast [0 x i16]* %tmp228 to i8*             
+       call void @llvm.memset.i64(i8* %tmp229, i8 0, i64 0, i32 2)
+       unreachable
+}
+
+declare void @llvm.memset.i64(i8* nocapture, i8, i64, i32) nounwind