if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
{
for (i = 0; i < fp_reg_count; i++)
- if (!TEST_HARD_REG_BIT (crtl->asm_clobbers,
- HARD_FRAME_POINTER_REGNUM + i))
+ if (global_regs[HARD_FRAME_POINTER_REGNUM + i])
+ /* Nothing to do: the register is already treated as live
+ where appropriate, and cannot be eliminated. */
+ ;
+ else if (!TEST_HARD_REG_BIT (crtl->asm_clobbers,
+ HARD_FRAME_POINTER_REGNUM + i))
{
SET_HARD_REG_BIT (eliminable_regset,
HARD_FRAME_POINTER_REGNUM + i);
--- /dev/null
+// { dg-do run { target { ! ia32 } } }
+// { dg-require-effective-target fstack_protector }
+// { dg-options "-O2 -fno-strict-aliasing -msse4.2 -mfpmath=sse -fPIC -fstack-protector-strong -O2" }
+
+struct p2_icode *ipc;
+register int pars asm("r13");
+register struct processor *cur_pro asm("rbp");
+register int a asm("rbx");
+register int c asm("r14");
+typedef long lina_t;
+typedef long la_t;
+typedef processor processor_t;
+typedef p2_icode p2_icode_t;
+typedef enum {
+ P2_Return_Action_Next,
+} p2_return_action_t;
+typedef struct p2_icode {
+ int ic_Parameters;
+} icode_t;
+extern "C" icode_t *x86_log_to_icode_exec(processor_t *, la_t);
+typedef struct {
+ icode_t *ipc;
+} b;
+typedef struct {
+ char ma_thread_signal;
+ int event_counter;
+ b instrumentation;
+} d;
+
+extern "C" lina_t int2linaddr(processor_t *cpu, const p2_icode_t *ic)
+{
+ return 0;
+}
+
+typedef struct e {
+ long i64;
+ char LMA;
+} f;
+
+struct processor {
+ d common;
+ e pc_RIP;
+ f pc_EFER;
+ p2_icode_t *saved_ipc;
+};
+inline la_t code_lin_to_log(processor_t *, long) { return 0; }
+void turbo_clear(processor_t *) {}
+
+p2_return_action_t p2_ep_REBIND_IPC(void)
+{
+ processor_t *cpu = cur_pro;
+ la_t vaddr = cpu->pc_RIP.i64;
+ cur_pro->saved_ipc = (p2_icode_t *) ipc;
+ cur_pro->common.instrumentation.ipc = ipc;
+ cur_pro->pc_RIP.i64 = code_lin_to_log(cur_pro, int2linaddr(cur_pro, ipc));
+ turbo_clear(cur_pro);
+
+ cpu->saved_ipc = x86_log_to_icode_exec(cur_pro, vaddr);
+ ipc++;
+ (cur_pro->common.event_counter -= (1));
+ if (__builtin_expect((!((cur_pro->common.event_counter <= 0)
+ | cur_pro->common.ma_thread_signal)), 1))
+ {
+ ((pars = ((ipc)->ic_Parameters)));
+ return P2_Return_Action_Next;
+ } else {
+ return (p2_return_action_t) 0;
+ }
+ return P2_Return_Action_Next;
+}
+
+struct p2_icode fake_ipc = { 0 };
+struct processor fake_proc ={{ 0 } };
+
+extern "C" icode_t *
+x86_log_to_icode_exec(processor_t *cpu, la_t la)
+{
+ return 0;
+}
+
+extern "C" void
+turbo_threshold_reached(processor_t *c, p2_icode_t *i, int s)
+{
+}
+
+int main()
+{
+ if (!__builtin_cpu_supports ("sse4.2"))
+ return 0;
+ fake_proc.pc_RIP.i64 = 0xbaadc0de;
+ fake_proc.pc_EFER.LMA = 0xf;
+ ipc = &fake_ipc;
+ cur_pro = &fake_proc;
+ p2_ep_REBIND_IPC();
+ return 0;
+}