[Bug c++/78323] pathological code generation for long logical expression with temporary objects
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Nov 16 09:16:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78323
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |missed-optimization
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-11-16
Version|unknown |6.2.1
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed. It's how we handle lowering the try-finally (testcase with just 3
conditions):
<<cleanup_point return <retval> = (StringEndsWith (fileName, (const struct
nsString &) &TARGET_EXPR <D.2289, <<< Unknown tree: aggr_init_expr
5
__comp_ctor
D.2289
(struct nsString *) <<< Unknown tree: void_cst >>>
(const char *) ".xz" >>>>) || StringEndsWith (fileName, (const struct
nsString &) &TARGET_EXPR <D.2290, <<< Unknown tree: aggr_init_expr
5
__comp_ctor
D.2290
(struct nsString *) <<< Unknown tree: void_cst >>>
(const char *) ".z" >>>>)) || StringEndsWith (fileName, (const struct
nsString &) &TARGET_EXPR <D.2291, <<< Unknown tree: aggr_init_expr
5
__comp_ctor
D.2291
(struct nsString *) <<< Unknown tree: void_cst >>>
(const char *) ".zipx" >>>>)>>;
lowered to
cleanup.1 = 0;
try
{
cleanup.2 = 0;
try
{
cleanup.3 = 0;
try
{
nsString::nsString (&D.2289, ".xz");
cleanup.1 = 1;
D.2301 = StringEndsWith (fileName, &D.2289);
if (D.2301 != 0) goto <D.2295>; else goto <D.2302>;
<D.2302>:
nsString::nsString (&D.2290, ".z");
cleanup.2 = 1;
D.2306 = StringEndsWith (fileName, &D.2290);
if (D.2306 != 0) goto <D.2295>; else goto <D.2307>;
<D.2307>:
nsString::nsString (&D.2291, ".zipx");
cleanup.3 = 1;
D.2311 = StringEndsWith (fileName, &D.2291);
if (D.2311 != 0) goto <D.2295>; else goto <D.2296>;
<D.2295>:
iftmp.0 = 1;
goto <D.2297>;
<D.2296>:
iftmp.0 = 0;
<D.2297>:
D.2293 = iftmp.0;
return D.2293;
}
finally
{
if (cleanup.3 != 0) goto <D.2309>; else goto <D.2310>;
<D.2309>:
nsString::~nsString (&D.2291);
D.2291 = {CLOBBER};
<D.2310>:
}
}
finally
{
if (cleanup.2 != 0) goto <D.2304>; else goto <D.2305>;
<D.2304>:
nsString::~nsString (&D.2290);
D.2290 = {CLOBBER};
<D.2305>:
}
}
finally
{
if (cleanup.1 != 0) goto <D.2299>; else goto <D.2300>;
<D.2299>:
nsString::~nsString (&D.2289);
D.2289 = {CLOBBER};
<D.2300>:
}
}
and in .optimized that looks like
# cleanup.1_7 = PHI <1(6), 1(10), 1(8), 0(2), 1(3), 1(5)>
# cleanup.2_5 = PHI <1(6), 1(10), 1(8), 0(2), 0(3), _17(5)>
<L31>:
__builtin_eh_copy_values (2, 3);
if (cleanup.2_5 != 0)
goto <bb 13>;
else
goto <bb 14>;
<bb 13>:
nsString::~nsString (&D.2290);
D.2290 ={v} {CLOBBER};
<bb 14>:
__builtin_eh_copy_values (1, 2);
if (cleanup.1_7 != 0)
goto <bb 15>;
else
goto <bb 16>;
<bb 15>:
nsString::~nsString (&D.2289);
D.2289 ={v} {CLOBBER};
<bb 16>:
_8 = __builtin_eh_pointer (1);
__builtin_unwind_resume (_8);
<bb 17>:
nsString::~nsString (&D.2291);
D.2291 ={v} {CLOBBER};
<bb 18>:
# iftmp.0_37 = PHI <_20(7), _23(17)>
nsString::~nsString (&D.2290);
D.2290 ={v} {CLOBBER};
goto <bb 11>;
More information about the Gcc-bugs
mailing list