2011/7/7 Paolo Bonzini <bonz...@gnu.org>: > On 07/07/2011 06:07 PM, Kai Tietz wrote: >> >> + /* We redo folding here one time for allowing to inspect more >> + complex reductions. */ >> + substitute_and_fold (op_with_constant_singleton_value_range, >> + vrp_fold_stmt, false); >> + /* We need to mark this second pass to avoid re-entering of same >> + edges for switch statments. */ >> + in_second_pass = true; >> substitute_and_fold (op_with_constant_singleton_value_range, >> vrp_fold_stmt, false); >> + in_second_pass = false; > > This needs a much better explanation. > > Paolo
Well, I can work on a better comment. The complex reduction I mean here are cases like int x; int y; _Bool D1; _Bool D2; _Bool D3; int R; D1 = x[0..1] != 0; D2 = y[0..1] != 0; D3 = D1 & D2 R = (int) D3 (testcase is already present. See tree-ssa/vrp47.c). As VRP in first pass produces (and replaces) to: D1 = (_Bool) x[0..1]; D2 = (_Bool) y[0..1]; D3 = D1 & D2 R = (int) D3 Just in the second pass the reduction R = x[0..1] & y[0..1] can happen. In general it is sad that VRP can't insert during pass new statements right now. This would cause issues in range-tables, which aren't designed for insertations. As otherwise, we could do also simplify things like D1 = x[0..1] != 0; D2 = y[0..1] == 0; D3 = D1 & D2 R = (int) D3 to R = x[0..1] & (y[0..1] ^ 1) Regards, Kai