[Bug tree-optimization/97605] New: unused conditionally freed allocation not eliminated
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Oct 27 22:25:42 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97605
Bug ID: 97605
Summary: unused conditionally freed allocation not eliminated
Product: gcc
Version: 11.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: ---
In the test program below GCC eliminates the unnecessary pair of malloc/free in
f() but it doesn't perform the likely much more impactful optimization in g()
whose body could be transformed into:
void* g (int i)
{
if (i)
return 0;
return malloc (1);
}
$ cat q.c && gcc -O2 -S -Wall -fdump-tree-optimized=/dev/stdout q.c
typedef __SIZE_TYPE__ size_t;
extern void free (void*);
extern void* malloc (size_t);
void f (int i)
{
void *p = malloc (1); // eliminated
free (p); // ditto
}
void* g (int i)
{
void *p = malloc (1);
if (i)
{
free (p);
return 0;
}
return p;
}
;; Function f (f, funcdef_no=0, decl_uid=1936, cgraph_uid=1, symbol_order=0)
f (int i)
{
<bb 2> [local count: 1073741824]:
return;
}
;; Function g (g, funcdef_no=1, decl_uid=1940, cgraph_uid=2, symbol_order=1)
Removing basic block 5
g (int i)
{
void * p;
void * _1;
<bb 2> [local count: 1073741824]:
p_5 = malloc (1);
if (i_6(D) != 0)
goto <bb 3>; [9.39%]
else
goto <bb 4>; [90.61%]
<bb 3> [local count: 100824360]:
free (p_5);
<bb 4> [local count: 1073741824]:
# _1 = PHI <0B(3), p_5(2)>
return _1;
}
More information about the Gcc-bugs
mailing list