mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 08:26:29 +00:00
When the legalizer is splitting vector shifts, the result may not have the right shift amount type.
Fix that by adding a cast to the shift expander. This came up with vector shifts on sse-less X86 CPUs. <2 x i64> = shl <2 x i64> <2 x i64> -> i64,i64 = shl i64 i64; shl i64 i64 -> i32,i32,i32,i32 = shl_parts i32 i32 i64; shl_parts i32 i32 i64 Now we cast the last two i64s to the right type. Fixes the crash in PR14668. llvm-svn: 173615
This commit is contained in:
parent
8e66ee6471
commit
a19aee8b53
@ -2095,9 +2095,16 @@ void DAGTypeLegalizer::ExpandIntRes_Shift(SDNode *N,
|
||||
// Expand the subcomponents.
|
||||
SDValue LHSL, LHSH;
|
||||
GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
|
||||
|
||||
SDValue Ops[] = { LHSL, LHSH, N->getOperand(1) };
|
||||
EVT VT = LHSL.getValueType();
|
||||
|
||||
// If the shift amount operand is coming from a vector legalization it may
|
||||
// not have the right return type. Fix that first by casting the operand.
|
||||
SDValue ShiftOp = N->getOperand(1);
|
||||
MVT ShiftTy = TLI.getShiftAmountTy(VT);
|
||||
if (ShiftOp.getValueType() != ShiftTy)
|
||||
ShiftOp = DAG.getZExtOrTrunc(ShiftOp, dl, ShiftTy);
|
||||
|
||||
SDValue Ops[] = { LHSL, LHSH, ShiftOp };
|
||||
Lo = DAG.getNode(PartsOpc, dl, DAG.getVTList(VT, VT), Ops, 3);
|
||||
Hi = Lo.getValue(1);
|
||||
return;
|
||||
|
@ -54,3 +54,14 @@ define i64 @test4(i64 %xx, i32 %test) nounwind {
|
||||
; CHECK: orl %esi, %eax
|
||||
; CHECK: sarl %cl, %edx
|
||||
}
|
||||
|
||||
; PR14668
|
||||
define <2 x i64> @test5(<2 x i64> %A, <2 x i64> %B) {
|
||||
%shl = shl <2 x i64> %A, %B
|
||||
ret <2 x i64> %shl
|
||||
; CHECK: test5
|
||||
; CHECK: shl
|
||||
; CHECK: shldl
|
||||
; CHECK: shl
|
||||
; CHECK: shldl
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user