The code computing ranges in PHIs in the path solver reuses the temporary ssa_global_cache by calling its clear method. Calling it on an empty cache causes us to call memset with NULL.
[The testcase doesn't fail without the patch. I suppose it needs some usbsan magic, or to live somewhere else?] Tested on x86-64 Linux. gcc/ChangeLog: PR tree-optimization/103229 * gimple-range-cache.cc (ssa_global_cache::clear): Do not pass null value to memset. gcc/testsuite/ChangeLog: * gcc.dg/pr103229.c: New test. --- gcc/gimple-range-cache.cc | 3 ++- gcc/testsuite/gcc.dg/pr103229.c | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr103229.c diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc index a63e20e7e49..b347edeb474 100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@ -651,7 +651,8 @@ ssa_global_cache::clear_global_range (tree name) void ssa_global_cache::clear () { - memset (m_tab.address(), 0, m_tab.length () * sizeof (irange *)); + if (m_tab.address ()) + memset (m_tab.address(), 0, m_tab.length () * sizeof (irange *)); } // Dump the contents of the global cache to F. diff --git a/gcc/testsuite/gcc.dg/pr103229.c b/gcc/testsuite/gcc.dg/pr103229.c new file mode 100644 index 00000000000..96ef9aff67c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr103229.c @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-options "-O -w" } + +int main() { + int i; + for (; i;) + ; + + return 0; +} -- 2.31.1