[llvm-commits] [llvm] r63529 - in /llvm/trunk: lib/Transforms/Scalar/ScalarReplAggregates.cpp test/Transforms/ScalarRepl/2009-02-02-ScalarPromoteOutOfRange.ll

Chris Lattner sabre at nondot.org
Mon Feb 2 10:02:59 PST 2009


Author: lattner
Date: Mon Feb  2 12:02:59 2009
New Revision: 63529

URL: http://llvm.org/viewvc/llvm-project?rev=63529&view=rev
Log:
Fix a bug which caused us to miscompile a couple of Ada
tests.  Thanks for the beautiful reduced testcase Duncan!

Added:
    llvm/trunk/test/Transforms/ScalarRepl/2009-02-02-ScalarPromoteOutOfRange.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=63529&r1=63528&r2=63529&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp Mon Feb  2 12:02:59 2009
@@ -1166,12 +1166,17 @@
 static void MergeInType(const Type *In, uint64_t Offset, const Type *&Accum,
                         const TargetData &TD) {
   // If this is our first type, just use it.
-  if (Accum == 0 || In == Type::VoidTy ||
+  if ((Accum == 0 && Offset == 0) || In == Type::VoidTy ||
       // Or if this is a same type, keep it.
       (In == Accum && Offset == 0)) {
     Accum = In;
     return;
   }
+
+  // Merging something like i32 into offset 8 means that a "field" is merged in
+  // before the basic type is.  Make sure to consider the offset below.
+  if (Accum == 0)
+    Accum = Type::Int8Ty;
   
   if (const VectorType *VATy = dyn_cast<VectorType>(Accum)) {
     if (VATy->getElementType() == In &&

Added: llvm/trunk/test/Transforms/ScalarRepl/2009-02-02-ScalarPromoteOutOfRange.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ScalarRepl/2009-02-02-ScalarPromoteOutOfRange.ll?rev=63529&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/ScalarRepl/2009-02-02-ScalarPromoteOutOfRange.ll (added)
+++ llvm/trunk/test/Transforms/ScalarRepl/2009-02-02-ScalarPromoteOutOfRange.ll Mon Feb  2 12:02:59 2009
@@ -0,0 +1,16 @@
+; RUN: llvm-as < %s | opt -scalarrepl -instcombine | llvm-dis | grep {ret i32 %x}
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
+target triple = "i386-pc-linux-gnu"
+
+%pair = type { [1 x i32], i32 }
+
+define i32 @f(i32 %x, i32 %y) {
+       %instance = alloca %pair
+       %first = getelementptr %pair* %instance, i32 0, i32 0
+       %cast = bitcast [1 x i32]* %first to i32*
+       store i32 %x, i32* %cast
+       %second = getelementptr %pair* %instance, i32 0, i32 1
+       store i32 %y, i32* %second
+       %v = load i32* %cast
+       ret i32 %v
+}





More information about the llvm-commits mailing list