Fix vbroadcast matching logic to early unmatch if the node doesn't have

only one use. Fix PR10825.

llvm-svn: 138951
This commit is contained in:
Bruno Cardoso Lopes 2011-09-01 18:15:06 +00:00
parent f39c67685b
commit f61d1c072e
2 changed files with 15 additions and 1 deletions

View File

@ -6409,12 +6409,16 @@ static bool isVectorBroadcast(SDValue &Op) {
if (Is256)
V = V.getOperand(1);
if (V.hasOneUse() && V.getOpcode() != ISD::SCALAR_TO_VECTOR)
if (!V.hasOneUse())
return false;
// Check the source scalar_to_vector type. 256-bit broadcasts are
// supported for 32/64-bit sizes, while 128-bit ones are only supported
// for 32-bit scalars.
if (V.getOpcode() != ISD::SCALAR_TO_VECTOR)
return false;
unsigned ScalarSize = V.getOperand(0).getValueType().getSizeInBits();
if (ScalarSize != 32 && ScalarSize != 64)
return false;

View File

@ -75,6 +75,7 @@ entry:
; CHECK: _G
; CHECK-NOT: vbroadcastsd (%
; CHECK: ret
define <2 x i64> @G(i64* %ptr) nounwind uwtable readnone ssp {
entry:
%q = load i64* %ptr, align 8
@ -82,3 +83,12 @@ entry:
%vecinit2.i = insertelement <2 x i64> %vecinit.i, i64 %q, i32 1
ret <2 x i64> %vecinit2.i
}
; CHECK: _H
; CHECK-NOT: vbroadcastss
; CHECK: ret
define <4 x i32> @H(<4 x i32> %a) {
%x = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
ret <4 x i32> %x
}