Skip to content

Commit

Permalink
Merge pull request #2718 from cfallin/new-backend
Browse files Browse the repository at this point in the history
Switch default to new x86_64 backend.
  • Loading branch information
cfallin authored Apr 5, 2021
2 parents 04bf6e5 + cb48ea4 commit 8d78212
Show file tree
Hide file tree
Showing 243 changed files with 316 additions and 442 deletions.
41 changes: 5 additions & 36 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ jobs:
# Test debug (DWARF) related functionality on new backend.
- run: |
sudo apt-get update && sudo apt-get install -y gdb lldb
cargo test --features experimental_x64 test_debug_dwarf -- --ignored --test-threads 1 --test debug::
cargo test test_debug_dwarf -- --ignored --test-threads 1 --test debug::
if: matrix.os == 'ubuntu-latest'
env:
RUST_BACKTRACE: 1
Expand All @@ -309,10 +309,9 @@ jobs:
env:
RUST_BACKTRACE: 1

# Perform all tests (debug mode) for `wasmtime` with the experimental x64
# backend.
# Perform all tests (debug mode) for `wasmtime` with the old x86 backend.
test_x64:
name: Test x64 new backend
name: Test old x86 backend
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
Expand All @@ -328,38 +327,8 @@ jobs:
- run: rustup target add wasm32-wasi
- run: rustup target add wasm32-unknown-unknown

# Run the x64 CI script.
- run: ./ci/run-experimental-x64-ci.sh
env:
RUST_BACKTRACE: 1

# Perform tests on the new x64 backend on Windows as well.
test_x64_win:
name: Test x64 new backend on Windows
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
with:
submodules: true
- uses: ./.github/actions/install-rust
- uses: ./.github/actions/define-llvm-env

- name: Install libclang
# Note: libclang is pre-installed on the macOS and linux images.
if: matrix.os == 'windows-latest'
run: |
curl https://releases.llvm.org/9.0.0/LLVM-9.0.0-win64.exe -o llvm-installer.exe
7z x llvm-installer.exe -oC:/llvm-binary
echo LIBCLANG_PATH=C:/llvm-binary/bin/libclang.dll >> $GITHUB_ENV
echo C:/llvm-binary/bin >> $GITHUB_PATH
# Install wasm32 targets in order to build various tests throughout the
# repo.
- run: rustup target add wasm32-wasi
- run: rustup target add wasm32-unknown-unknown

# Run the x64 CI script.
- run: ./ci/run-experimental-x64-ci.sh
# Run the old x86 backend CI (we will eventually remove this).
- run: ./ci/run-old-x86-ci.sh
env:
RUST_BACKTRACE: 1

Expand Down
9 changes: 6 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,12 @@ wasi-nn = ["wasmtime-wasi-nn"]
uffd = ["wasmtime/uffd"]
all-arch = ["wasmtime/all-arch"]

# Try the experimental, work-in-progress new x86_64 backend. This is not stable
# as of June 2020.
experimental_x64 = ["wasmtime-jit/experimental_x64"]
# Stub feature that does nothing, for Cargo-features compatibility: the new
# backend is the default now.
experimental_x64 = []

# Use the old x86 backend.
old-x86-backend = ["wasmtime-jit/old-x86-backend"]

[badges]
maintenance = { status = "actively-developed" }
Expand Down
42 changes: 13 additions & 29 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,8 @@ fn write_testsuite_tests(
let testname = extract_name(path);

writeln!(out, "#[test]")?;
if experimental_x64_should_panic(testsuite, &testname, strategy) {
writeln!(
out,
r#"#[cfg_attr(feature = "experimental_x64", should_panic)]"#
)?;
if x64_should_panic(testsuite, &testname, strategy) {
writeln!(out, r#"#[should_panic]"#)?;
} else if ignore(testsuite, &testname, strategy) {
writeln!(out, "#[ignore]")?;
} else if pooling {
Expand All @@ -186,10 +183,10 @@ fn write_testsuite_tests(
Ok(())
}

/// For experimental_x64 backend features that are not supported yet, mark tests as panicking, so
/// For x64 backend features that are not supported yet, mark tests as panicking, so
/// they stop "passing" once the features are properly implemented.
fn experimental_x64_should_panic(testsuite: &str, testname: &str, strategy: &str) -> bool {
if !cfg!(feature = "experimental_x64") || strategy != "Cranelift" {
fn x64_should_panic(testsuite: &str, testname: &str, strategy: &str) -> bool {
if !platform_is_x64() || strategy != "Cranelift" {
return false;
}

Expand Down Expand Up @@ -222,12 +219,11 @@ fn ignore(testsuite: &str, testname: &str, strategy: &str) -> bool {
_ => (),
},
"Cranelift" => match (testsuite, testname) {
// TODO(#1886): Ignore reference types tests if this isn't x64,
// because Cranelift only supports reference types on x64.
("reference_types", _) => {
return env::var("CARGO_CFG_TARGET_ARCH").unwrap() != "x86_64";
("simd", _) if cfg!(feature = "old-x86-backend") => return true, // skip all SIMD tests on old backend.
// These are only implemented on x64.
("simd", "simd_i64x2_arith2") | ("simd", "simd_boolean") => {
return !platform_is_x64() || cfg!(feature = "old-x86-backend")
}

// These are new instructions that are not really implemented in any backend.
("simd", "simd_i8x16_arith2")
| ("simd", "simd_conversions")
Expand All @@ -240,26 +236,14 @@ fn ignore(testsuite: &str, testname: &str, strategy: &str) -> bool {
| ("simd", "simd_i64x2_extmul_i32x4")
| ("simd", "simd_int_to_int_extend") => return true,

// These are only implemented on x64.
("simd", "simd_i64x2_arith2") | ("simd", "simd_boolean") => {
return !cfg!(feature = "experimental_x64")
}

// These are only implemented on aarch64 and x64.
("simd", "simd_i64x2_cmp")
| ("simd", "simd_f32x4_pmin_pmax")
| ("simd", "simd_f64x2_pmin_pmax")
| ("simd", "simd_f32x4_rounding")
| ("simd", "simd_f64x2_rounding")
| ("simd", "simd_i32x4_dot_i16x8") => {
return !(cfg!(feature = "experimental_x64")
|| env::var("CARGO_CFG_TARGET_ARCH").unwrap() == "aarch64")
}

_ => {}
},
_ => panic!("unrecognized strategy"),
}

false
}

fn platform_is_x64() -> bool {
env::var("CARGO_CFG_TARGET_ARCH").unwrap() == "x86_64"
}
2 changes: 1 addition & 1 deletion ci/run-experimental-x64-ci.sh → ci/run-old-x86-ci.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
cargo test \
--locked \
--features test-programs/test_programs \
--features experimental_x64 \
--features old-x86-backend \
--all \
--exclude wasmtime-lightbeam \
--exclude wasmtime-wasi-nn \
Expand Down
1 change: 0 additions & 1 deletion cranelift/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ default = ["disas", "wasm", "cranelift-codegen/all-arch", "peepmatic-souper", "s
disas = ["capstone"]
enable-peepmatic = ["cranelift-codegen/enable-peepmatic", "cranelift-filetests/enable-peepmatic"]
wasm = ["wat", "cranelift-wasm"]
experimental_x64 = ["cranelift-codegen/x64", "cranelift-filetests/experimental_x64", "cranelift-reader/experimental_x64"]
experimental_arm32 = ["cranelift-codegen/arm32", "cranelift-filetests/experimental_arm32"]
souper-harvest = ["cranelift-codegen/souper-harvest", "rayon"]
all-arch = ["cranelift-codegen/all-arch"]
8 changes: 7 additions & 1 deletion cranelift/codegen/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,15 @@ unwind = ["gimli"]
x86 = []
arm64 = []
riscv = []
x64 = [] # New work-in-progress codegen backend for x86_64 based on the new isel.
arm32 = [] # Work-in-progress codegen backend for ARM.

# Stub feature that does nothing, for Cargo-features compatibility: the new
# backend is the default now.
experimental_x64 = []

# Make the old x86 backend the default.
old-x86-backend = []

# Option to enable all architectures.
all-arch = [
"x86",
Expand Down
31 changes: 18 additions & 13 deletions cranelift/codegen/src/isa/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,16 +74,15 @@ use thiserror::Error;
#[cfg(feature = "riscv")]
mod riscv;

// N.B.: the old x86-64 backend (`x86`) and the new one (`x64`) can both be
// included; if the new backend is included, then it is the default backend
// returned for an x86-64 triple, but a specific option can request the old
// backend. It is important to have the ability to instantiate *both* backends
// in the same build so that we can do things like differential fuzzing between
// backends, or perhaps offer a runtime configuration flag in the future.
// N.B.: the old x86-64 backend (`x86`) and the new one (`x64`) are both
// included whenever building with x86 support. The new backend is the default,
// but the old can be requested with `BackendVariant::Legacy`. However, if this
// crate is built with the `old-x86-backend` feature, then the old backend is
// default instead.
#[cfg(feature = "x86")]
mod x86;

#[cfg(feature = "x64")]
#[cfg(feature = "x86")]
mod x64;

#[cfg(feature = "arm32")]
Expand Down Expand Up @@ -122,7 +121,7 @@ macro_rules! isa_builder {
/// The "variant" for a given target. On one platform (x86-64), we have two
/// backends, the "old" and "new" one; the new one is the default if included
/// in the build configuration and not otherwise specified.
#[derive(Clone, Copy)]
#[derive(Clone, Copy, Debug)]
pub enum BackendVariant {
/// Any backend available.
Any,
Expand All @@ -149,13 +148,13 @@ pub fn lookup_variant(triple: Triple, variant: BackendVariant) -> Result<Builder
isa_builder!(x86, (feature = "x86"), triple)
}
(Architecture::X86_64, BackendVariant::MachInst) => {
isa_builder!(x64, (feature = "x64"), triple)
isa_builder!(x64, (feature = "x86"), triple)
}
#[cfg(feature = "x64")]
#[cfg(not(feature = "old-x86-backend"))]
(Architecture::X86_64, BackendVariant::Any) => {
isa_builder!(x64, (feature = "x64"), triple)
isa_builder!(x64, (feature = "x86"), triple)
}
#[cfg(not(feature = "x64"))]
#[cfg(feature = "old-x86-backend")]
(Architecture::X86_64, BackendVariant::Any) => {
isa_builder!(x86, (feature = "x86"), triple)
}
Expand Down Expand Up @@ -277,7 +276,13 @@ pub trait TargetIsa: fmt::Display + Send + Sync {
/// Get the ISA-dependent flag values that were used to make this trait object.
fn isa_flags(&self) -> Vec<settings::Value>;

/// Hashes all flags, both ISA-independent and ISA-dependent, into the specified hasher.
/// Get the variant of this ISA (Legacy or MachInst).
fn variant(&self) -> BackendVariant {
BackendVariant::Legacy
}

/// Hashes all flags, both ISA-independent and ISA-specific, into the
/// specified hasher.
fn hash_all_flags(&self, hasher: &mut dyn Hasher);

/// Get the default calling convention of this target.
Expand Down
4 changes: 0 additions & 4 deletions cranelift/codegen/src/isa/unwind/winx64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ use log::warn;
#[cfg(feature = "enable-serde")]
use serde::{Deserialize, Serialize};

#[cfg(feature = "x64")]
use crate::binemit::CodeOffset;
#[cfg(feature = "x64")]
use crate::isa::unwind::UnwindInst;

/// Maximum (inclusive) size of a "small" stack allocation
Expand Down Expand Up @@ -334,10 +332,8 @@ impl UnwindInfo {
}
}

#[cfg(feature = "x64")]
const UNWIND_RBP_REG: u8 = 5;

#[cfg(feature = "x64")]
pub(crate) fn create_unwind_info_from_insts<MR: RegisterMapper<regalloc::Reg>>(
insts: &[(CodeOffset, UnwindInst)],
) -> CodegenResult<UnwindInfo> {
Expand Down
2 changes: 2 additions & 0 deletions cranelift/codegen/src/isa/x64/inst/unwind/systemv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ mod tests {
use target_lexicon::triple;

#[test]
#[cfg_attr(feature = "old-x86-backend", ignore)]
fn test_simple_func() {
let isa = lookup(triple!("x86_64"))
.expect("expect x86 ISA")
Expand Down Expand Up @@ -151,6 +152,7 @@ mod tests {
}

#[test]
#[cfg_attr(feature = "old-x86-backend", ignore)]
fn test_multi_return_func() {
let isa = lookup(triple!("x86_64"))
.expect("expect x86 ISA")
Expand Down
8 changes: 7 additions & 1 deletion cranelift/codegen/src/machinst/adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
use crate::binemit;
use crate::ir;
use crate::isa::{EncInfo, Encoding, Encodings, Legalize, RegClass, RegInfo, TargetIsa};
use crate::isa::{
BackendVariant, EncInfo, Encoding, Encodings, Legalize, RegClass, RegInfo, TargetIsa,
};
use crate::machinst::*;
use crate::regalloc::RegisterSet;
use crate::settings::{self, Flags};
Expand Down Expand Up @@ -62,6 +64,10 @@ impl TargetIsa for TargetIsaAdapter {
self.backend.isa_flags()
}

fn variant(&self) -> BackendVariant {
BackendVariant::MachInst
}

fn hash_all_flags(&self, hasher: &mut dyn Hasher) {
self.backend.hash_all_flags(hasher);
}
Expand Down
1 change: 0 additions & 1 deletion cranelift/filetests/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,3 @@ anyhow = "1.0.32"
[features]
enable-peepmatic = []
experimental_arm32 = []
experimental_x64 = []
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/amode-opt.clif
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test compile
target x86_64
feature "experimental_x64"
target x86_64 machinst

function %amode_add(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
Expand Down
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/b1.clif
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test compile
target x86_64
feature "experimental_x64"
target x86_64 machinst

function %f0(b1, i32, i32) -> i32 {
; check: pushq %rbp
Expand Down
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/basic.clif
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test compile
target x86_64
feature "experimental_x64"
target x86_64 machinst

function %f(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
Expand Down
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/bitops-i128-run.clif
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test run
target x86_64
feature "experimental_x64"
target x86_64 machinst

function %ctz(i64, i64) -> i8 {
block0(v0: i64, v1: i64):
Expand Down
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/bitrev-i128-run.clif
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test run
target x86_64
feature "experimental_x64"
target x86_64 machinst

function %reverse_bits_zero() -> b1 {
block0:
Expand Down
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/branches.clif
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test compile
target x86_64
feature "experimental_x64"
target x86_64 machinst

function %f0(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
Expand Down
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/clz-lzcnt.clif
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test compile
target x86_64 has_lzcnt
feature "experimental_x64"
target x86_64 machinst has_lzcnt

function %clz(i64) -> i64 {
block0(v0: i64):
Expand Down
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/cmp-mem-bug.clif
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test compile
target x86_64
feature "experimental_x64"
target x86_64 machinst

function %f0(i64, i64) -> i64, i64 {
block0(v0: i64, v1: i64):
Expand Down
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/ctz-bmi1.clif
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test compile
target x86_64 has_bmi1
feature "experimental_x64"
target x86_64 machinst has_bmi1

function %ctz(i64) -> i64 {
block0(v0: i64):
Expand Down
3 changes: 1 addition & 2 deletions cranelift/filetests/filetests/isa/x64/div-checks-run.clif
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
test run
set avoid_div_traps=false
target x86_64
feature "experimental_x64"
target x86_64 machinst

function %f0(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
Expand Down
Loading

0 comments on commit 8d78212

Please sign in to comment.