middle-end/111818 - failed DECL_NOT_GIMPLE_REG_P setting of volatile
commitce55521bcd149fdc431f1d78e706b66d470210ae
authorRichard Biener <rguenther@suse.de>
Mon, 16 Oct 2023 10:50:46 +0000 (16 12:50 +0200)
committerRichard Biener <rguenther@suse.de>
Tue, 17 Oct 2023 06:23:33 +0000 (17 08:23 +0200)
tree94e32f390a504b1e88d4cf781bcd97e95240a92b
parent3aaf704bca3e01c72d9fe6de01ae5416dba6b5db
middle-end/111818 - failed DECL_NOT_GIMPLE_REG_P setting of volatile

The following addresses a missed DECL_NOT_GIMPLE_REG_P setting of
a volatile declared parameter which causes inlining to substitute
a constant parameter into a context where its address is required.

The main issue is in update_address_taken which clears
DECL_NOT_GIMPLE_REG_P from the parameter but fails to rewrite it
because is_gimple_reg returns false for volatiles.  The following
changes maybe_optimize_var to make the 1:1 correspondence between
clearing DECL_NOT_GIMPLE_REG_P of a register typed decl and
actually rewriting it to SSA.

PR middle-end/111818
* tree-ssa.cc (maybe_optimize_var): When clearing
DECL_NOT_GIMPLE_REG_P always rewrite into SSA.

* gcc.dg/torture/pr111818.c: New testcase.
gcc/testsuite/gcc.dg/torture/pr111818.c [new file with mode: 0644]
gcc/tree-ssa.cc