It looks like Flonum was hiding my bug in on 64-bit systems :x
fix for 32-bit here:

--- a/compile.c
+++ b/compile.c
@@ -5467,7 +5467,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
 		ADD_INSN1(ret, line, setn, INT2FIX(3));
 	    }
 	    flag = VM_CALL_ARGS_SKIP_SETUP;
-	    ADD_SEND_R(ret, line, node->nd_mid, 2, 0, INT2FIX(flag));
+	    ADD_SEND_R(ret, line, node->nd_mid, INT2FIX(2), 0, INT2FIX(flag));
 	    ADD_INSN(ret, line, pop);
 	    break;
 	}

Unfortunately, I still get one failure due to strftime implementation
differences on 32 vs 64-bit:

  1) Failure:
TestRubyOptimization#test_time_opt_str_lit [/home/ew/ruby/test/ruby/test_optimization.rb:406]:
Time#strftime.
<88837> expected but was
<88832>.

I'll have to dig into it later (I'm disappointed that 64-bit needs more
allocations, even).