From 7609f37f07e13970f69914afdba79cbd4de8cd5b Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Fri, 3 Oct 2025 17:51:33 -0700 Subject: [PATCH] forwprop: Refine when TODO_update_address_taken is set [PR122143] As requested in https://inbox.sourceware.org/gcc-patches/CAFiYyc162F+i=majzQqutFcq1y=DtRoJVC4z+V3gP8N7uTnFLA@mail.gmail.com/T/#u. This refines when TODO_update_address_taken is set so it only set when folding of a call. This should speed up compile time slightly if we don't fold a call during the last forwprop. Boostrapped and tested on x86_64-linux-gnu. PR tree-optimization/122143 gcc/ChangeLog: * tree-ssa-forwprop.cc (pass_forwprop::execute): Restrict setting TODO_update_address_taken only when the statement was a call before fold_stmt. Signed-off-by: Andrew Pinski --- gcc/tree-ssa-forwprop.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc index 2c6e1eab9cd..ad09f7334cc 100644 --- a/gcc/tree-ssa-forwprop.cc +++ b/gcc/tree-ssa-forwprop.cc @@ -5451,7 +5451,8 @@ pass_forwprop::execute (function *fun) do { gimple *orig_stmt = stmt = gsi_stmt (gsi); - bool was_noreturn = (is_gimple_call (stmt) + bool was_call = is_gimple_call (stmt); + bool was_noreturn = (was_call && gimple_call_noreturn_p (stmt)); changed = false; @@ -5465,8 +5466,10 @@ pass_forwprop::execute (function *fun) changed = true; /* There is no updating of the address taken after the last forwprop so update - the addresses when a folding happened. */ - if (last_p) + the addresses when a folding happened to a call. + The va_* builtins can remove taking of the address so + can the sincos->cexpi transformation. See PR 39643 and PR 20983. */ + if (was_call && last_p) todoflags |= TODO_update_address_taken; stmt = gsi_stmt (gsi); /* Cleanup the CFG if we simplified a condition to -- 2.47.3