------- Comment #9 from vda dot linux at googlemail dot com 2008-08-04 11:34 ------- Created an attachment (id=16011) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=16011&action=view) The instrumented version of the patch
Set $VDA_DEBUG to the name of a file and gcc will append debug printouts to it showing how it deduced value ranges for (a | b) and (a & b). // extract_range_from_binary_expr(OR)[u32] // a integer_nonnegative_range(unsigned int __bid_IDEC_glbflags.40_536)=0 // b integer_nonnegative_range(_IDEC_flags[u32],[16,16])=1 if (a | b) < (16) || (a | b) > (4294967295)) err(); [gcc inferred that since b = 16, (a | b) is always >= 16, despite the fact we do not know value range of a] // extract_range_from_binary_expr(AND)[u32] // a integer_nonnegative_range(unsigned int[u32],[0,4294967295])=1 // b integer_nonnegative_range(_IDEC_round[u32],[1,1])=1 // bits_always_set(0,4294967295)=[u32]0 // bits_always_set(1,1)=[u32]1 // bits_maybe_set(0,4294967295)=[u32]4294967295 // bits_maybe_set(1,1)=[u32]1 if (a & b) < 0 || (a & b) > 1 err(); [a case where both operands had known positive range] -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28632