Skip to content

Commit 8fb36d5

Browse files
committed
Cranelift: pulley: don't use call{1,2,3,4} opcodes with PreserveAll ABI.
These Pulley instructions are an optimization: they incorporate moves from other registers to x0/x1/x2/x3 as part of the call itself. This works fine for the default calling convention, but the logic that absorbs these moves and removes them from the list given to the rest of the VCode/ABI machinery embeds a tacit assumption: the argument registers are volatile (caller-saved). In particular, this is because the call{1,2,3,4} instructions are *not* marked as clobbering x0/x1/x2/x3 explicitly. To fix this issue, this PR simply omits the magical folding that happens in the emission code. An alternative would be to try to add the clobbers to the special instructions, but actually we don't want these to be just "clobbers": we want the usual regalloc constraints to take effect and the values to be represented as continuing valid/live in the registers after return, and the proper way to do that is to leave the `args` on the call and let the regalloc operand pass add the fixed-reg operands. Discovered while trying to land bytecodealliance#12183.
1 parent f8d2795 commit 8fb36d5

File tree

5 files changed

+106
-49
lines changed

5 files changed

+106
-49
lines changed

cranelift/codegen/src/isa/pulley_shared/lower/isle.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use inst::InstAndKind;
77

88
// Types that the generated ISLE code uses via `use super::*`.
99
use crate::ir::{condcodes::*, immediates::*, types::*, *};
10+
use crate::isa::CallConv;
1011
use crate::isa::pulley_shared::{
1112
inst::{
1213
FReg, OperandSize, PulleyCall, ReturnCallInfo, VReg, WritableFReg, WritableVReg,
@@ -85,26 +86,33 @@ where
8586
self.lower_ctx
8687
.abi_mut()
8788
.accumulate_outgoing_args_size(stack_ret_space + stack_arg_space);
89+
let call_conv = self.lower_ctx.sigs()[sig].call_conv();
8890

8991
// The first four integer arguments to a call can be handled via
9092
// special pulley call instructions. Assert here that
9193
// `uses` is sorted in order and then take out x0-x3 if
9294
// they're present and move them from `uses` to
9395
// `dest.args` to be handled differently during register
9496
// allocation.
97+
//
98+
// We don't perform this optimization for callsites with the
99+
// PreserveAll ABI because argument registers are not
100+
// clobbered on those ISAs.
95101
let mut args = SmallVec::new();
96102
uses.sort_by_key(|arg| arg.preg);
97-
uses.retain(|arg| {
98-
if arg.preg != regs::x0()
99-
&& arg.preg != regs::x1()
100-
&& arg.preg != regs::x2()
101-
&& arg.preg != regs::x3()
102-
{
103-
return true;
104-
}
105-
args.push(XReg::new(arg.vreg).unwrap());
106-
false
107-
});
103+
if call_conv != CallConv::PreserveAll {
104+
uses.retain(|arg| {
105+
if arg.preg != regs::x0()
106+
&& arg.preg != regs::x1()
107+
&& arg.preg != regs::x2()
108+
&& arg.preg != regs::x3()
109+
{
110+
return true;
111+
}
112+
args.push(XReg::new(arg.vreg).unwrap());
113+
false
114+
});
115+
}
108116
let dest = PulleyCall { name, args };
109117
Box::new(
110118
self.lower_ctx

cranelift/filetests/filetests/isa/pulley32/patchable-call.clif

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,21 @@ block0(v0: i64):
1212
; VCode:
1313
; push_frame
1414
; block0:
15-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p0i), XReg(p0i), XReg(p0i), XReg(p0i)] }, uses: [], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
16-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p0i), XReg(p0i), XReg(p0i), XReg(p0i)] }, uses: [], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
15+
; xmov x3, x0
16+
; xmov x1, x3
17+
; xmov x2, x3
18+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
19+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
1720
; pop_frame
1821
; ret
1922
;
2023
; Disassembled:
2124
; push_frame
22-
; call4 x0, x0, x0, x0, 0x5 // target = 0x6
23-
; call4 x0, x0, x0, x0, 0x5 // target = 0xf
25+
; xmov x3, x0
26+
; xmov x1, x3
27+
; xmov x2, x3
28+
; call 0x1 // target = 0xb
29+
; call 0x1 // target = 0x10
2430
; pop_frame
2531
; ret
2632

@@ -36,26 +42,32 @@ block0(v0: i64):
3642
; push_frame
3743
; block0:
3844
; xmov x9, x0
45+
; xmov x1, x9
46+
; xmov x2, x9
47+
; xmov x3, x9
3948
; xmov x4, x9
4049
; xmov x5, x9
4150
; xmov x6, x9
4251
; xmov x7, x9
4352
; xmov x8, x9
44-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p9i), XReg(p9i), XReg(p9i), XReg(p9i)] }, uses: [CallArgPair { vreg: p4i, preg: p4i }, CallArgPair { vreg: p5i, preg: p5i }, CallArgPair { vreg: p6i, preg: p6i }, CallArgPair { vreg: p7i, preg: p7i }, CallArgPair { vreg: p8i, preg: p8i }, CallArgPair { vreg: p9i, preg: p9i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
45-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p9i), XReg(p9i), XReg(p9i), XReg(p9i)] }, uses: [CallArgPair { vreg: p4i, preg: p4i }, CallArgPair { vreg: p5i, preg: p5i }, CallArgPair { vreg: p6i, preg: p6i }, CallArgPair { vreg: p7i, preg: p7i }, CallArgPair { vreg: p8i, preg: p8i }, CallArgPair { vreg: p9i, preg: p9i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
53+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }, CallArgPair { vreg: p4i, preg: p4i }, CallArgPair { vreg: p5i, preg: p5i }, CallArgPair { vreg: p6i, preg: p6i }, CallArgPair { vreg: p7i, preg: p7i }, CallArgPair { vreg: p8i, preg: p8i }, CallArgPair { vreg: p9i, preg: p9i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
54+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }, CallArgPair { vreg: p4i, preg: p4i }, CallArgPair { vreg: p5i, preg: p5i }, CallArgPair { vreg: p6i, preg: p6i }, CallArgPair { vreg: p7i, preg: p7i }, CallArgPair { vreg: p8i, preg: p8i }, CallArgPair { vreg: p9i, preg: p9i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
4655
; pop_frame
4756
; ret
4857
;
4958
; Disassembled:
5059
; push_frame
5160
; xmov x9, x0
61+
; xmov x1, x9
62+
; xmov x2, x9
63+
; xmov x3, x9
5264
; xmov x4, x9
5365
; xmov x5, x9
5466
; xmov x6, x9
5567
; xmov x7, x9
5668
; xmov x8, x9
57-
; call4 x9, x9, x9, x9, 0x5 // target = 0x18
58-
; call4 x9, x9, x9, x9, 0x5 // target = 0x21
69+
; call 0x1 // target = 0x1d
70+
; call 0x1 // target = 0x22
5971
; pop_frame
6072
; ret
6173

@@ -76,12 +88,11 @@ block2(v1: i32):
7688
; VCode:
7789
; push_frame_save 144, {x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0}
7890
; block0:
79-
; xmov x8, x0
80-
; xmov x10, x0
81-
; xmov x11, x0
82-
; xmov x12, x0
8391
; xstore64 Slot(0), x0 // flags = notrap aligned
84-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p8i), XReg(p12i), XReg(p11i), XReg(p10i)] }, uses: [], defs: [CallRetPair { vreg: Writable { reg: p0i }, location: Reg(p0i, types::I32) }, CallRetPair { vreg: Writable { reg: p1i }, location: Reg(p1i, types::I32) }], clobbers: PRegSet { bits: [4294967292, 4294967295, 4294967295, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: Some(TryCallInfo { continuation: MachLabel(1), exception_handlers: [Default(MachLabel(2))] }), patchable: true }; jump MachLabel(1); catch [default: MachLabel(2)]
92+
; x1 = xload64 Slot(0) // flags = notrap aligned
93+
; x2 = xload64 Slot(0) // flags = notrap aligned
94+
; x3 = xload64 Slot(0) // flags = notrap aligned
95+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }], defs: [CallRetPair { vreg: Writable { reg: p0i }, location: Reg(p0i, types::I32) }, CallRetPair { vreg: Writable { reg: p1i }, location: Reg(p1i, types::I32) }], clobbers: PRegSet { bits: [4294967292, 4294967295, 4294967295, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: Some(TryCallInfo { continuation: MachLabel(1), exception_handlers: [Default(MachLabel(2))] }), patchable: true }; jump MachLabel(1); catch [default: MachLabel(2)]
8596
; block1:
8697
; x0 = xload64 Slot(0) // flags = notrap aligned
8798
; pop_frame_restore 144, {x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0}
@@ -93,12 +104,11 @@ block2(v1: i32):
93104
;
94105
; Disassembled:
95106
; push_frame_save 144, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0
96-
; xmov x8, x0
97-
; xmov x10, x0
98-
; xmov x11, x0
99-
; xmov x12, x0
100107
; xstore64le_o32 sp, 0, x0
101-
; call4 x8, x12, x11, x10, 0x5 // target = 0x1d
108+
; xload64le_o32 x1, sp, 0
109+
; xload64le_o32 x2, sp, 0
110+
; xload64le_o32 x3, sp, 0
111+
; call 0x1 // target = 0x22
102112
; xload64le_o32 x0, sp, 0
103113
; pop_frame_restore 144, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0
104114
; ret

cranelift/filetests/filetests/isa/pulley32/preserve-all.clif

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ block0(v0: i64):
380380
; VCode:
381381
; push_frame
382382
; block0:
383-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p0i)] }, uses: [], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: false }
383+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: false }
384384
; pop_frame
385385
; ret
386386
;
@@ -390,3 +390,32 @@ block0(v0: i64):
390390
; pop_frame
391391
; ret
392392

393+
function %call_preserve_all_near(i64) system_v {
394+
fn0 = colocated %f(i64, i64, i64, i64) preserve_all
395+
block0(v0: i64):
396+
call fn0(v0, v0, v0, v0)
397+
call fn0(v0, v0, v0, v0)
398+
return
399+
}
400+
401+
; VCode:
402+
; push_frame
403+
; block0:
404+
; xmov x3, x0
405+
; xmov x1, x3
406+
; xmov x2, x3
407+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: false }
408+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: false }
409+
; pop_frame
410+
; ret
411+
;
412+
; Disassembled:
413+
; push_frame
414+
; xmov x3, x0
415+
; xmov x1, x3
416+
; xmov x2, x3
417+
; call 0x1 // target = 0xb
418+
; call 0x1 // target = 0x10
419+
; pop_frame
420+
; ret
421+

cranelift/filetests/filetests/isa/pulley64/patchable-call.clif

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,21 @@ block0(v0: i64):
1212
; VCode:
1313
; push_frame
1414
; block0:
15-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p0i), XReg(p0i), XReg(p0i), XReg(p0i)] }, uses: [], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
16-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p0i), XReg(p0i), XReg(p0i), XReg(p0i)] }, uses: [], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
15+
; xmov x3, x0
16+
; xmov x1, x3
17+
; xmov x2, x3
18+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
19+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
1720
; pop_frame
1821
; ret
1922
;
2023
; Disassembled:
2124
; push_frame
22-
; call4 x0, x0, x0, x0, 0x5 // target = 0x6
23-
; call4 x0, x0, x0, x0, 0x5 // target = 0xf
25+
; xmov x3, x0
26+
; xmov x1, x3
27+
; xmov x2, x3
28+
; call 0x1 // target = 0xb
29+
; call 0x1 // target = 0x10
2430
; pop_frame
2531
; ret
2632

@@ -36,26 +42,32 @@ block0(v0: i64):
3642
; push_frame
3743
; block0:
3844
; xmov x9, x0
45+
; xmov x1, x9
46+
; xmov x2, x9
47+
; xmov x3, x9
3948
; xmov x4, x9
4049
; xmov x5, x9
4150
; xmov x6, x9
4251
; xmov x7, x9
4352
; xmov x8, x9
44-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p9i), XReg(p9i), XReg(p9i), XReg(p9i)] }, uses: [CallArgPair { vreg: p4i, preg: p4i }, CallArgPair { vreg: p5i, preg: p5i }, CallArgPair { vreg: p6i, preg: p6i }, CallArgPair { vreg: p7i, preg: p7i }, CallArgPair { vreg: p8i, preg: p8i }, CallArgPair { vreg: p9i, preg: p9i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
45-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p9i), XReg(p9i), XReg(p9i), XReg(p9i)] }, uses: [CallArgPair { vreg: p4i, preg: p4i }, CallArgPair { vreg: p5i, preg: p5i }, CallArgPair { vreg: p6i, preg: p6i }, CallArgPair { vreg: p7i, preg: p7i }, CallArgPair { vreg: p8i, preg: p8i }, CallArgPair { vreg: p9i, preg: p9i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
53+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }, CallArgPair { vreg: p4i, preg: p4i }, CallArgPair { vreg: p5i, preg: p5i }, CallArgPair { vreg: p6i, preg: p6i }, CallArgPair { vreg: p7i, preg: p7i }, CallArgPair { vreg: p8i, preg: p8i }, CallArgPair { vreg: p9i, preg: p9i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
54+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }, CallArgPair { vreg: p4i, preg: p4i }, CallArgPair { vreg: p5i, preg: p5i }, CallArgPair { vreg: p6i, preg: p6i }, CallArgPair { vreg: p7i, preg: p7i }, CallArgPair { vreg: p8i, preg: p8i }, CallArgPair { vreg: p9i, preg: p9i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: true }
4655
; pop_frame
4756
; ret
4857
;
4958
; Disassembled:
5059
; push_frame
5160
; xmov x9, x0
61+
; xmov x1, x9
62+
; xmov x2, x9
63+
; xmov x3, x9
5264
; xmov x4, x9
5365
; xmov x5, x9
5466
; xmov x6, x9
5567
; xmov x7, x9
5668
; xmov x8, x9
57-
; call4 x9, x9, x9, x9, 0x5 // target = 0x18
58-
; call4 x9, x9, x9, x9, 0x5 // target = 0x21
69+
; call 0x1 // target = 0x1d
70+
; call 0x1 // target = 0x22
5971
; pop_frame
6072
; ret
6173

@@ -75,12 +87,11 @@ block2(v1: i64):
7587
; VCode:
7688
; push_frame_save 144, {x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0}
7789
; block0:
78-
; xmov x7, x0
79-
; xmov x9, x0
80-
; xmov x10, x0
81-
; xmov x11, x0
8290
; xstore64 Slot(0), x0 // flags = notrap aligned
83-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p7i), XReg(p11i), XReg(p10i), XReg(p9i)] }, uses: [], defs: [CallRetPair { vreg: Writable { reg: p0i }, location: Reg(p0i, types::I64) }, CallRetPair { vreg: Writable { reg: p1i }, location: Reg(p1i, types::I64) }], clobbers: PRegSet { bits: [4294967292, 4294967295, 4294967295, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: Some(TryCallInfo { continuation: MachLabel(1), exception_handlers: [Default(MachLabel(2))] }), patchable: true }; jump MachLabel(1); catch [default: MachLabel(2)]
91+
; x1 = xload64 Slot(0) // flags = notrap aligned
92+
; x2 = xload64 Slot(0) // flags = notrap aligned
93+
; x3 = xload64 Slot(0) // flags = notrap aligned
94+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }, CallArgPair { vreg: p1i, preg: p1i }, CallArgPair { vreg: p2i, preg: p2i }, CallArgPair { vreg: p3i, preg: p3i }], defs: [CallRetPair { vreg: Writable { reg: p0i }, location: Reg(p0i, types::I64) }, CallRetPair { vreg: Writable { reg: p1i }, location: Reg(p1i, types::I64) }], clobbers: PRegSet { bits: [4294967292, 4294967295, 4294967295, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: Some(TryCallInfo { continuation: MachLabel(1), exception_handlers: [Default(MachLabel(2))] }), patchable: true }; jump MachLabel(1); catch [default: MachLabel(2)]
8495
; block1:
8596
; x0 = xload64 Slot(0) // flags = notrap aligned
8697
; pop_frame_restore 144, {x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0}
@@ -91,12 +102,11 @@ block2(v1: i64):
91102
;
92103
; Disassembled:
93104
; push_frame_save 144, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0
94-
; xmov x7, x0
95-
; xmov x9, x0
96-
; xmov x10, x0
97-
; xmov x11, x0
98105
; xstore64le_o32 sp, 0, x0
99-
; call4 x7, x11, x10, x9, 0x5 // target = 0x1d
106+
; xload64le_o32 x1, sp, 0
107+
; xload64le_o32 x2, sp, 0
108+
; xload64le_o32 x3, sp, 0
109+
; call 0x1 // target = 0x22
100110
; xload64le_o32 x0, sp, 0
101111
; pop_frame_restore 144, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0
102112
; ret

cranelift/filetests/filetests/isa/pulley64/preserve-all.clif

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ block0(v0: i64):
380380
; VCode:
381381
; push_frame
382382
; block0:
383-
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [XReg(p0i)] }, uses: [], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: false }
383+
; call CallInfo { dest: PulleyCall { name: TestCase(%f), args: [] }, uses: [CallArgPair { vreg: p0i, preg: p0i }], defs: [], clobbers: PRegSet { bits: [0, 0, 0, 0] }, callee_conv: PreserveAll, caller_conv: SystemV, callee_pop_size: 0, try_call_info: None, patchable: false }
384384
; pop_frame
385385
; ret
386386
;

0 commit comments

Comments
 (0)