The change for 5108146 added a new test in the deopt blob for x86_64 for use the by 64-bit version of C1. During the time that it was being developed and it's final push register usage in the deopt blob was changed so that now the deopt blob is testing the wrong register.
diff --git a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
@@ -2691,7 +2691,7 @@ void SharedRuntime::generate_deopt_blob(
__ mov(rdi, rax);
- __ cmpl(r12, Deoptimization::Unpack_exception); // Was exception pending?
+ __ cmpl(r14, Deoptimization::Unpack_exception); // Was exception pending?
__ jcc(Assembler::notEqual, noException);
__ movptr(rax, Address(r15_thread, JavaThread::exception_oop_offset()));
// QQQ this is useless it was NULL above
So far for whatever reason r12 never contains the same value as Deoptimization::Unpack_exception when using C2 but it's a bug waiting to happen.