https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100685
Bug ID: 100685
Summary: #pragma GCC push_options ineffective for optimize
options
Product: gcc
Version: 11.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
The #pragma GCC push_options in the program below should prevent the folding of
the strlen() call in g() but doesn't. This has changed in GCC 11 (GCC 10
behaves as expected). The dump shows that the optimize attribute has both
optimization options, -O1 as well as -O2. That also seems unexpected but it
has not changed between 10 and 11.
$ cat a.c && gcc -O0 -S -Wall -fdump-tree-optimized=/dev/stdout a.c
#pragma GCC optimize ("2")
int f (void)
{
const char s[] = "12";
return __builtin_strlen (s); // folded to 1 (good)
}
#pragma GCC push_options
#pragma GCC optimize ("1")
int g (void)
{
const char s[] = "1";
return __builtin_strlen (s); // also folded but shouldn't be
}
;; Function f (f, funcdef_no=0, decl_uid=1943, cgraph_uid=1, symbol_order=0)
__attribute__((optimize ("2")))
int f ()
{
<bb 2> [local count: 1073741824]:
return 2;
}
;; Function g (g, funcdef_no=1, decl_uid=1947, cgraph_uid=2, symbol_order=1)
__attribute__((optimize ("2", "1")))
int g ()
{
<bb 2> [local count: 1073741824]:
return 1;
}