[Bug tree-optimization/60320] New: Redundant static initialization check
glisse at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Feb 22 20:09:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60320
Bug ID: 60320
Summary: Redundant static initialization check
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: glisse at gcc dot gnu.org
Hello,
I think it would be nice if g++ realized that static variables that have been
initialized don't later on become uninitialized again. A simple example:
extern int e;
static int b(){
static const int a = e;
return a;
}
int g(){
return b()-b();
}
gets "optimized" to:
<bb 2>:
_7 = MEM[(char *)&_ZGVZL1bvE1a];
if (_7 == 0)
goto <bb 3>;
else
goto <bb 9>;
<bb 3>:
_8 = __cxa_guard_acquire (&_ZGVZL1bvE1a);
if (_8 != 0)
goto <bb 5>;
else
goto <bb 4>;
<bb 4>:
pretmp_26 = a;
goto <bb 6>;
<bb 5>:
e.2_9 = e;
a = e.2_9;
__cxa_guard_release (&_ZGVZL1bvE1a);
<bb 6>:
# prephitmp_27 = PHI <e.2_9(5), pretmp_26(4)>
_11 = MEM[(char *)&_ZGVZL1bvE1a];
if (_11 == 0)
goto <bb 7>;
else
goto <bb 9>;
<bb 7>:
_12 = __cxa_guard_acquire (&_ZGVZL1bvE1a);
if (_12 != 0)
goto <bb 8>;
else
goto <bb 9>;
<bb 8>:
e.2_13 = e;
a = e.2_13;
__cxa_guard_release (&_ZGVZL1bvE1a);
pretmp_5 = prephitmp_27 - e.2_13;
<bb 9>:
# prephitmp_3 = PHI <0(6), _12(7), pretmp_5(8), 0(2)>
return prephitmp_3;
There may be a dup but I couldn't find it. It doesn't seem that easy to teach
gcc about it. Maybe LTO-inlining of __cxa_guard_* functions would help (or
not). We could emit _ZGVZL1bvE1a=1 after the release call, but that seems ugly.
We could have special code that, for a MEM_REF[&var42], looks for a dominating
call to __cxa_guard_release(&var42), and in that case asserts it is non-zero
(is that, or a slight variant, valid?).
More information about the Gcc-bugs
mailing list