[llvm-commits] [llvm] r69680 - in /llvm/trunk: lib/Transforms/Scalar/ScalarReplAggregates.cpp test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll

Chris Lattner sabre at nondot.org
Tue Apr 21 09:52:14 PDT 2009


Author: lattner
Date: Tue Apr 21 11:52:12 2009
New Revision: 69680

URL: http://llvm.org/viewvc/llvm-project?rev=69680&view=rev
Log:
fix a crash on a pointless but valid zero-length memset, rdar://6808691

Added:
    llvm/trunk/test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp?rev=69680&r1=69679&r2=69680&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp Tue Apr 21 11:52:12 2009
@@ -1431,20 +1431,22 @@
     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;
     }

Added: llvm/trunk/test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll?rev=69680&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll (added)
+++ llvm/trunk/test/Transforms/ScalarRepl/2009-04-21-ZeroLengthMemSet.ll Tue Apr 21 11:52:12 2009
@@ -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





More information about the llvm-commits mailing list