[Bug middle-end/70879] New: Missed jump threading opportunity with multiple != conditions
ppalka at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Apr 29 16:17:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70879
Bug ID: 70879
Summary: Missed jump threading opportunity with multiple !=
conditions
Product: gcc
Version: 6.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: ppalka at gcc dot gnu.org
Target Milestone: ---
Test case:
void bar (void);
void baz (void);
void
foo (int a)
{
if (a != 5 && a != 10)
bar ();
if (a == 10)
baz ();
}
VRP1 dump:
SSA form after inserting ASSERT_EXPRs
void foo(int) (int a)
{
bool _4;
bool _5;
bool _6;
<bb 2>:
_4 = a_3(D) != 5;
_5 = a_3(D) != 10;
_6 = _4 & _5;
if (_6 != 0)
goto <bb 3>;
else
goto <bb 4>;
<bb 3>:
a_10 = ASSERT_EXPR <a_3(D), a_3(D) != 5>;
a_11 = ASSERT_EXPR <a_10, a_10 != 10>;
bar ();
<bb 4>:
if (a_3(D) == 5)
goto <bb 5>;
else
goto <bb 6>;
<bb 5>:
baz ();
<bb 6>:
return;
}
If bar is called then baz cannot possibly be called so in bb3 we ought to jump
straight to bb6 instead of falling through to bb4.
The problem is that when discovering dominating ASSERT_EXPRs of a_3 we only
look at the immediate uses of a_3 so we use the ASSERT_EXPR a_10 instead of
a_11, but the latter contains more information.
More information about the Gcc-bugs
mailing list