From 6e57e3f8f364fc2aefbbe3aa5cfb0a5336503416 Mon Sep 17 00:00:00 2001 From: iximeow Date: Wed, 31 Jul 2019 19:06:31 -0700 Subject: [PATCH] preopt: use replaced arg after having replaced BinaryImm when replacing BinaryImm, we use the prior arg, but later use the arg that was replaced when writing an alias if we can determine the new op is actually equivalent to a simple copy --- cranelift/codegen/src/simple_preopt.rs | 6 ++++-- .../filetests/filetests/simple_preopt/simplify.clif | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/cranelift/codegen/src/simple_preopt.rs b/cranelift/codegen/src/simple_preopt.rs index 9da90d2e4e..73c6a56148 100644 --- a/cranelift/codegen/src/simple_preopt.rs +++ b/cranelift/codegen/src/simple_preopt.rs @@ -585,6 +585,7 @@ fn simplify(pos: &mut FuncCursor, inst: Inst) { InstructionData::BinaryImm { opcode, arg, imm } => { let ty = pos.func.dfg.ctrl_typevar(inst); + let mut arg = arg; let mut imm = imm; match opcode { Opcode::IaddImm @@ -613,12 +614,13 @@ fn simplify(pos: &mut FuncCursor, inst: Inst) { _ => panic!("can't happen"), }; let new_imm = immediates::Imm64::from(new_imm); - let arg = *prev_arg; + let new_arg = *prev_arg; pos.func .dfg .replace(inst) - .BinaryImm(opcode, ty, new_imm, arg); + .BinaryImm(opcode, ty, new_imm, new_arg); imm = new_imm; + arg = new_arg; } } } diff --git a/cranelift/filetests/filetests/simple_preopt/simplify.clif b/cranelift/filetests/filetests/simple_preopt/simplify.clif index 587f64617d..e74be4738a 100644 --- a/cranelift/filetests/filetests/simple_preopt/simplify.clif +++ b/cranelift/filetests/filetests/simple_preopt/simplify.clif @@ -278,3 +278,16 @@ ebb0: ; nextln: v2 = sextend.i64 v3 ; nextln: return v2 ; nextln: } + +function %add_imm_fold(i32) -> i32 { +ebb0(v0: i32): + v1 = iadd_imm v0, 42 + v2 = iadd_imm v1, -42 + return v2 +} +; sameln: function %add_imm_fold(i32) +; nextln: ebb0(v0: i32): +; nextln: v2 -> v0 +; nextln: v1 = iadd_imm v0, 42 +; nextln: nop +; nextln: return v2