]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PHIOPT: Add diamond bb form to factor_out_conditional_conversion
authorAndrew Pinski <apinski@marvell.com>
Wed, 26 Apr 2023 21:55:46 +0000 (14:55 -0700)
committerAndrew Pinski <apinski@marvell.com>
Mon, 8 May 2023 07:36:19 +0000 (00:36 -0700)
So the function factor_out_conditional_conversion already supports
diamond shaped bb forms, just need to be called for such a thing.

harden-cond-comp.c needed to be changed as we would optimize out the
conversion now and that causes the compare hardening not needing to
split the block which it was testing. So change it such that there
would be no chance of optimization.

Also add two testcases that showed the improvement. PR 103771 is
solved in ifconvert also for the vectorizer but now it is solved
in a general sense.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

PR tree-optimization/49959
PR tree-optimization/103771

gcc/ChangeLog:

* tree-ssa-phiopt.cc (pass_phiopt::execute): Support
Diamond shapped bb form for factor_out_conditional_conversion.

gcc/testsuite/ChangeLog:

* c-c++-common/torture/harden-cond-comp.c: Change testcase
slightly to avoid the new phiopt optimization.
* gcc.dg/tree-ssa/abs-2.c: New test.
* gcc.dg/tree-ssa/pr103771.c: New test.

gcc/testsuite/c-c++-common/torture/harden-cond-comp.c
gcc/testsuite/gcc.dg/tree-ssa/abs-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr103771.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.cc

index 5aad890a1d3b6ed0e09cc3b0d841f99a88235a9c..dcf364ee9934fb44b6b619d7f55bf04dd9f474d3 100644 (file)
@@ -1,11 +1,11 @@
 /* { dg-do compile } */
 /* { dg-options "-fharden-conditional-branches -fharden-compares -fdump-tree-hardcbr -fdump-tree-hardcmp -ffat-lto-objects" } */
 
-int f(int i, int j) {
+int f(int i, int j, int k, int l) {
   if (i == 0)
-    return j != 0;
+    return (j != 0) + l;
   else
-    return i * j != 0;
+    return (i * j != 0) * k;
 }
 
 /* { dg-final { scan-tree-dump-times "Splitting edge" 2 "hardcbr" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/abs-2.c b/gcc/testsuite/gcc.dg/tree-ssa/abs-2.c
new file mode 100644 (file)
index 0000000..328b180
--- /dev/null
@@ -0,0 +1,20 @@
+/* PR tree-optimization/49959 */
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-phiopt1-details" } */
+
+#define ABS(X)    (((X)>0)?(X):-(X))
+unsigned long
+test_abs(int *cur)
+{
+  unsigned long sad = 0;
+  if (cur[0] > 0)
+    sad = cur[0];
+  else
+    sad = -cur[0];
+  return sad;
+}
+
+/* We should figure out that test_abs has an ABS_EXPR in it. */
+/* { dg-final { scan-tree-dump " = ABS_EXPR" "phiopt1"} } */
+/* { dg-final { scan-tree-dump-times "changed to factor conversion out from" 1 "phiopt1"} } */
+
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103771.c b/gcc/testsuite/gcc.dg/tree-ssa/pr103771.c
new file mode 100644 (file)
index 0000000..97c9db8
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-phiopt1-details" } */
+/* { dg-final { scan-tree-dump-times "changed to factor conversion out from COND_EXPR." 1 "phiopt1" } } */
+
+typedef unsigned char uint8_t;
+
+static uint8_t x264_clip_uint8 (int x)
+{
+  return x & (~255) ? (-x) >> 31 : x;
+}
+
+void
+mc_weight (uint8_t* __restrict dst, uint8_t* __restrict src,
+          int i_width,int i_scale)
+{
+  for(int x = 0; x < i_width; x++)
+    dst[x] = x264_clip_uint8 (src[x] * i_scale);
+}
index f14b7e8b7e6ff3807eecbea6238bd53954cb9c03..41fea78dc8defebe3995bfc6b95264ce4e57dfec 100644 (file)
@@ -4087,7 +4087,7 @@ pass_phiopt::execute (function *)
 
       gphi *newphi;
       if (single_pred_p (bb1)
-         && !diamond_p
+         && EDGE_COUNT (merge->preds) == 2
          && (newphi = factor_out_conditional_conversion (e1, e2, phi,
                                                          arg0, arg1,
                                                          cond_stmt)))