https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90036
--- Comment #20 from Richard Biener <rguenth at gcc dot gnu.org> --- FRE fails here because its simple predication can only record && predicates, not ||: Value numbering stmt = if (_3 != 0) Recording on edge 2->4 _3 ne_expr 0 == true Recording on edge 2->3 _3 ne_expr 0 == false Recording on edge 2->4 _3 eq_expr 0 == false Recording on edge 2->3 _3 eq_expr 0 == true Recording on edge 2->3 _3 lt_expr 0 == false Recording on edge 2->3 _3 gt_expr 0 == false Recording on edge 2->3 _1 eq_expr 0 == true Recording on edge 2->3 _1 ne_expr 0 == false Recording on edge 2->3 _1 lt_expr 0 == false Recording on edge 2->3 _1 gt_expr 0 == false Recording on edge 2->3 vptr_14(D) eq_expr 0 == false Recording on edge 2->3 vptr_14(D) ne_expr 0 == true Recording on edge 2->3 _2 eq_expr 0 == true Recording on edge 2->3 _2 ne_expr 0 == false Recording on edge 2->3 _2 lt_expr 0 == false Recording on edge 2->3 _2 gt_expr 0 == false Recording on edge 2->3 ownvptr_15(D) ne_expr 0 == false Recording on edge 2->3 ownvptr_15(D) eq_expr 0 == true Recording on edge 2->3 ownvptr_15(D) lt_expr 0 == false Recording on edge 2->3 ownvptr_15(D) gt_expr 0 == false But at some point I had some simple attempts at using ranger from VN (when not iterating, and without valueization).
