diff --git a/src/Makefile b/src/Makefile index 496457bb067..63cc67d0a27 100644 --- a/src/Makefile +++ b/src/Makefile @@ -385,11 +385,7 @@ TASK_XFAILS := test/run-pass/acyclic-unwind.rs \ test/run-pass/threads.rs \ test/run-pass/yield.rs -TEST_XFAILS := test/run-pass/arith-0.rs - TEST_XFAILS_X86 := $(TASK_XFAILS) \ - $(TEST_XFAILS) \ - test/run-pass/arithmetic-interference.rs \ test/run-pass/bind-obj-ctor.rs \ test/run-pass/child-outlives-parent.rs \ test/run-pass/clone-with-exterior.rs \ @@ -419,13 +415,11 @@ TEST_XFAILS_X86 := $(TASK_XFAILS) \ test/compile-fail/writing-through-read-alias.rs TEST_XFAILS_LLVM := $(TASK_XFAILS) \ - $(TEST_XFAILS) \ $(addprefix test/run-pass/, \ arith-1.rs \ acyclic-unwind.rs \ alt-pattern-simple.rs \ alt-tag.rs \ - arithmetic-interference.rs \ argv.rs \ autoderef-full-lval.rs \ autoderef-objfn.rs \ diff --git a/src/boot/be/x86.ml b/src/boot/be/x86.ml index 826127a0b49..71f9cdcf084 100644 --- a/src/boot/be/x86.ml +++ b/src/boot/be/x86.ml @@ -303,7 +303,7 @@ let emit_target_specific let dst_eax = hr_like_cell eax dst in let lhs_eax = hr_like_op eax lhs in let rhs_ecx = hr_like_op ecx rhs in - (* Horrible: we bounce complex mul inputs off spill slots + (* Horrible: we bounce mul/div/mod inputs off spill slots * to ensure non-interference between the temporaries used * during mem-base-reg reloads and the registers we're * preparing. *) @@ -311,32 +311,15 @@ let emit_target_specific Il.Mem (Il.next_spill_slot e (Il.ScalarTy (Il.operand_scalar_ty op))) in - let is_mem op = - match op with - Il.Cell (Il.Mem _) -> true - | _ -> false - in - let bounce_lhs = is_mem lhs in - let bounce_rhs = is_mem rhs in let lhs_spill = next_spill_like lhs in let rhs_spill = next_spill_like rhs in - if bounce_lhs - then mov lhs_spill lhs; + mov lhs_spill lhs; + mov rhs_spill rhs; - if bounce_rhs - then mov rhs_spill rhs; + mov lhs_eax (Il.Cell lhs_spill); + mov rhs_ecx (Il.Cell rhs_spill); - mov lhs_eax - (if bounce_lhs - then (Il.Cell lhs_spill) - else lhs); - - mov rhs_ecx - (if bounce_rhs - then (Il.Cell rhs_spill) - else rhs); - put (Il.Binary { b with Il.binary_lhs = (Il.Cell lhs_eax); @@ -344,7 +327,7 @@ let emit_target_specific Il.binary_dst = dst_eax; }); if dst <> dst_eax then mov dst (Il.Cell dst_eax); - + | _ when (Il.Cell dst) <> lhs -> mov dst lhs; put (Il.Binary diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml index 620b27e7e0f..4fe6301217d 100644 --- a/src/boot/me/trans.ml +++ b/src/boot/me/trans.ml @@ -181,7 +181,7 @@ let trans_visitor match q with Il.Jmp _ -> flush_emitter_size_cache(); | _ -> () - end; + end; Il.emit (emitter()) q in diff --git a/src/test/run-pass/arithmetic-interference.rs b/src/test/run-pass/arithmetic-interference.rs deleted file mode 100644 index 588148bb81f..00000000000 --- a/src/test/run-pass/arithmetic-interference.rs +++ /dev/null @@ -1,7 +0,0 @@ -// Testcase for issue #131. - -fn main() -> () { - let int a = 10; - log a; - check (a * (a - 1) == 90); -}