[Bug tree-optimization/28632] VRP should understand bitwise OR and AND
vda dot linux at googlemail dot com
gcc-bugzilla@gcc.gnu.org
Mon Aug 4 11:36:00 GMT 2008
------- 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
More information about the Gcc-bugs
mailing list