aboutsummaryrefslogtreecommitdiff
path: root/gcc/rtl.c
diff options
context:
space:
mode:
authorliuhongt <hongtao.liu@intel.com>2021-06-01 09:00:57 +0800
committerliuhongt <hongtao.liu@intel.com>2021-06-07 10:25:03 +0800
commit16465ceb06cc1f65cfca3c0eb2c1ee27ab03bdfd (patch)
tree7afa0001810636d4623eff17ba18d988d79b4ac4 /gcc/rtl.c
parent7d6987e90d1181de8dc51f9ba2313052faea080e (diff)
downloadgcc-16465ceb06cc1f65cfca3c0eb2c1ee27ab03bdfd.zip
gcc-16465ceb06cc1f65cfca3c0eb2c1ee27ab03bdfd.tar.gz
gcc-16465ceb06cc1f65cfca3c0eb2c1ee27ab03bdfd.tar.bz2
CALL_INSN may not be a real function call.
Use "used" flag for CALL_INSN to indicate it's a fake call. If it's a fake call, it won't have its own function stack. gcc/ChangeLog PR target/82735 * df-scan.c (df_get_call_refs): When call_insn is a fake call, it won't use stack pointer reg. * final.c (leaf_function_p): When call_insn is a fake call, it won't affect caller as a leaf function. * reg-stack.c (callee_clobbers_any_stack_reg): New. (subst_stack_regs): When call_insn doesn't clobber any stack reg, don't clear the arguments. * rtl.c (shallow_copy_rtx): Don't clear flag used when orig is a insn. * shrink-wrap.c (requires_stack_frame_p): No need for stack frame for a fake call. * rtl.h (FAKE_CALL_P): New macro.
Diffstat (limited to 'gcc/rtl.c')
-rw-r--r--gcc/rtl.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/rtl.c b/gcc/rtl.c
index b0ba1ff..aaee882 100644
--- a/gcc/rtl.c
+++ b/gcc/rtl.c
@@ -395,8 +395,10 @@ shallow_copy_rtx (const_rtx orig MEM_STAT_DECL)
case SCRATCH:
break;
default:
- /* For all other RTXes clear the used flag on the copy. */
- RTX_FLAG (copy, used) = 0;
+ /* For all other RTXes clear the used flag on the copy.
+ CALL_INSN use "used" flag to indicate it's a fake call. */
+ if (!INSN_P (orig))
+ RTX_FLAG (copy, used) = 0;
break;
}
return copy;