[llvm-commits] [llvm] r67010 - in /llvm/trunk: lib/VMCore/ConstantFold.cpp lib/VMCore/Constants.cpp test/Assembler/vector-shift.ll

Dan Gohman gohman at apple.com
Sat Mar 14 10:09:17 PDT 2009


Author: djg
Date: Sat Mar 14 12:09:17 2009
New Revision: 67010

URL: http://llvm.org/viewvc/llvm-project?rev=67010&view=rev
Log:
Apply a patch by Micah Villmow to fix AsmParser to accept vector
shift constant expressions, and add support for folding vector
shift constant expressions. This fixes PR3802.

Modified:
    llvm/trunk/lib/VMCore/ConstantFold.cpp
    llvm/trunk/lib/VMCore/Constants.cpp
    llvm/trunk/test/Assembler/vector-shift.ll

Modified: llvm/trunk/lib/VMCore/ConstantFold.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/ConstantFold.cpp?rev=67010&r1=67009&r2=67010&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/ConstantFold.cpp (original)
+++ llvm/trunk/lib/VMCore/ConstantFold.cpp Sat Mar 14 12:09:17 2009
@@ -832,6 +832,12 @@
         return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getOr);
       case Instruction::Xor: 
         return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getXor);
+      case Instruction::LShr:
+        return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getLShr);
+      case Instruction::AShr:
+        return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getAShr);
+      case Instruction::Shl:
+        return EvalVectorOp(CP1, CP2, VTy, ConstantExpr::getShl);
       }
     }
   }

Modified: llvm/trunk/lib/VMCore/Constants.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Constants.cpp?rev=67010&r1=67009&r2=67010&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/Constants.cpp (original)
+++ llvm/trunk/lib/VMCore/Constants.cpp Sat Mar 14 12:09:17 2009
@@ -2095,7 +2095,7 @@
   case Instruction::LShr:
   case Instruction::AShr:
     assert(C1->getType() == C2->getType() && "Op types should be identical!");
-    assert(C1->getType()->isInteger() &&
+    assert(C1->getType()->isIntOrIntVector() &&
            "Tried to create a shift operation on a non-integer type!");
     break;
   default:

Modified: llvm/trunk/test/Assembler/vector-shift.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/vector-shift.ll?rev=67010&r1=67009&r2=67010&view=diff

==============================================================================
--- llvm/trunk/test/Assembler/vector-shift.ll (original)
+++ llvm/trunk/test/Assembler/vector-shift.ll Sat Mar 14 12:09:17 2009
@@ -1,6 +1,6 @@
-; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | grep shl
-; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | grep ashr
-; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | grep lshr
+; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | grep shl | count 1
+; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | grep ashr | count 1
+; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | grep lshr | count 1
 
 define <4 x i32> @foo(<4 x i32> %a, <4 x i32> %b) nounwind  {
 entry:
@@ -19,3 +19,14 @@
 	%cmp = ashr <4 x i32> %a, %b		; <4 x i32> [#uses=1]
 	ret <4 x i32> %cmp
 }
+
+; Constant expressions: these should be folded.
+define <2 x i64> @foo_ce() nounwind {
+  ret <2 x i64> shl (<2 x i64> <i64 5, i64 6>, <2 x i64> <i64 3, i64 5>)
+}
+define <2 x i64> @bar_ce() nounwind {
+  ret <2 x i64> lshr (<2 x i64> <i64 340, i64 380>, <2 x i64> <i64 3, i64 5>)
+}
+define <2 x i64> @baz_ce() nounwind {
+  ret <2 x i64> ashr (<2 x i64> <i64 573, i64 411>, <2 x i64> <i64 3, i64 5>)
+}





More information about the llvm-commits mailing list