From 7f0d0b98d069d0a81c6faea039cb62971d974beb Mon Sep 17 00:00:00 2001 From: Trevor Elliott Date: Tue, 29 Nov 2022 09:30:59 -0800 Subject: [PATCH] Expose ssa verification as a regalloc2 option (#102) Adds the validate_ssa flag to the RegallocOptions struct, enabling ssa validation of inputs before register allocation takes place. --- fuzz/fuzz_targets/ion.rs | 3 ++- fuzz/fuzz_targets/ion_checker.rs | 3 ++- fuzz/fuzz_targets/ssagen.rs | 2 +- src/fuzzing/mod.rs | 1 - src/ion/mod.rs | 6 ++++++ src/lib.rs | 6 +++++- src/{fuzzing => }/ssa.rs | 0 7 files changed, 16 insertions(+), 5 deletions(-) rename src/{fuzzing => }/ssa.rs (100%) diff --git a/fuzz/fuzz_targets/ion.rs b/fuzz/fuzz_targets/ion.rs index 6d6e5be..aa754c7 100644 --- a/fuzz/fuzz_targets/ion.rs +++ b/fuzz/fuzz_targets/ion.rs @@ -11,5 +11,6 @@ fuzz_target!(|func: Func| { let _ = env_logger::try_init(); log::trace!("func:\n{:?}", func); let env = regalloc2::fuzzing::func::machine_env(); - let _out = regalloc2::fuzzing::ion::run(&func, &env, false).expect("regalloc did not succeed"); + let _out = + regalloc2::fuzzing::ion::run(&func, &env, false, false).expect("regalloc did not succeed"); }); diff --git a/fuzz/fuzz_targets/ion_checker.rs b/fuzz/fuzz_targets/ion_checker.rs index 1ac49e9..c5aac16 100644 --- a/fuzz/fuzz_targets/ion_checker.rs +++ b/fuzz/fuzz_targets/ion_checker.rs @@ -40,7 +40,8 @@ fuzz_target!(|testcase: TestCase| { let _ = env_logger::try_init(); log::trace!("func:\n{:?}", func); let env = regalloc2::fuzzing::func::machine_env(); - let out = regalloc2::fuzzing::ion::run(&func, &env, true).expect("regalloc did not succeed"); + let out = + regalloc2::fuzzing::ion::run(&func, &env, true, false).expect("regalloc did not succeed"); let mut checker = Checker::new(&func, &env); checker.prepare(&out); diff --git a/fuzz/fuzz_targets/ssagen.rs b/fuzz/fuzz_targets/ssagen.rs index 733d814..4b7a0ae 100644 --- a/fuzz/fuzz_targets/ssagen.rs +++ b/fuzz/fuzz_targets/ssagen.rs @@ -8,7 +8,7 @@ use regalloc2::fuzzing::arbitrary::{Arbitrary, Result, Unstructured}; use regalloc2::fuzzing::cfg::CFGInfo; use regalloc2::fuzzing::func::{Func, Options}; use regalloc2::fuzzing::fuzz_target; -use regalloc2::fuzzing::ssa::validate_ssa; +use regalloc2::ssa::validate_ssa; #[derive(Debug)] struct TestCase { diff --git a/src/fuzzing/mod.rs b/src/fuzzing/mod.rs index 69e0753..4e5573f 100644 --- a/src/fuzzing/mod.rs +++ b/src/fuzzing/mod.rs @@ -6,7 +6,6 @@ //! Utilities for fuzzing. pub mod func; -pub mod ssa; // Re-exports for fuzz targets. diff --git a/src/ion/mod.rs b/src/ion/mod.rs index 020c418..536ec93 100644 --- a/src/ion/mod.rs +++ b/src/ion/mod.rs @@ -14,6 +14,7 @@ //! its design. use crate::cfg::CFGInfo; +use crate::ssa::validate_ssa; use crate::{Function, MachineEnv, Output, PReg, ProgPoint, RegAllocError, RegClass}; use std::collections::HashMap; @@ -120,9 +121,14 @@ pub fn run( func: &F, mach_env: &MachineEnv, enable_annotations: bool, + enable_ssa_checker: bool, ) -> Result { let cfginfo = CFGInfo::new(func)?; + if enable_ssa_checker { + validate_ssa(func, &cfginfo)?; + } + let mut env = Env::new(func, mach_env, cfginfo, enable_annotations); env.init()?; diff --git a/src/lib.rs b/src/lib.rs index 52135fd..7d7baf3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -34,6 +34,7 @@ pub mod indexset; pub(crate) mod ion; pub(crate) mod moves; pub(crate) mod postorder; +pub mod ssa; #[macro_use] mod index; @@ -1477,7 +1478,7 @@ pub fn run( env: &MachineEnv, options: &RegallocOptions, ) -> Result { - ion::run(func, env, options.verbose_log) + ion::run(func, env, options.verbose_log, options.validate_ssa) } /// Options for allocation. @@ -1485,4 +1486,7 @@ pub fn run( pub struct RegallocOptions { /// Add extra verbosity to debug logs. pub verbose_log: bool, + + /// Run the SSA validator before allocating registers. + pub validate_ssa: bool, } diff --git a/src/fuzzing/ssa.rs b/src/ssa.rs similarity index 100% rename from src/fuzzing/ssa.rs rename to src/ssa.rs