InstCombine should not fold sext/zext of a vector and a bitcast to a scalar to a...
authorMon P Wang <wangmp@apple.com>
Sat, 23 Jan 2010 04:35:57 +0000 (04:35 +0000)
committerMon P Wang <wangmp@apple.com>
Sat, 23 Jan 2010 04:35:57 +0000 (04:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94280 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Instructions.cpp
test/Transforms/InstCombine/bitcast-sext-vector.ll [new file with mode: 0644]

index 8ff36cb6fbdbddbff23a19bc206cb2677627f53a..e72e48cb1a3c76496f393980473177949aebf692 100644 (file)
@@ -2079,8 +2079,9 @@ unsigned CastInst::isEliminableCastPair(
       return secondOp;
     case 3: 
       // no-op cast in second op implies firstOp as long as the DestTy 
-      // is integer
-      if (DstTy->isInteger())
+      // is integer and we are not converting between a vector and a
+      // non vector type
+      if (SrcTy->getTypeID() != Type::VectorTyID && DstTy->isInteger())
         return firstOp;
       return 0;
     case 4:
diff --git a/test/Transforms/InstCombine/bitcast-sext-vector.ll b/test/Transforms/InstCombine/bitcast-sext-vector.ll
new file mode 100644 (file)
index 0000000..d70bdba
--- /dev/null
@@ -0,0 +1,11 @@
+; RUN: opt < %s -instcombine -S | FileCheck %s
+; CHECK: sext
+; Don't fold zero/sign extensions with a bitcast between a vector and scalar.
+
+define i32 @t(<4 x i8> %src1, <4 x i8> %src2) nounwind readonly {
+entry:
+       %cmp = icmp eq <4 x i8> %src1, %src2; <<4 x i1>> [#uses=1]
+       %sext = sext <4 x i1> %cmp to <4 x i8>
+       %val = bitcast <4 x i8> %sext to i32
+       ret i32 %val
+}