Fix PR11948: the result type of an icmp may be a vector of boolean -
authorDuncan Sands <baldrick@free.fr>
Fri, 10 Feb 2012 14:31:24 +0000 (14:31 +0000)
committerDuncan Sands <baldrick@free.fr>
Fri, 10 Feb 2012 14:31:24 +0000 (14:31 +0000)
don't assume it is a boolean.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150247 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/InstructionSimplify.cpp
test/Transforms/InstSimplify/compare.ll

index bce7e793188148944b40a44a0bcdc21359508104..7656220ba1fb32748e082d4e267585672648d71e 100644 (file)
@@ -476,6 +476,11 @@ static Value *ThreadCmpOverSelect(CmpInst::Predicate Pred, Value *LHS,
   // the original comparison.
   if (TCmp == FCmp)
     return TCmp;
+
+  // The remaining cases only make sense if the select condition has the same
+  // type as the result of the comparison, so bail out if this is not so.
+  if (Cond->getType()->isVectorTy() != RHS->getType()->isVectorTy())
+    return 0;
   // If the false value simplified to false, then the result of the compare
   // is equal to "Cond && TCmp".  This also catches the case when the false
   // value simplified to false and the true value to true, returning "Cond".
index 1ca23554aefabd4fd00c762623ab5b70d6b82a61..0c4153fa3082fdd486eae5802d932969c7c6f9be 100644 (file)
@@ -415,3 +415,10 @@ define <2 x i1> @vectorselect1(<2 x i1> %cond) {
   ret <2 x i1> %c
 ; CHECK: ret <2 x i1> %cond
 }
+
+define <2 x i1> @vectorselectcrash(i32 %arg1) { ; PR11948
+  %tobool40 = icmp ne i32 %arg1, 0
+  %cond43 = select i1 %tobool40, <2 x i16> <i16 -5, i16 66>, <2 x i16> <i16 46, i16 1>
+  %cmp45 = icmp ugt <2 x i16> %cond43, <i16 73, i16 21>
+  ret <2 x i1> %cmp45
+}