On Tue, Oct 25, 2016 at 1:21 PM, Bin Cheng <bin.ch...@arm.com> wrote: > Hi, > Second patch optimizing (cond (cmp (convert (x), c1), x, c2)) into (minmax > (x, c)). As commented in patch, this is done if: > > + 1) Comparison's operands are promoted from smaller type. > + 2) Const c1 equals to c2 after canonicalizing comparison. > + 3) Comparison has tree code LT, LE, GT or GE. > + This specific pattern is needed when (cmp (convert x) c) may not > + be simplified by comparison patterns because of multiple uses of > + x. It also makes sense here because simplifying across multiple > + referred var is always benefitial for complicated cases. > > It also adds call to fold_stmt in tree-if-conv.c so that generated cond_expr > statement has its chance to be simplified.
So this sounds like the fold-const.c code. Why only for GIMPLE btw? Thus, can you make sure you covered all cases fold-const.c did and remove the corresponding code there? Thanks, Richard. > Bootstrap and test on x86_64 and AArch64. It introduces below failure on > both x86_64 and AArch64: > FAIL: gcc.dg/vect/slp-cond-3.c > I believe it reveals defect in vect-slp. In call to fold_stmt in ifcvt, > canonicalization transforms _145 = _95 <= _96 ? _149 : _147 into _145 = _95 > > _96 ? _147 : _149. As a result, this stmt has different code to the first > one of SLP instance. IMO, SLP should be improved to handle operands > swapping, apparently, current support is not OK. > > It also introduces more failures on AArch64(probably other targets) as below: > FAIL: gcc.dg/vect/pr65947-1.c -flto -ffat-lto-objects scan-tree-dump-times > vect "LOOP VECTORIZED" 2 > FAIL: gcc.dg/vect/pr65947-1.c -flto -ffat-lto-objects scan-tree-dump-times > vect "condition expression based on integer induction." 4 > FAIL: gcc.dg/vect/pr65947-1.c scan-tree-dump-times vect "LOOP VECTORIZED" 2 > FAIL: gcc.dg/vect/pr65947-1.c scan-tree-dump-times vect "condition expression > based on integer induction." 4 > FAIL: gcc.dg/vect/pr65947-13.c -flto -ffat-lto-objects scan-tree-dump-times > vect "LOOP VECTORIZED" 2 > FAIL: gcc.dg/vect/pr65947-13.c scan-tree-dump-times vect "LOOP VECTORIZED" 2 > FAIL: gcc.dg/vect/pr65947-4.c -flto -ffat-lto-objects scan-tree-dump-times > vect "LOOP VECTORIZED" 2 > FAIL: gcc.dg/vect/pr65947-4.c -flto -ffat-lto-objects scan-tree-dump-times > vect "condition expression based on integer induction." 4 > FAIL: gcc.dg/vect/pr65947-4.c scan-tree-dump-times vect "LOOP VECTORIZED" 2 > FAIL: gcc.dg/vect/pr65947-4.c scan-tree-dump-times vect "condition expression > based on integer induction." 4 > FAIL: gcc.dg/vect/pr77503.c -flto -ffat-lto-objects scan-tree-dump vect > "vectorized 1 loops" > FAIL: gcc.dg/vect/pr77503.c scan-tree-dump vect "vectorized 1 loops" > FAIL: gcc.dg/vect/vect-pr69848.c -flto -ffat-lto-objects scan-tree-dump vect > "vectorized 1 loops" > FAIL: gcc.dg/vect/vect-pr69848.c scan-tree-dump vect "vectorized 1 loops" > Again, these failures reveal a defect in vectorizer that operand swapping is > not supported for COND_REDUCTION. > > I will send another two patches independent to this patch set resolving these > failures. Is this OK? > > Thanks, > bin > > 2016-10-21 Bin Cheng <bin.ch...@arm.com> > > * tree-if-conv.c (ifcvt_follow_ssa_use_edges): New func. > (predicate_scalar_phi): Call fold_stmt using the new valueize func. > * match.pd ((cond (cmp (convert (x), c1), x, c2)) -> (minmax (x, c))): > New pattern. > > gcc/testsuite/ChangeLog > 2016-10-21 Bin Cheng <bin.ch...@arm.com> > > * gcc.dg/fold-condcmpconv-1.c: New test. > * gcc.dg/fold-condcmpconv-2.c: New test.