mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 22:26:14 +00:00
Fix an instcombine abort on a scalar-to-vector bitcast. This fixes PR4487.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74646 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
74a81813c2
commit
6cc18fedf8
@ -1085,8 +1085,22 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
|
||||
break;
|
||||
}
|
||||
case Instruction::BitCast:
|
||||
if (!I->getOperand(0)->getType()->isInteger())
|
||||
if (!I->getOperand(0)->getType()->isIntOrIntVector())
|
||||
return false; // vector->int or fp->int?
|
||||
|
||||
if (const VectorType *DstVTy = dyn_cast<VectorType>(I->getType())) {
|
||||
if (const VectorType *SrcVTy =
|
||||
dyn_cast<VectorType>(I->getOperand(0)->getType())) {
|
||||
if (DstVTy->getNumElements() != SrcVTy->getNumElements())
|
||||
// Don't touch a bitcast between vectors of different element counts.
|
||||
return false;
|
||||
} else
|
||||
// Don't touch a scalar-to-vector bitcast.
|
||||
return false;
|
||||
} else if (isa<VectorType>(I->getOperand(0)->getType()))
|
||||
// Don't touch a vector-to-scalar bitcast.
|
||||
return false;
|
||||
|
||||
if (SimplifyDemandedBits(I->getOperandUse(0), DemandedMask,
|
||||
RHSKnownZero, RHSKnownOne, Depth+1))
|
||||
return I;
|
||||
|
14
test/Transforms/InstCombine/bitcast-scalar-to-vector.ll
Normal file
14
test/Transforms/InstCombine/bitcast-scalar-to-vector.ll
Normal file
@ -0,0 +1,14 @@
|
||||
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i32 0}
|
||||
; PR4487
|
||||
|
||||
; Bitcasts between vectors and scalars are valid, despite being ill-advised.
|
||||
|
||||
define i32 @test(i64 %a) {
|
||||
bb20:
|
||||
%t1 = bitcast i64 %a to <2 x i32>
|
||||
%t2 = bitcast i64 %a to <2 x i32>
|
||||
%t3 = xor <2 x i32> %t1, %t2
|
||||
%t4 = extractelement <2 x i32> %t3, i32 0
|
||||
ret i32 %t4
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user