On Tue, Apr 18, 2017 at 12:53 PM, Bin Cheng <bin.ch...@arm.com> wrote: > Hi, > Simplification of (T1)(X *+- CST) is already implemented in > aff_combination_expand, > this patch moves it to tree_to_aff_combination. It also supports unsigned > types > if range information allows the transformation, as well as special case > (T1)(X + X). > Is it OK?
Can you first please simply move it? + /* In case X's type has wrapping overflow behavior, we can still + convert (T1)(X - CST) into (T1)X - (T1)CST if X - CST doesn't + overflow by range information. Also Convert (T1)(X + CST) as + if it's (T1)(X - (-CST)). */ + if (TYPE_UNSIGNED (itype) + && TYPE_OVERFLOW_WRAPS (itype) + && TREE_CODE (op0) == SSA_NAME + && TREE_CODE (op1) == INTEGER_CST + && (icode == PLUS_EXPR || icode == MINUS_EXPR) + && get_range_info (op0, &minv, &maxv) == VR_RANGE) + { + if (icode == PLUS_EXPR) + op1 = fold_build1 (NEGATE_EXPR, itype, op1); Negating -INF will produce -INF(OVF) which we don't want to have in our IL, I suggest to use op1 = wide_int_to_tree (itype, wi::neg (op1)); instead. + if (wi::geu_p (minv, op1)) + { + op0 = fold_convert (otype, op0); + op1 = fold_convert (otype, op1); + expr = fold_build2 (MINUS_EXPR, otype, op0, op1); + tree_to_aff_combination (expr, type, comb); + return; + } + } I think this is similar to a part of what Robin Dapp (sp?) is proposing as fix for PR69526? The same trick should work for (int)((unsigned)X - CST) with different overflow checks (you need to make sure the resulting expr does not overflow). Richard. > Thanks, > bin > 2017-04-11 Bin Cheng <bin.ch...@arm.com> > > * tree-affine.c: Include header file. > (aff_combination_expand): Move (T1)(X *+- CST) simplification to ... > (tree_to_aff_combination): ... here. Support (T1)(X + X) case, and > unsigned type case if range information allows.