cranelift: Remove copy instruction (#5125)
This commit is contained in:
@@ -1470,27 +1470,6 @@ pub(crate) fn define(
|
|||||||
.operands_out(vec![a]),
|
.operands_out(vec![a]),
|
||||||
);
|
);
|
||||||
|
|
||||||
let x = &Operand::new("x", Any);
|
|
||||||
|
|
||||||
ig.push(
|
|
||||||
Inst::new(
|
|
||||||
"copy",
|
|
||||||
r#"
|
|
||||||
Register-register copy.
|
|
||||||
|
|
||||||
This instruction copies its input, preserving the value type.
|
|
||||||
|
|
||||||
A pure SSA-form program does not need to copy values, but this
|
|
||||||
instruction is useful for representing intermediate stages during
|
|
||||||
instruction transformations, and the register allocator needs a way of
|
|
||||||
representing register copies.
|
|
||||||
"#,
|
|
||||||
&formats.unary,
|
|
||||||
)
|
|
||||||
.operands_in(vec![x])
|
|
||||||
.operands_out(vec![a]),
|
|
||||||
);
|
|
||||||
|
|
||||||
let x = &Operand::new("x", TxN).with_doc("Vector to split");
|
let x = &Operand::new("x", TxN).with_doc("Vector to split");
|
||||||
let lo = &Operand::new("lo", &TxN.half_vector()).with_doc("Low-numbered lanes of `x`");
|
let lo = &Operand::new("lo", &TxN.half_vector()).with_doc("Low-numbered lanes of `x`");
|
||||||
let hi = &Operand::new("hi", &TxN.half_vector()).with_doc("High-numbered lanes of `x`");
|
let hi = &Operand::new("hi", &TxN.half_vector()).with_doc("High-numbered lanes of `x`");
|
||||||
|
|||||||
@@ -1467,10 +1467,5 @@ mod tests {
|
|||||||
|
|
||||||
assert_eq!(pos.func.dfg.resolve_aliases(c2), c2);
|
assert_eq!(pos.func.dfg.resolve_aliases(c2), c2);
|
||||||
assert_eq!(pos.func.dfg.resolve_aliases(c), c2);
|
assert_eq!(pos.func.dfg.resolve_aliases(c), c2);
|
||||||
|
|
||||||
// Make a copy of the alias.
|
|
||||||
let c3 = pos.ins().copy(c);
|
|
||||||
// This does not see through copies.
|
|
||||||
assert_eq!(pos.func.dfg.resolve_aliases(c3), c3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2265,11 +2265,6 @@
|
|||||||
(u8_from_uimm8 lane)))
|
(u8_from_uimm8 lane)))
|
||||||
(mov_vec_elem vec val lane 0 (vector_size vty)))
|
(mov_vec_elem vec val lane 0 (vector_size vty)))
|
||||||
|
|
||||||
;;; Rules for `copy` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(rule (lower (copy x))
|
|
||||||
x)
|
|
||||||
|
|
||||||
;;; Rules for `stack_addr` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Rules for `stack_addr` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(rule (lower (stack_addr stack_slot offset))
|
(rule (lower (stack_addr stack_slot offset))
|
||||||
|
|||||||
@@ -157,8 +157,6 @@ pub(crate) fn lower_insn_to_regs(
|
|||||||
|
|
||||||
Opcode::IsNull | Opcode::IsInvalid => implemented_in_isle(ctx),
|
Opcode::IsNull | Opcode::IsInvalid => implemented_in_isle(ctx),
|
||||||
|
|
||||||
Opcode::Copy => implemented_in_isle(ctx),
|
|
||||||
|
|
||||||
Opcode::Ireduce => implemented_in_isle(ctx),
|
Opcode::Ireduce => implemented_in_isle(ctx),
|
||||||
|
|
||||||
Opcode::Bmask => implemented_in_isle(ctx),
|
Opcode::Bmask => implemented_in_isle(ctx),
|
||||||
|
|||||||
@@ -535,10 +535,6 @@
|
|||||||
(_ Unit (emit (MInst.AtomicCas (gen_atomic_offset p ty) t0 dst (ext_int_if_need $false e ty) (gen_atomic_p p ty) x ty))))
|
(_ Unit (emit (MInst.AtomicCas (gen_atomic_offset p ty) t0 dst (ext_int_if_need $false e ty) (gen_atomic_p p ty) x ty))))
|
||||||
(writable_reg_to_reg dst)))
|
(writable_reg_to_reg dst)))
|
||||||
|
|
||||||
;;;;; Rules for `copy`;;;;;;;;;;;;;;;;;
|
|
||||||
(rule (lower (has_type ty (copy x)))
|
|
||||||
(gen_move2 x ty ty))
|
|
||||||
|
|
||||||
;;;;; Rules for `ireduce`;;;;;;;;;;;;;;;;;
|
;;;;; Rules for `ireduce`;;;;;;;;;;;;;;;;;
|
||||||
(rule
|
(rule
|
||||||
(lower (has_type ty (ireduce x)))
|
(lower (has_type ty (ireduce x)))
|
||||||
|
|||||||
@@ -46,12 +46,6 @@
|
|||||||
(invalid_reg))
|
(invalid_reg))
|
||||||
|
|
||||||
|
|
||||||
;;;; Rules for `copy` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(rule (lower (copy x))
|
|
||||||
x)
|
|
||||||
|
|
||||||
|
|
||||||
;;;; Rules for `iconcat` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;; Rules for `iconcat` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(rule (lower (has_type (vr128_ty ty) (iconcat x y)))
|
(rule (lower (has_type (vr128_ty ty) (iconcat x y)))
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ impl LowerBackend for S390xBackend {
|
|||||||
|
|
||||||
match op {
|
match op {
|
||||||
Opcode::Nop
|
Opcode::Nop
|
||||||
| Opcode::Copy
|
|
||||||
| Opcode::Iconst
|
| Opcode::Iconst
|
||||||
| Opcode::F32const
|
| Opcode::F32const
|
||||||
| Opcode::F64const
|
| Opcode::F64const
|
||||||
|
|||||||
@@ -559,10 +559,6 @@ fn lower_insn_to_regs(
|
|||||||
panic!("table_addr should have been removed by legalization!");
|
panic!("table_addr should have been removed by legalization!");
|
||||||
}
|
}
|
||||||
|
|
||||||
Opcode::Copy => {
|
|
||||||
panic!("Unused opcode should not be encountered.");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::Trapz | Opcode::Trapnz | Opcode::ResumableTrapnz => {
|
Opcode::Trapz | Opcode::Trapnz | Opcode::ResumableTrapnz => {
|
||||||
panic!("trapz / trapnz / resumable_trapnz should have been removed by legalization!");
|
panic!("trapz / trapnz / resumable_trapnz should have been removed by legalization!");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
test interpret
|
|
||||||
test run
|
|
||||||
target aarch64
|
|
||||||
target s390x
|
|
||||||
; x86_64 regards this as an unused opcode.
|
|
||||||
|
|
||||||
function %copy_i8(i8) -> i8 {
|
|
||||||
block0(v0: i8):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i8(0) == 0
|
|
||||||
; run: %copy_i8(255) == 255
|
|
||||||
; run: %copy_i8(-1) == -1
|
|
||||||
; run: %copy_i8(127) == 127
|
|
||||||
|
|
||||||
function %copy_i16(i16) -> i16 {
|
|
||||||
block0(v0: i16):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i16(0) == 0
|
|
||||||
; run: %copy_i16(65535) == 65535
|
|
||||||
; run: %copy_i16(-1) == -1
|
|
||||||
; run: %copy_i16(127) == 127
|
|
||||||
|
|
||||||
function %copy_i32(i32) -> i32 {
|
|
||||||
block0(v0: i32):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i32(0) == 0
|
|
||||||
; run: %copy_i32(4294967295) == 4294967295
|
|
||||||
; run: %copy_i32(-1) == -1
|
|
||||||
; run: %copy_i32(127) == 127
|
|
||||||
|
|
||||||
function %copy_i64(i64) -> i64 {
|
|
||||||
block0(v0: i64):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i64(0) == 0
|
|
||||||
; run: %copy_i64(18446744073709551615) == 18446744073709551615
|
|
||||||
; run: %copy_i64(-1) == -1
|
|
||||||
; run: %copy_i64(127) == 127
|
|
||||||
|
|
||||||
function %copy_f32(f32) -> f32 {
|
|
||||||
block0(v0: f32):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_f32(0x1.0) == 0x1.0
|
|
||||||
; run: %copy_f32(0x1.0p10) == 0x1.0p10
|
|
||||||
|
|
||||||
; run: %copy_f32(0x0.0) == 0x0.0
|
|
||||||
; run: %copy_f32(-0x0.0) == -0x0.0
|
|
||||||
; run: %copy_f32(+Inf) == +Inf
|
|
||||||
; run: %copy_f32(-Inf) == -Inf
|
|
||||||
; run: %copy_f32(0x1.000002p-23) == 0x1.000002p-23
|
|
||||||
; run: %copy_f32(0x1.fffffep127) == 0x1.fffffep127
|
|
||||||
; run: %copy_f32(0x1.000000p-126) == 0x1.000000p-126
|
|
||||||
; run: %copy_f32(0x0.800002p-126) == 0x0.800002p-126
|
|
||||||
; run: %copy_f32(-0x0.800000p-126) == -0x0.800000p-126
|
|
||||||
|
|
||||||
function %copy_f64(f64) -> f64 {
|
|
||||||
block0(v0: f64):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_f64(0x2.0) == 0x2.0
|
|
||||||
; run: %copy_f64(0x1.0p11) == 0x1.0p11
|
|
||||||
|
|
||||||
; run: %copy_f64(0x0.0) == 0x0.0
|
|
||||||
; run: %copy_f64(-0x0.0) == -0x0.0
|
|
||||||
; run: %copy_f64(+Inf) == +Inf
|
|
||||||
; run: %copy_f64(-Inf) == -Inf
|
|
||||||
; run: %copy_f64(0x1.0000000000002p-52) == 0x1.0000000000002p-52
|
|
||||||
; run: %copy_f64(0x1.fffffffffffffp1023) == 0x1.fffffffffffffp1023
|
|
||||||
; run: %copy_f64(0x1.0000000000000p-1022) == 0x1.0000000000000p-1022
|
|
||||||
; run: %copy_f64(0x0.8000000000002p-1022) == 0x0.8000000000002p-1022
|
|
||||||
; run: %copy_f64(-0x0.8000000000000p-1022) == -0x0.8000000000000p-1022
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
test interpret
|
|
||||||
test run
|
|
||||||
target aarch64
|
|
||||||
; x86_64 regards this as an unused opcode.
|
|
||||||
; s390x does not support 64-bit vectors.
|
|
||||||
|
|
||||||
function %copy_i8x8(i8x8) -> i8x8 {
|
|
||||||
block0(v0: i8x8):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i8x8([0 0 255 255 -1 -1 127 128]) == [0 0 255 255 -1 -1 127 128]
|
|
||||||
|
|
||||||
function %copy_i16x4(i16x4) -> i16x4 {
|
|
||||||
block0(v0: i16x4):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i16x4([0 65535 -1 127]) == [0 65535 -1 127]
|
|
||||||
|
|
||||||
function %copy_i32x2(i32x2) -> i32x2 {
|
|
||||||
block0(v0: i32x2):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i32x2([0 4294967295]) == [0 4294967295]
|
|
||||||
; run: %copy_i32x2([-1 127]) == [-1 127]
|
|
||||||
|
|
||||||
function %copy_f32x2(f32x2) -> f32x2 {
|
|
||||||
block0(v0: f32x2):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_f32x2([0x1.0 0x1.0p10]) == [0x1.0 0x1.0p10]
|
|
||||||
|
|
||||||
; run: %copy_f32x2([0x0.0 -0x0.0]) == [0x0.0 -0x0.0]
|
|
||||||
; run: %copy_f32x2([+Inf -Inf]) == [+Inf -Inf]
|
|
||||||
; run: %copy_f32x2([0x1.000002p-23 0x1.fffffep127]) == [0x1.000002p-23 0x1.fffffep127]
|
|
||||||
; run: %copy_f32x2([0x1.000000p-126 0x0.800002p-126]) == [0x1.000000p-126 0x0.800002p-126]
|
|
||||||
; run: %copy_f32x2([-0x0.800000p-126 -0x0.800000p-126]) == [-0x0.800000p-126 -0x0.800000p-126]
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
test interpret
|
|
||||||
test run
|
|
||||||
target aarch64
|
|
||||||
target s390x
|
|
||||||
; x86_64 regards this as an unused opcode.
|
|
||||||
|
|
||||||
function %copy_i8x16(i8x16) -> i8x16 {
|
|
||||||
block0(v0: i8x16):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i8x16([0 0 255 255 -1 -1 127 128 0 0 255 255 -1 -1 127 128]) == [0 0 255 255 -1 -1 127 128 0 0 255 255 -1 -1 127 128]
|
|
||||||
|
|
||||||
function %copy_i16x8(i16x8) -> i16x8 {
|
|
||||||
block0(v0: i16x8):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i16x8([0 65535 -1 127 0 65535 -1 128]) == [0 65535 -1 127 0 65535 -1 128]
|
|
||||||
|
|
||||||
function %copy_i32x4(i32x4) -> i32x4 {
|
|
||||||
block0(v0: i32x4):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i32x4([0 4294967295 -1 127]) == [0 4294967295 -1 127]
|
|
||||||
|
|
||||||
function %copy_i64x2(i64x2) -> i64x2 {
|
|
||||||
block0(v0: i64x2):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_i64x2([0 18446744073709551615]) == [0 18446744073709551615]
|
|
||||||
; run: %copy_i64x2([-1 127]) == [-1 127]
|
|
||||||
|
|
||||||
function %copy_f32x4(f32x4) -> f32x4 {
|
|
||||||
block0(v0: f32x4):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_f32x4([0x1.0 0x1.0p10 0x0.0 -0x0.0]) == [0x1.0 0x1.0p10 0x0.0 -0x0.0]
|
|
||||||
|
|
||||||
; run: %copy_f32x4([+Inf -Inf 0x1.000002p-23 0x1.fffffep127]) == [+Inf -Inf 0x1.000002p-23 0x1.fffffep127]
|
|
||||||
; run: %copy_f32x4([0x1.000000p-126 0x0.800002p-126 -0x0.800000p-126 -0x0.800000p-126]) == [0x1.000000p-126 0x0.800002p-126 -0x0.800000p-126 -0x0.800000p-126]
|
|
||||||
|
|
||||||
function %copy_f64x2(f64x2) -> f64x2 {
|
|
||||||
block0(v0: f64x2):
|
|
||||||
v1 = copy v0
|
|
||||||
return v1
|
|
||||||
}
|
|
||||||
; run: %copy_f64x2([0x2.0 0x1.0p11]) == [0x2.0 0x1.0p11]
|
|
||||||
|
|
||||||
; run: %copy_f64x2([0x0.0 -0x0.0]) == [0x0.0 -0x0.0]
|
|
||||||
; run: %copy_f64x2([+Inf -Inf]) == [+Inf -Inf]
|
|
||||||
; run: %copy_f64x2([0x1.0000000000002p-52 0x1.fffffffffffffp1023]) == [0x1.0000000000002p-52 0x1.fffffffffffffp1023]
|
|
||||||
; run: %copy_f64x2([0x1.0000000000000p-1022 0x0.8000000000002p-1022]) == [0x1.0000000000000p-1022 0x0.8000000000002p-1022]
|
|
||||||
; run: %copy_f64x2([-0x0.8000000000000p-1022 -0x0.8000000000000p-1022]) == [-0x0.8000000000000p-1022 -0x0.8000000000000p-1022]
|
|
||||||
@@ -552,7 +552,6 @@ where
|
|||||||
let mask_b = Value::and(Value::not(arg(0)?)?, arg(2)?)?;
|
let mask_b = Value::and(Value::not(arg(0)?)?, arg(2)?)?;
|
||||||
assign(Value::or(mask_a, mask_b)?)
|
assign(Value::or(mask_a, mask_b)?)
|
||||||
}
|
}
|
||||||
Opcode::Copy => assign(arg(0)?),
|
|
||||||
Opcode::Icmp => assign(icmp(
|
Opcode::Icmp => assign(icmp(
|
||||||
ctrl_ty,
|
ctrl_ty,
|
||||||
inst.cond_code().unwrap(),
|
inst.cond_code().unwrap(),
|
||||||
|
|||||||
Reference in New Issue
Block a user