https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116458
--- Comment #8 from Alexander Monakov <amonakov at gcc dot gnu.org> ---
Thanks for the reference, but it doesn't help. Something more subtle is going
on, because placing the shift-add combo in a separate function makes Valgrind
properly compute known bits even without the magic flag. Here's a testcase:
__attribute__((noipa))
static int f(short *s)
{
return s[0] + (s[1] << 16);
}
int main()
{
void *p = __builtin_malloc(64);
*(char *)p = 1;
asm("" ::: "memory");
if (!f(p))
__builtin_abort();
}
Compile with gcc -O2 and run under valgrind. Then comment out the attribute,
recompile (gcc will inline the function) and run again — valgrind will complain
==2617== Conditional jump or move depends on uninitialised value(s)
==2617== at 0x10908D: main (t.c:12)