https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93781
--- Comment #4 from vfdff <zhongyunde at huawei dot com> --- according your prompt, I test it base on gcc 7.3, and the second testcase works. --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -3301,6 +3301,18 @@ extract_range_from_binary_expr (value_range *vr, else set_value_range_to_varying (&vr1); + /* the [lr]shift operand with the range of [0, prec-1] */ + if (code == LSHIFT_EXPR || code == RSHIFT_EXPR) + { + value_range shiftp = VR_INITIALIZER; + int prec = TYPE_PRECISION (expr_type); + shiftp.type = VR_RANGE; + shiftp.min = integer_zero_node; + shiftp.max = build_int_cst (expr_type, prec - 1); + + vrp_intersect_ranges (&vr1, &shiftp); + } + ======================================== Visiting statement: _2 = 1 << arg_9; Intersecting ~[3, 4294967294] EQUIVALENCES: { arg_5(D) } (1 elements) and [0, 31] to [0, 2] EQUIVALENCES: { arg_5(D) } (1 elements) Found new range for _2: [1, 4] marking stmt to be not simulated again