]> git.ipfire.org Git - thirdparty/gcc.git/commit
Fix SSA_NAME leak due to def_stmt is removed before use_stmt.
authorliuhongt <hongtao.liu@intel.com>
Fri, 12 Jul 2024 01:39:23 +0000 (09:39 +0800)
committerliuhongt <hongtao.liu@intel.com>
Mon, 15 Jul 2024 07:19:50 +0000 (15:19 +0800)
commitf27bf48e0204524ead795fe618cd8b1224f72fd4
tree3dcaf7e67ea4e76403aa7ce179b049821e9c574a
parent681ff5ccca153864eb86099eed201838d8d98bc2
Fix SSA_NAME leak due to def_stmt is removed before use_stmt.

-  _5 = __atomic_fetch_or_8 (&set_work_pending_p, 1, 0);
-  # DEBUG old => (long int) _5
+  _6 = .ATOMIC_BIT_TEST_AND_SET (&set_work_pending_p, 0, 1, 0, __atomic_fetch_or_8);
+  # DEBUG old => NULL
   # DEBUG BEGIN_STMT
-  # DEBUG D#2 => _5 & 1
+  # DEBUG D#2 => NULL
...
-  _10 = ~_5;
-  _8 = (_Bool) _10;
-  # DEBUG ret => _8
+  _8 = _6 == 0;
+  # DEBUG ret => (_Bool) _10

confirmed.  convert_atomic_bit_not does this, it checks for single_use
and removes the def, failing to release the name (which would fix this up
IIRC).

Note the function removes stmts in "wrong" order (before uses of LHS
are removed), so it requires larger surgery.  And it leaks SSA names.

gcc/ChangeLog:

PR target/115872
* tree-ssa-ccp.cc (convert_atomic_bit_not): Remove use_stmt after use_nop_stmt is removed.
(optimize_atomic_bit_test_and): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr115872.c: New test.
gcc/testsuite/gcc.target/i386/pr115872.c [new file with mode: 0644]
gcc/tree-ssa-ccp.cc