Doing a suspend check after moving the result into the shadow frame
result_register_ is not safe since result_register_ is not a GC
root. The suspend check is unnecessary since the opcodes that branch
to MterpReturn already do a suspend check.
This could maybe explain one crash for CC that was seen after calling
a getter that had no compiled code.
The extra suspend check appears to only be present on arm64 amd mips64.
Test: test-art-target ART_TEST_INTERPRETER=true
Bug:
33211261
Change-Id: I70b8863f40a25a26f278ac8ef0d57e083b663e0f
b MterpDone
MterpReturn:
ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
- ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
str x0, [x2]
- mov x0, xSELF
- ands lr, lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
- b.eq check2
- bl MterpSuspendCheck // (self)
-check2:
mov x0, #1 // signal return to caller.
MterpDone:
/*
*/
MterpReturn:
ld a2, OFF_FP_RESULT_REGISTER(rFP)
- lw ra, THREAD_FLAGS_OFFSET(rSELF)
sd a0, 0(a2)
- move a0, rSELF
- and ra, ra, THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
- beqzc ra, check2
- jal MterpSuspendCheck # (self)
-check2:
li v0, 1 # signal return to caller.
MterpDone:
/*
b MterpDone
MterpReturn:
ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
- ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
str x0, [x2]
- mov x0, xSELF
- ands lr, lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
- b.eq check2
- bl MterpSuspendCheck // (self)
-check2:
mov x0, #1 // signal return to caller.
MterpDone:
/*
*/
MterpReturn:
ld a2, OFF_FP_RESULT_REGISTER(rFP)
- lw ra, THREAD_FLAGS_OFFSET(rSELF)
sd a0, 0(a2)
- move a0, rSELF
- and ra, ra, THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
- beqzc ra, check2
- jal MterpSuspendCheck # (self)
-check2:
li v0, 1 # signal return to caller.
MterpDone:
/*