On Thu, Jul 7, 2011 at 6:28 PM, Kai Tietz <ktiet...@googlemail.com> wrote: > 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]
So why wouldn't that happen during the first pass? The first pass could change the IL to D1 = x[0..1] != 0; D2 = y[0..1] != 0; D3 = D1 & D2; R = x & y; if D3 only has a single use. > 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) Why that ^ 1? And why does that confuse the range tables if you re-use R? > Regards, > Kai >