From 94190d57244b26baf36629c88104b0ba516510cf Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Mon, 11 May 2020 11:09:40 +0200 Subject: [PATCH] cranelift/reader/src/parser.rs: fn parse_inst_resuts: produce the results as a SmallVec<[Value; 1]>, not as a Vec. This isn't a useful change for any non-developer use of Cranelift, but it does significantly reduce the amount of allocation "noise" seen when tuning the new backend pipeline as driven by clif-util reading .clif files. In one case the number of malloc calls declined by about 20% with this change. --- Cargo.lock | 1 + cranelift/reader/Cargo.toml | 1 + cranelift/reader/src/parser.rs | 5 +++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 52c8ef1b89..71798731de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -489,6 +489,7 @@ name = "cranelift-reader" version = "0.63.0" dependencies = [ "cranelift-codegen", + "smallvec", "target-lexicon", "thiserror", ] diff --git a/cranelift/reader/Cargo.toml b/cranelift/reader/Cargo.toml index fb0f8a1fda..8b8b451bfd 100644 --- a/cranelift/reader/Cargo.toml +++ b/cranelift/reader/Cargo.toml @@ -11,6 +11,7 @@ edition = "2018" [dependencies] cranelift-codegen = { path = "../codegen", version = "0.63.0" } +smallvec = "1.0.0" target-lexicon = "0.10" thiserror = "1.0.15" diff --git a/cranelift/reader/src/parser.rs b/cranelift/reader/src/parser.rs index 4e9608a506..4a59a13667 100644 --- a/cranelift/reader/src/parser.rs +++ b/cranelift/reader/src/parser.rs @@ -23,6 +23,7 @@ use cranelift_codegen::ir::{ use cranelift_codegen::isa::{self, CallConv, Encoding, RegUnit, TargetIsa}; use cranelift_codegen::packed_option::ReservedValue; use cranelift_codegen::{settings, timing}; +use smallvec::SmallVec; use std::mem; use std::str::FromStr; use std::{u16, u32}; @@ -2223,9 +2224,9 @@ impl<'a> Parser<'a> { // // inst-results ::= Value(v) { "," Value(v) } // - fn parse_inst_results(&mut self) -> ParseResult> { + fn parse_inst_results(&mut self) -> ParseResult> { // Result value numbers. - let mut results = Vec::new(); + let mut results = SmallVec::new(); // instruction ::= * [inst-results "="] Opcode(opc) ["." Type] ... // inst-results ::= * Value(v) { "," Value(v) }