https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92412
Bug ID: 92412
Summary: excessive errno aliasing assumption defeats
optimization
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
GCC folds to false the test for a's contents in f() below but it doesn't do the
same in g(). It appears to be caused by the call to strlen which, when being
optimized by the strlen pass, triggers a call to GCC's
default_ref_may_alias_errno(). Although the default_ref_may_alias_errno()
function called to determine whether errno can alias a variable returns false
for static variables defined in the same translation unit it returns true for
local variables like a.
Other compilers (Clang and Visual C/C++) fold the tests in both functions to
false.
$ cat b.c && gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout b.c
void* f (void)
{
const char a[] = "123";
void *p = __builtin_malloc (sizeof a);
if (a[0] != '1' || a[1] != '2' || a[2] != '3' || a[3] != '\0') // folded to
false
__builtin_abort ();
return p;
}
void* g (void)
{
const char a[] = "123";
void *p = __builtin_malloc (__builtin_strlen (a) + 1);
if (a[0] != '1' || a[1] != '2' || a[2] != '3' || a[3] != '\0') // not
folded
__builtin_abort ();
return p;
}
;; Function f (f, funcdef_no=0, decl_uid=1930, cgraph_uid=1, symbol_order=0)
f ()
{
void * p;
<bb 2> [local count: 1073741824]:
p_3 = __builtin_malloc (4); [tail call]
return p_3;
}
;; Function g (g, funcdef_no=1, decl_uid=1935, cgraph_uid=2, symbol_order=1)
Removing basic block 8
Removing basic block 9
Removing basic block 10
Removing basic block 11
g ()
{
void * p;
const char a[4];
char _3;
char _4;
char _5;
char _6;
<bb 2> [local count: 1073741824]:
a = "123";
p_10 = __builtin_malloc (4);
_3 = a[0];
if (_3 != 49)
goto <bb 6>; [0.00%]
else
goto <bb 3>; [100.00%]
<bb 3> [local count: 1073741824]:
_4 = a[1];
if (_4 != 50)
goto <bb 6>; [0.00%]
else
goto <bb 4>; [100.00%]
<bb 4> [local count: 1073741824]:
_5 = a[2];
if (_5 != 51)
goto <bb 6>; [0.00%]
else
goto <bb 5>; [100.00%]
<bb 5> [local count: 1073741824]:
_6 = a[3];
if (_6 != 0)
goto <bb 6>; [0.00%]
else
goto <bb 7>; [100.00%]
<bb 6> [count: 0]:
__builtin_abort ();
<bb 7> [local count: 1073741824]:
a ={v} {CLOBBER};
return p_10;
}