upgrade cranelift (#6331)

This commit is contained in:
Jeong, YunWon authored and GitHub committed 2025-12-06 10:01:37 +09:00
1 parent b3141d1231
commit 56a7fb129a
3 files changed
+101 -79

No files matched your search

Generated
+53 -42
View File
@@ -682,9 +682,9 @@ dependencies = [
[[package]]
name = "cranelift"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdf99ca3e855b6ca01ee5a334542704274d046deb25cf3013a74eda9e1f7ce0f"
checksum = "68971376deb1edf5e9c0ac77ef00479d740ce7a60e6181adb0648afe1dc7b8f4"
dependencies = [
"cranelift-codegen",
"cranelift-frontend",
@@ -693,42 +693,42 @@ dependencies = [
[[package]]
name = "cranelift-assembler-x64"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "359c047862387091eb0363ce8b5cabb4a8be1cc16a6fa151fe079c09796461f3"
checksum = "30054f4aef4d614d37f27d5b77e36e165f0b27a71563be348e7c9fcfac41eed8"
dependencies = [
"cranelift-assembler-x64-meta",
]
[[package]]
name = "cranelift-assembler-x64-meta"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bf62afda29fcde09d922f125a7d47880b540fd1de069558bfa637b4ce7aa1ca"
checksum = "0beab56413879d4f515e08bcf118b1cb85f294129bb117057f573d37bfbb925a"
dependencies = [
"cranelift-srcgen",
]
[[package]]
name = "cranelift-bforest"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3537273471ebdae55791869ee16f71a4a51e34ad47cdc64269a9c2255b5dce03"
checksum = "6d054747549a69b264d5299c8ca1b0dd45dc6bd0ee43f1edfcc42a8b12952c7a"
dependencies = [
"cranelift-entity",
]
[[package]]
name = "cranelift-bitset"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b872fde1717c508f842ad1ad8768fbe16caf7e8e049215b0e09429bbf00d3ce9"
checksum = "98b92d481b77a7dc9d07c96e24a16f29e0c9c27d042828fdf7e49e54ee9819bf"
[[package]]
name = "cranelift-codegen"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52a74ef998eb9f985dc0d987d3aac0fe4bd1b59ec707461b2d6d20cda1b0a5e1"
checksum = "6eeccfc043d599b0ef1806942707fc51cdd1c3965c343956dc975a55d82a920f"
dependencies = [
"bumpalo",
"cranelift-assembler-x64",
@@ -747,48 +747,50 @@ dependencies = [
"serde",
"smallvec",
"target-lexicon",
"wasmtime-internal-math",
]
[[package]]
name = "cranelift-codegen-meta"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a04a532b9a7b69c28e7e37d15bca7f7f5cc56399df890ec399333e2d548004a"
checksum = "1174cdb9d9d43b2bdaa612a07ed82af13db9b95526bc2c286c2aec4689bcc038"
dependencies = [
"cranelift-assembler-x64-meta",
"cranelift-codegen-shared",
"cranelift-srcgen",
"heck",
]
[[package]]
name = "cranelift-codegen-shared"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95c4556174c6eb7d586bd1715b7f9c3a43a0835d6a95715893718b2f263af895"
checksum = "7d572be73fae802eb115f45e7e67a9ed16acb4ee683b67c4086768786545419a"
[[package]]
name = "cranelift-control"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18d8e9ae221e352dbea7f6f389705365f8128e7e0a7de5cf787ab7b2ccd1c522"
checksum = "e1587465cc84c5cc793b44add928771945f3132bbf6b3621ee9473c631a87156"
dependencies = [
"arbitrary",
]
[[package]]
name = "cranelift-entity"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40d10b531267cc86ba4fbb7b718b646df503713828b37841a867f332954b24ad"
checksum = "063b83448b1343e79282c3c7cbda7ed5f0816f0b763a4c15f7cecb0a17d87ea6"
dependencies = [
"cranelift-bitset",
]
[[package]]
name = "cranelift-frontend"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07540e6f75357d655743008965018fe243434ec6755078794616fde31f783a03"
checksum = "aa4461c2d2ca48bc72883f5f5c3129d9aefac832df1db824af9db8db3efee109"
dependencies = [
"cranelift-codegen",
"log",
@@ -798,15 +800,15 @@ dependencies = [
[[package]]
name = "cranelift-isle"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e0909e87af454a7ff542ece2d66f901f2cc9483ab36572a924eb5e58ce51fc0"
checksum = "acd811b25e18f14810d09c504e06098acc1d9dbfa24879bf0d6b6fb44415fc66"
[[package]]
name = "cranelift-jit"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e353bd2b08aed8e0a0da4838fcf1a5b6004464675e5651f050bdcd952f12f479"
checksum = "01527663ba63c10509d7c87fd1f8495d21170ba35bf714f57271495689d8fde5"
dependencies = [
"anyhow",
"cranelift-codegen",
@@ -818,15 +820,15 @@ dependencies = [
"log",
"region",
"target-lexicon",
"wasmtime-jit-icache-coherence",
"windows-sys 0.59.0",
"wasmtime-internal-jit-icache-coherence",
"windows-sys 0.60.2",
]
[[package]]
name = "cranelift-module"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "279fa60ec6f91746d560064c8900d9566a239cb6ae788a62cd5b3908589ca749"
checksum = "72328edb49aeafb1655818c91c476623970cb7b8a89ffbdadd82ce7d13dedc1d"
dependencies = [
"anyhow",
"cranelift-codegen",
@@ -835,9 +837,9 @@ dependencies = [
[[package]]
name = "cranelift-native"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f2d3963401ea1f8f84bdb0b654f1ca186be97e6ca94ccd2a8037b9edee47e17"
checksum = "2417046989d8d6367a55bbab2e406a9195d176f4779be4aa484d645887217d37"
dependencies = [
"cranelift-codegen",
"libc",
@@ -846,9 +848,9 @@ dependencies = [
[[package]]
name = "cranelift-srcgen"
version = "0.119.1"
version = "0.126.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "823558b0a406b7f7d5dad0c925b29e8192792476faaa71615d40cb5a842a9040"
checksum = "8d039de901c8d928222b8128e1b9a9ab27b82a7445cb749a871c75d9cb25c57d"
[[package]]
name = "crc32fast"
@@ -1336,9 +1338,9 @@ dependencies = [
[[package]]
name = "gimli"
version = "0.31.1"
version = "0.32.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7"
dependencies = [
"fallible-iterator",
"indexmap",
@@ -2661,9 +2663,9 @@ dependencies = [
[[package]]
name = "regalloc2"
version = "0.11.2"
version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc06e6b318142614e4a48bc725abbf08ff166694835c43c9dae5a9009704639a"
checksum = "4e249c660440317032a71ddac302f25f1d5dff387667bcc3978d1f77aa31ac34"
dependencies = [
"allocator-api2",
"bumpalo",
@@ -4252,15 +4254,24 @@ dependencies = [
]
[[package]]
name = "wasmtime-jit-icache-coherence"
version = "32.0.1"
name = "wasmtime-internal-jit-icache-coherence"
version = "39.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23ccb3dd740a0601addd260f4a6d91470cd3f7a2058efe46662054ca6b6da592"
checksum = "b97ccd36e25390258ce6720add639ffe5a7d81a5c904350aa08f5bbc60433d22"
dependencies = [
"anyhow",
"cfg-if",
"libc",
"windows-sys 0.59.0",
"windows-sys 0.60.2",
]
[[package]]
name = "wasmtime-internal-math"
version = "39.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd1b856e1bbf0230ab560ba4204e944b141971adc4e6cdf3feb6979c1a7b7953"
dependencies = [
"libm",
]
[[package]]
+3 -3
View File
@@ -17,9 +17,9 @@ num-traits = { workspace = true }
thiserror = { workspace = true }
libffi = { workspace = true }
cranelift = "0.119"
cranelift-jit = "0.119"
cranelift-module = "0.119"
cranelift = "0.126"
cranelift-jit = "0.126"
cranelift-module = "0.126"
[dev-dependencies]
rustpython-derive = { workspace = true }
+45 -34
View File
@@ -111,13 +111,11 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
let builder = &mut self.builder;
let ty = val.to_jit_type().ok_or(JitCompileError::NotSupported)?;
let local = self.variables[idx as usize].get_or_insert_with(|| {
let var = Variable::new(idx as usize);
let local = Local {
let var = builder.declare_var(ty.to_cranelift());
Local {
var,
ty: ty.clone(),
};
builder.declare_var(var, ty.to_cranelift());
local
}
});
if ty != local.ty {
Err(JitCompileError::NotSupported)
@@ -1021,7 +1019,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
.ins()
.brif(cmp_b_zero, b_zero_block, &[], continue_block, &[]);
self.builder.switch_to_block(b_zero_block);
self.builder.ins().jump(merge_block, &[one_f]);
self.builder.ins().jump(merge_block, &[one_f.into()]);
self.builder.switch_to_block(continue_block);
// --- Edge Case 2: b is NaN → return NaN
@@ -1032,7 +1030,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
.ins()
.brif(cmp_b_nan, b_nan_block, &[], continue_block2, &[]);
self.builder.switch_to_block(b_nan_block);
self.builder.ins().jump(merge_block, &[nan_f]);
self.builder.ins().jump(merge_block, &[nan_f.into()]);
self.builder.switch_to_block(continue_block2);
// --- Edge Case 3: a == 0.0 → return 0.0
@@ -1043,7 +1041,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
.ins()
.brif(cmp_a_zero, a_zero_block, &[], continue_block3, &[]);
self.builder.switch_to_block(a_zero_block);
self.builder.ins().jump(merge_block, &[zero_f]);
self.builder.ins().jump(merge_block, &[zero_f.into()]);
self.builder.switch_to_block(continue_block3);
// --- Edge Case 4: a is NaN → return NaN
@@ -1054,7 +1052,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
.ins()
.brif(cmp_a_nan, a_nan_block, &[], continue_block4, &[]);
self.builder.switch_to_block(a_nan_block);
self.builder.ins().jump(merge_block, &[nan_f]);
self.builder.ins().jump(merge_block, &[nan_f.into()]);
self.builder.switch_to_block(continue_block4);
// --- Edge Case 5: b == +infinity → return +infinity
@@ -1065,7 +1063,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
.ins()
.brif(cmp_b_inf, b_inf_block, &[], continue_block5, &[]);
self.builder.switch_to_block(b_inf_block);
self.builder.ins().jump(merge_block, &[inf_f]);
self.builder.ins().jump(merge_block, &[inf_f.into()]);
self.builder.switch_to_block(continue_block5);
// --- Edge Case 6: b == -infinity → return 0.0
@@ -1076,7 +1074,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
.ins()
.brif(cmp_b_neg_inf, b_neg_inf_block, &[], continue_block6, &[]);
self.builder.switch_to_block(b_neg_inf_block);
self.builder.ins().jump(merge_block, &[zero_f]);
self.builder.ins().jump(merge_block, &[zero_f.into()]);
self.builder.switch_to_block(continue_block6);
// --- Edge Case 7: a == +infinity → return +infinity
@@ -1087,7 +1085,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
.ins()
.brif(cmp_a_inf, a_inf_block, &[], continue_block7, &[]);
self.builder.switch_to_block(a_inf_block);
self.builder.ins().jump(merge_block, &[inf_f]);
self.builder.ins().jump(merge_block, &[inf_f.into()]);
self.builder.switch_to_block(continue_block7);
// --- Edge Case 8: a == -infinity → check exponent parity
@@ -1109,7 +1107,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
.brif(cmp_int, continue_neg_inf, &[], domain_error_blk, &[]);
self.builder.switch_to_block(domain_error_blk);
self.builder.ins().jump(merge_block, &[nan_f]);
self.builder.ins().jump(merge_block, &[nan_f.into()]);
self.builder.switch_to_block(continue_neg_inf);
// b is an integer here; convert b_floor to an i64.
@@ -1124,17 +1122,21 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
let even_block = self.builder.create_block();
self.builder.append_block_param(odd_block, f64_ty);
self.builder.append_block_param(even_block, f64_ty);
self.builder
.ins()
.brif(is_odd, odd_block, &[neg_inf_f], even_block, &[inf_f]);
self.builder.ins().brif(
is_odd,
odd_block,
&[neg_inf_f.into()],
even_block,
&[inf_f.into()],
);
self.builder.switch_to_block(odd_block);
let phi_neg_inf = self.builder.block_params(odd_block)[0];
self.builder.ins().jump(merge_block, &[phi_neg_inf]);
self.builder.ins().jump(merge_block, &[phi_neg_inf.into()]);
self.builder.switch_to_block(even_block);
let phi_inf = self.builder.block_params(even_block)[0];
self.builder.ins().jump(merge_block, &[phi_inf]);
self.builder.ins().jump(merge_block, &[phi_inf.into()]);
self.builder.switch_to_block(continue_block8);
@@ -1154,7 +1156,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
let product_dd = self.dd_mul(ln_a_dd, b_dd);
let exp_dd = self.dd_exp(product_dd);
let pos_res = self.dd_to_f64(exp_dd);
self.builder.ins().jump(merge_block, &[pos_res]);
self.builder.ins().jump(merge_block, &[pos_res.into()]);
// ----- Case: a < 0: Only allow an integral exponent.
self.builder.switch_to_block(a_neg_block);
@@ -1168,7 +1170,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
// Domain error: non-integer exponent for negative base
self.builder.switch_to_block(domain_error_blk);
self.builder.ins().jump(merge_block, &[nan_f]);
self.builder.ins().jump(merge_block, &[nan_f.into()]);
// For negative base with an integer exponent:
self.builder.switch_to_block(neg_int_block);
@@ -1191,18 +1193,24 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
self.builder.append_block_param(odd_block, f64_ty);
self.builder.append_block_param(even_block, f64_ty);
// Pass mag_val to both branches:
self.builder
.ins()
.brif(is_odd, odd_block, &[mag_val], even_block, &[mag_val]);
self.builder.ins().brif(
is_odd,
odd_block,
&[mag_val.into()],
even_block,
&[mag_val.into()],
);
self.builder.switch_to_block(odd_block);
let phi_mag_val = self.builder.block_params(odd_block)[0];
let neg_val = self.builder.ins().fneg(phi_mag_val);
self.builder.ins().jump(merge_block, &[neg_val]);
self.builder.ins().jump(merge_block, &[neg_val.into()]);
self.builder.switch_to_block(even_block);
let phi_mag_val_even = self.builder.block_params(even_block)[0];
self.builder.ins().jump(merge_block, &[phi_mag_val_even]);
self.builder
.ins()
.jump(merge_block, &[phi_mag_val_even.into()]);
// ----- Merge: Return the final result.
self.builder.switch_to_block(merge_block);
@@ -1239,7 +1247,9 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
self.builder.append_block_param(continue_block, types::I64); // base
// Initial jump to check if exponent is negative
self.builder.ins().jump(check_negative, &[b, a]);
self.builder
.ins()
.jump(check_negative, &[b.into(), a.into()]);
// Check if exponent is negative
self.builder.switch_to_block(check_negative);
@@ -1254,14 +1264,14 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
self.builder.ins().brif(
is_negative,
handle_negative,
&[exp_check, base_check],
&[exp_check.into(), base_check.into()],
loop_block,
&[exp_check, one_i64, base_check],
&[exp_check.into(), one_i64.into(), base_check.into()],
);
// Handle negative exponent (return 0 for integer exponentiation)
self.builder.switch_to_block(handle_negative);
self.builder.ins().jump(exit_block, &[zero]); // Return 0 for negative exponents
self.builder.ins().jump(exit_block, &[zero.into()]); // Return 0 for negative exponents
// Loop block logic (square-and-multiply algorithm)
self.builder.switch_to_block(loop_block);
@@ -1275,9 +1285,9 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
self.builder.ins().brif(
is_zero,
exit_block,
&[result_phi],
&[result_phi.into()],
continue_block,
&[exp_phi, result_phi, base_phi],
&[exp_phi.into(), result_phi.into(), base_phi.into()],
);
// Continue block for non-zero case
@@ -1296,9 +1306,10 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
// Square the base and divide exponent by 2
let squared_base = self.builder.ins().imul(base_phi, base_phi);
let new_exp = self.builder.ins().sshr_imm(exp_phi, 1);
self.builder
.ins()
.jump(loop_block, &[new_exp, new_result, squared_base]);
self.builder.ins().jump(
loop_block,
&[new_exp.into(), new_result.into(), squared_base.into()],
);
// Exit block
self.builder.switch_to_block(exit_block);