diff options
| author | Takashi Kokubun <takashikkbn@gmail.com> | 2023-11-22 15:13:32 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-22 15:13:32 -0800 |
| commit | 926bfc3bc0cfea976533c8eba8cda1fa298124e2 (patch) | |
| tree | dd1e3e70003a7e7a95839749cbb13bae10816ce9 | |
| parent | 5672fb63d21ca8311513c44a82ffe5a0c8f55240 (diff) | |
YJIT: Avoid a register spill on arm64 (#9014)
| -rw-r--r-- | bootstraptest/test_yjit.rb | 7 | ||||
| -rw-r--r-- | yjit/src/backend/arm64/mod.rs | 2 |
2 files changed, 8 insertions, 1 deletions
diff --git a/bootstraptest/test_yjit.rb b/bootstraptest/test_yjit.rb index a7ef90ba74..f55c319707 100644 --- a/bootstraptest/test_yjit.rb +++ b/bootstraptest/test_yjit.rb @@ -4244,3 +4244,10 @@ assert_equal 'true', %q{ def entry = yield entry { true } } + +assert_normal_exit %q{ + ivars = 1024.times.map { |i| "@iv_#{i} = #{i}\n" }.join + Foo = Class.new + Foo.class_eval "def initialize() #{ivars} end" + Foo.new +} diff --git a/yjit/src/backend/arm64/mod.rs b/yjit/src/backend/arm64/mod.rs index f09a07e571..7cd2449e73 100644 --- a/yjit/src/backend/arm64/mod.rs +++ b/yjit/src/backend/arm64/mod.rs @@ -564,6 +564,7 @@ impl Assembler // If we're attempting to load into a memory operand, then // we'll switch over to the store instruction. (Opnd::Mem(_), _) => { + let opnd0 = split_memory_address(asm, *dest); let value = match *src { // If the first operand is zero, then we can just use // the zero register. @@ -579,7 +580,6 @@ impl Assembler _ => split_bitmask_immediate(asm, *src, dest.rm_num_bits()) }; - let opnd0 = split_memory_address(asm, *dest); asm.store(opnd0, value); }, // If we're loading a memory operand into a register, then |
