This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH GCC][2/4]Simplify (cond (cmp (convert (x), c1), x, c2)) into (minmax (x, c))


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.

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.cheng@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.cheng@arm.com>

	* gcc.dg/fold-condcmpconv-1.c: New test.
	* gcc.dg/fold-condcmpconv-2.c: New test.

Attachment: 02-simplify-condcmpconv-20161021.txt
Description: 02-simplify-condcmpconv-20161021.txt


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]