[PowerPC] Fix assert exposed by PR 95931 in LowerBITCAST (#108062)

Hit Assertion failed: Num < NumOperands && "Invalid child # of SDNode!"
Fix by checking opcode and value type before calling getOperand.

(cherry picked from commit 22067a8eb43a7194e65913b47a9c724fde3ed68f)
This commit is contained in:
Zaara Syeda 2024-09-10 14:14:01 -04:00 committed by Tobias Hieta
parent 149a150b50
commit bdae3c487c
2 changed files with 27 additions and 4 deletions

View File

@ -9338,12 +9338,13 @@ SDValue PPCTargetLowering::LowerBITCAST(SDValue Op, SelectionDAG &DAG) const {
SDLoc dl(Op);
SDValue Op0 = Op->getOperand(0);
if (!Subtarget.isPPC64() || (Op0.getOpcode() != ISD::BUILD_PAIR) ||
(Op.getValueType() != MVT::f128))
return SDValue();
SDValue Lo = Op0.getOperand(0);
SDValue Hi = Op0.getOperand(1);
if ((Op.getValueType() != MVT::f128) ||
(Op0.getOpcode() != ISD::BUILD_PAIR) || (Lo.getValueType() != MVT::i64) ||
(Hi.getValueType() != MVT::i64) || !Subtarget.isPPC64())
if ((Lo.getValueType() != MVT::i64) || (Hi.getValueType() != MVT::i64))
return SDValue();
if (!Subtarget.isLittleEndian())

View File

@ -86,3 +86,25 @@ entry:
ret i64 %1
}
define <4 x i32> @truncBitcast(i512 %a) {
; CHECK-LABEL: truncBitcast:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtvsrdd v2, r4, r3
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: truncBitcast:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: mtvsrdd v2, r9, r10
; CHECK-BE-NEXT: blr
;
; CHECK-P8-LABEL: truncBitcast:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r3
; CHECK-P8-NEXT: mtfprd f1, r4
; CHECK-P8-NEXT: xxmrghd v2, vs1, vs0
; CHECK-P8-NEXT: blr
entry:
%0 = trunc i512 %a to i128
%1 = bitcast i128 %0 to <4 x i32>
ret <4 x i32> %1
}