Cranelift: aarch64: fix undefined dest reg in f32x4.splat case. (#5987)
One of the cases for a splat operation, as updated in #5370, wrote to a temp reg but then only conditionally transformed the temp into the final destination register. In another codepath, `rd` was left undefined. This causes a panic later when regalloc2 verifies SSA properties of its input (here, value not def'd before use). Fixes #5985.
This commit is contained in:
@@ -416,22 +416,30 @@ impl Inst {
|
|||||||
size
|
size
|
||||||
}]
|
}]
|
||||||
} else if let Some(imm) = widen_32_bit_pattern(pattern, lane_size) {
|
} else if let Some(imm) = widen_32_bit_pattern(pattern, lane_size) {
|
||||||
let tmp = alloc_tmp(types::I64X2);
|
let mut insts = smallvec![];
|
||||||
let mut insts = smallvec![Inst::VecDupImm {
|
|
||||||
rd: tmp,
|
|
||||||
imm,
|
|
||||||
invert: false,
|
|
||||||
size: VectorSize::Size64x2,
|
|
||||||
}];
|
|
||||||
|
|
||||||
// TODO: Implement support for 64-bit scalar MOVI; we zero-extend the
|
// TODO: Implement support for 64-bit scalar MOVI; we zero-extend the
|
||||||
// lower 64 bits instead.
|
// lower 64 bits instead.
|
||||||
if !size.is_128bits() {
|
if !size.is_128bits() {
|
||||||
|
let tmp = alloc_tmp(types::I64X2);
|
||||||
|
insts.push(Inst::VecDupImm {
|
||||||
|
rd: tmp,
|
||||||
|
imm,
|
||||||
|
invert: false,
|
||||||
|
size: VectorSize::Size64x2,
|
||||||
|
});
|
||||||
insts.push(Inst::FpuExtend {
|
insts.push(Inst::FpuExtend {
|
||||||
rd,
|
rd,
|
||||||
rn: tmp.to_reg(),
|
rn: tmp.to_reg(),
|
||||||
size: ScalarSize::Size64,
|
size: ScalarSize::Size64,
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
insts.push(Inst::VecDupImm {
|
||||||
|
rd,
|
||||||
|
imm,
|
||||||
|
invert: false,
|
||||||
|
size: VectorSize::Size64x2,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
insts
|
insts
|
||||||
|
|||||||
20
cranelift/filetests/filetests/isa/aarch64/issue-5985.clif
Normal file
20
cranelift/filetests/filetests/isa/aarch64/issue-5985.clif
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
test compile precise-output
|
||||||
|
target aarch64
|
||||||
|
|
||||||
|
function %a() -> f32x4 system_v {
|
||||||
|
block0:
|
||||||
|
v16 = f32const 0x1.fffe00p-126
|
||||||
|
v25 = splat.f32x4 v16
|
||||||
|
return v25
|
||||||
|
}
|
||||||
|
|
||||||
|
; VCode:
|
||||||
|
; block0:
|
||||||
|
; movi v0.2d, #72056494543077120
|
||||||
|
; ret
|
||||||
|
;
|
||||||
|
; Disassembled:
|
||||||
|
; block0: ; offset 0x0
|
||||||
|
; movi v0.2d, #0xffff0000ffff00
|
||||||
|
; ret
|
||||||
|
|
||||||
Reference in New Issue
Block a user