This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/21513] [4.0/4.1/4.2 Regression] __builtin_expect getting in the way of uninitialized warnings
- From: "bonzini at gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 17 Dec 2005 10:27:35 -0000
- Subject: [Bug tree-optimization/21513] [4.0/4.1/4.2 Regression] __builtin_expect getting in the way of uninitialized warnings
- References: <bug-21513-10614@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #5 from bonzini at gnu dot org 2005-12-17 10:27 -------
Well, another work around should probably be (untested)
Confirmed, reduced testcase:
void f(void*);
void *g(void);
void _aie_malloc(unsigned int size)
{
void *aie_memory_heap_ptr;
if (__builtin_expect(size != 0, true)
{
aie_memory_heap_ptr = g();
if (__builtin_expect (aie_memory_heap_ptr != 0, 1))
f(aie_memory_heap_ptr);
}
}
This could be fixed also by folding __builtin_expect of &&, ||, and = like
this:
__b_e (a && b, 1) => __b_e (a, 1) && __b_e (b, 1)
__b_e (a && b, 0) => a && __b_e (b, 0)
__b_e (a || b, 1) => a || __b_e (b, 1)
__b_e (a || b, 0) => __b_e (a, 0) || __b_e (b, 0)
__b_e (x, y) => (save_expr (x), __b_e (save_expr (x), y)) (*)
(*) when x has side effects
This could even produce better code (I remember a bug about worse code produced
when putting complex expression within __builtin_expect, but it might be
resolved as of now).
--
bonzini at gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |bonzini at gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21513