fix PR7311 by avoiding breaking casts when a bitcast from scalar->vector
authorChris Lattner <sabre@nondot.org>
Mon, 12 Jul 2010 01:19:22 +0000 (01:19 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 12 Jul 2010 01:19:22 +0000 (01:19 +0000)
is involved.

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

lib/VMCore/Instructions.cpp
test/Transforms/InstCombine/cast.ll

index a32cb3c871c8a9f1667fb67075097d73fa1cccbf..381b85faa4c5cddc0025d3650c412017fdd81663 100644 (file)
@@ -2006,6 +2006,14 @@ unsigned CastInst::isEliminableCastPair(
     { 99,99,99,99,99,99,99,99,99,13,99,12 }, // IntToPtr    |
     {  5, 5, 5, 6, 6, 5, 5, 6, 6,11, 5, 1 }, // BitCast    -+
   };
+  
+  // If either of the casts are a bitcast from scalar to vector, disallow the
+  // merging.
+  if ((firstOp == Instruction::BitCast &&
+       isa<VectorType>(SrcTy) != isa<VectorType>(MidTy)) ||
+      (secondOp == Instruction::BitCast &&
+       isa<VectorType>(MidTy) != isa<VectorType>(DstTy)))
+    return 0; // Disallowed
 
   int ElimCase = CastResults[firstOp-Instruction::CastOpsBegin]
                             [secondOp-Instruction::CastOpsBegin];
index 77fccdfa52de62a41dd43363e142f1d5f5490fc0..102d2f048f1c244d1faff2cf4f2e28de6860f0d8 100644 (file)
@@ -638,3 +638,14 @@ define <4 x i32> @test62(<3 x float> %call4) nounwind {
 ; CHECK-NEXT: ret
 }
 
+; PR7311 - Don't create invalid IR on scalar->vector cast.
+define <2 x float> @test63(i64 %tmp8) nounwind {
+entry:
+  %a = bitcast i64 %tmp8 to <2 x i32>           
+  %vcvt.i = uitofp <2 x i32> %a to <2 x float>  
+  ret <2 x float> %vcvt.i
+; CHECK: @test63
+; CHECK: bitcast
+; CHECK: uitofp
+}
+