From 79d8aa366dcd61f0914363f7fed8b5cbe0da4ecf Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 8 Aug 2017 14:14:59 -0700 Subject: [PATCH] Don't perform gvn on instructions with other_side_effects(). --- cranelift/filetests/simple_gvn/reject.cton | 11 +++++++++++ lib/cretonne/src/simple_gvn.rs | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 cranelift/filetests/simple_gvn/reject.cton diff --git a/cranelift/filetests/simple_gvn/reject.cton b/cranelift/filetests/simple_gvn/reject.cton new file mode 100644 index 0000000000..755891ad5d --- /dev/null +++ b/cranelift/filetests/simple_gvn/reject.cton @@ -0,0 +1,11 @@ +test simple-gvn + +function %other_side_effects(i32) -> i32 { +ebb0(v0: i32): + regmove v0, %10 -> %20 + regmove v0, %10 -> %20 + regmove v0, %20 -> %10 +; check: regmove v0, %10 -> %20 +; check: regmove v0, %10 -> %20 + return v0 +} diff --git a/lib/cretonne/src/simple_gvn.rs b/lib/cretonne/src/simple_gvn.rs index 078bca2857..2d1c5a7e61 100644 --- a/lib/cretonne/src/simple_gvn.rs +++ b/lib/cretonne/src/simple_gvn.rs @@ -8,7 +8,7 @@ use std::collections::HashMap; /// Test whether the given opcode is unsafe to even consider for GVN. fn trivially_unsafe_for_gvn(opcode: Opcode) -> bool { opcode.is_call() || opcode.is_branch() || opcode.is_terminator() || opcode.is_return() || - opcode.can_trap() + opcode.can_trap() || opcode.other_side_effects() } /// Perform simple GVN on `func`.