[Bug tree-optimization/19507] New: missed tree-optimization
rguenth at tat dot physik dot uni-tuebingen dot de
gcc-bugzilla@gcc.gnu.org
Tue Jan 18 16:19:00 GMT 2005
The following testcase:
class Flag {
public:
Flag(bool f) : flag(f) {}
bool test() const { return flag; }
private:
const bool flag;
};
void bar(void);
void foo(const Flag& f)
{
if (f.test())
bar();
if (f.test())
bar();
}
Should from my point of view should generate exactly one test
and optimize the redundant one. I miss what could be a not
ill-formed way of bar() modifying Flag::flag.
With mainline -O2 -S -fdump-tree-optimized-vops we get for
t63.optimized:
<bb 0>:
if (f->flag != 0) goto <L1>; else goto <L2>;
<L1>:;
# TMT.2_17 = V_MAY_DEF <TMT.2_15>;
bar ();
<L2>:;
if (f->flag != 0) goto <L4>; else goto <L5>;
<L4>:;
# TMT.2_16 = V_MAY_DEF <TMT.2_14>;
bar () [tail call];
<L5>:;
return;
The RTL optimizers exploit a valid optimization, namely:
_Z3fooRK4Flag:
.LFB6:
pushl %ebx #
.LCFI0:
subl $8, %esp #,
.LCFI1:
movl 16(%esp), %ebx # f, f
cmpb $0, (%ebx) # <variable>.flag
jne .L8 #,
.L6:
addl $8, %esp #,
popl %ebx #
ret
.p2align 4,,7
.L8:
call _Z3barv #
cmpb $0, (%ebx) # <variable>.flag
.p2align 4,,4
je .L6 #,
addl $8, %esp #,
popl %ebx #
jmp _Z3barv #
where you can see we optimized the function into the equivalent of
if (!f.test())
return;
bar();
if (!f.test())
return;
bar();
Who is supposed to apply the corresponding tree optimization here?
Of course, I think it is valid to omit the second test completely
as there is no valid way for bar() to change Flag::flag.
Note that this may be a frontend issue, as to the tree-optimizers
this may be no different than
void foo(const bool& f)
{
if (f)
bar();
if (f)
bar();
}
where there of course are valid ways for bar() to change f.
--
Summary: missed tree-optimization
Product: gcc
Version: 4.0.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: tree-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: rguenth at tat dot physik dot uni-tuebingen dot de
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19507
More information about the Gcc-bugs
mailing list