[llvm-commits] [llvm] r84942 - in /llvm/trunk: lib/Analysis/ConstantFolding.cpp test/Transforms/ConstProp/loads.ll

Chris Lattner sabre at nondot.org
Thu Oct 22 23:57:37 PDT 2009


Author: lattner
Date: Fri Oct 23 01:57:37 2009
New Revision: 84942

URL: http://llvm.org/viewvc/llvm-project?rev=84942&view=rev
Log:
teach libanalysis to simplify vector loads with bitcast sources.  This
implements something out of Target/README.txt producing:

_foo:                                                       ## @foo
	movl	4(%esp), %eax
	movapd	LCPI1_0, %xmm0
	movapd	%xmm0, (%eax)
	ret	$4

instead of:

_foo:                                                       ## @foo
	movl	4(%esp), %eax
	movapd	_b, %xmm0
	mulpd	LCPI1_0, %xmm0
	addpd	_a, %xmm0
	movapd	%xmm0, (%eax)
	ret	$4


Modified:
    llvm/trunk/lib/Analysis/ConstantFolding.cpp
    llvm/trunk/test/Transforms/ConstProp/loads.ll

Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=84942&r1=84941&r2=84942&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
+++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Fri Oct 23 01:57:37 2009
@@ -210,24 +210,30 @@
 
 static Constant *FoldReinterpretLoadFromConstPtr(Constant *C,
                                                  const TargetData &TD) {
-  const Type *InitializerTy = cast<PointerType>(C->getType())->getElementType();
-  const IntegerType *IntType = dyn_cast<IntegerType>(InitializerTy);
+  const Type *LoadTy = cast<PointerType>(C->getType())->getElementType();
+  const IntegerType *IntType = dyn_cast<IntegerType>(LoadTy);
   
   // If this isn't an integer load we can't fold it directly.
   if (!IntType) {
     // If this is a float/double load, we can try folding it as an int32/64 load
-    // and then bitcast the result.  This can be useful for union cases.
+    // and then bitcast the result.  This can be useful for union cases.  Note
+    // that address spaces don't matter here since we're not going to result in
+    // an actual new load.
     const Type *MapTy;
-    if (InitializerTy->isFloatTy())
+    if (LoadTy->isFloatTy())
       MapTy = Type::getInt32PtrTy(C->getContext());
-    else if (InitializerTy->isDoubleTy())
+    else if (LoadTy->isDoubleTy())
       MapTy = Type::getInt64PtrTy(C->getContext());
-    else
+    else if (isa<VectorType>(LoadTy)) {
+      MapTy = IntegerType::get(C->getContext(),
+                               TD.getTypeAllocSizeInBits(LoadTy));
+      MapTy = PointerType::getUnqual(MapTy);
+    } else
       return 0;
 
     C = ConstantExpr::getBitCast(C, MapTy);
     if (Constant *Res = FoldReinterpretLoadFromConstPtr(C, TD))
-      return ConstantExpr::getBitCast(Res, InitializerTy);
+      return ConstantExpr::getBitCast(Res, LoadTy);
     return 0;
   }
   

Modified: llvm/trunk/test/Transforms/ConstProp/loads.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ConstProp/loads.ll?rev=84942&r1=84941&r2=84942&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/ConstProp/loads.ll (original)
+++ llvm/trunk/test/Transforms/ConstProp/loads.ll Fri Oct 23 01:57:37 2009
@@ -77,3 +77,13 @@
 ; @test9
 ; CHECK: ret i128 112312312
 }
+
+; vector load.
+define <2 x i64> @test10() {
+  %r = load <2 x i64>* bitcast({i64, i64}* @test3 to <2 x i64>*)
+  ret <2 x i64> %r
+
+; @test10
+; CHECK: ret <2 x i64> <i64 112312312, i64 0>
+}
+





More information about the llvm-commits mailing list