On Mon, Oct 30, 2023 at 2:29 AM Richard Biener <richard.guent...@gmail.com> wrote: > > On Sun, Oct 29, 2023 at 5:41 PM Andrew Pinski <pins...@gmail.com> wrote: > > > > This moves the value_replacement support for jump_function_from_stmt > > to match pattern. > > This allows us to optimize things earlier in phiopt1 rather than waiting > > to phiopt2. Which means phiopt1 needs to be disable for vrp03.c testcase. > > > > Bootstrapped and tested on x86_64-linux-gnu. > > Do we need to make sure to only do this after pass_early_object_sizes > at least? IIRC early PHI-opt didn't do value-replacement, so maybe > even after late object-size? There's PROP_objsz, but no > function similar to optimize_vectors_before_lowering_p in > {generic,gimple}-match-head.cc
Let me look into that. But I suspect any which way we might end up with the same issue as the problems you found in PR 112266 really. So I am going to put this patch on the backburner for now (but still look into this and the fall out from PR 112266 ). Thanks, Andrew > > Richard. > > > gcc/ChangeLog: > > > > * match.pd (PTR == 0 ? 0 : &PTR->field): New pattern. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.dg/tree-ssa/vrp03.c: Disable phiopt1. > > * c-c++-common/analyzer/inlining-3-multiline.c: Likewise. > > * c-c++-common/analyzer/inlining-3.c: Likewise. > > * gcc.dg/tree-ssa/phi-opt-value-3.c: New testcase. > > --- > > gcc/match.pd | 21 ++++++++++++++++++ > > .../analyzer/inlining-3-multiline.c | 5 ++++- > > .../c-c++-common/analyzer/inlining-3.c | 3 +++ > > .../gcc.dg/tree-ssa/phi-opt-value-3.c | 22 +++++++++++++++++++ > > gcc/testsuite/gcc.dg/tree-ssa/vrp03.c | 2 +- > > 5 files changed, 51 insertions(+), 2 deletions(-) > > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/phi-opt-value-3.c > > > > diff --git a/gcc/match.pd b/gcc/match.pd > > index 22899c51a2f..9bc945ccada 100644 > > --- a/gcc/match.pd > > +++ b/gcc/match.pd > > @@ -4159,6 +4159,27 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > > (cond (eq @0 integer_zerop) @1 (op@2 @1 @0)) > > @2)) > > > > +/* PTR == 0 ? 0 : &PTR->field -> PTR if field offset was 0. */ > > +(simplify > > + (cond (eq @0 integer_zerop) integer_zerop ADDR_EXPR@1) > > + (with { > > + poly_int64 offset; > > + tree res = NULL_TREE; > > + tree tem = @1; > > + if (TREE_CODE (tem) == SSA_NAME) > > + if (gassign *def = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (tem))) > > + if (gimple_assign_rhs_code (def) == ADDR_EXPR) > > + tem = gimple_assign_rhs1 (def); > > + > > + if (TREE_CODE (tem) == ADDR_EXPR) > > + res = get_addr_base_and_unit_offset (TREE_OPERAND (tem, 0), &offset); > > + } > > + (if (res > > + && TREE_CODE (res) == MEM_REF > > + && known_eq (mem_ref_offset (res) + offset, 0) > > + && operand_equal_p (TREE_OPERAND (res, 0), @0)) > > + (convert @0)))) > > + > > /* Simplifications of shift and rotates. */ > > > > (for rotate (lrotate rrotate) > > diff --git a/gcc/testsuite/c-c++-common/analyzer/inlining-3-multiline.c > > b/gcc/testsuite/c-c++-common/analyzer/inlining-3-multiline.c > > index fbd20e949b6..9741b91abee 100644 > > --- a/gcc/testsuite/c-c++-common/analyzer/inlining-3-multiline.c > > +++ b/gcc/testsuite/c-c++-common/analyzer/inlining-3-multiline.c > > @@ -3,6 +3,9 @@ > > > > /* { dg-additional-options "-O2 -fdiagnostics-show-path-depths" } */ > > /* { dg-additional-options "-fdiagnostics-path-format=inline-events > > -fdiagnostics-show-caret" } */ > > +/* Disable phi-opt1 because get_input_file_name gets optimized to just > > + `return inpf;`. */ > > +/* { dg-additional-options "-fdisable-tree-phiopt1" } */ > > > > #include "../../gcc.dg/analyzer/analyzer-decls.h" > > typedef __SIZE_TYPE__ size_t; > > @@ -96,4 +99,4 @@ test (const input_file *inpf) > > | (4) ...to here > > | (5) argument 1 ('<unknown>') NULL where > > non-null expected > > | > > - { dg-end-multiline-output "" { target c++ } } */ > > \ No newline at end of file > > + { dg-end-multiline-output "" { target c++ } } */ > > diff --git a/gcc/testsuite/c-c++-common/analyzer/inlining-3.c > > b/gcc/testsuite/c-c++-common/analyzer/inlining-3.c > > index 0345585bed2..2b2b4858d45 100644 > > --- a/gcc/testsuite/c-c++-common/analyzer/inlining-3.c > > +++ b/gcc/testsuite/c-c++-common/analyzer/inlining-3.c > > @@ -2,6 +2,9 @@ > > after early inlining. */ > > > > /* { dg-additional-options "-O2 -fdiagnostics-show-path-depths" } */ > > +/* Disable phi-opt1 because get_input_file_name gets optimized to just > > + `return inpf;`. */ > > +/* { dg-additional-options "-fdisable-tree-phiopt1" } */ > > > > #include "../../gcc.dg/analyzer/analyzer-decls.h" > > typedef __SIZE_TYPE__ size_t; > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-value-3.c > > b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-value-3.c > > new file mode 100644 > > index 00000000000..ad55bd288b9 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-value-3.c > > @@ -0,0 +1,22 @@ > > +/* { dg-do compile } */ > > +/* { dg-options "-O1 -fdump-tree-optimized" } */ > > +struct a > > +{ > > + int b[1]; > > +}; > > + > > +int call1(int *a); > > + > > +int f(struct a *b) > > +{ > > + int *c = b->b; > > + int t = call1(c); > > + int *d; > > + if (b) d = b->b; else d = 0; > > + int t1 = call1(d); > > + return t+t1; > > +} > > + > > +/* There should be no if statement and 2 calls to call1. */ > > +/* { dg-final { scan-tree-dump-not "if " "optimized" } } */ > > +/* { dg-final { scan-tree-dump-times "call1 " 2 "optimized" } } */ > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c > > b/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c > > index 4cbaca41332..1adbf33cad3 100644 > > --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c > > +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 > > -fno-thread-jumps" } */ > > +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 > > -fno-thread-jumps -fdisable-tree-phiopt1" } */ > > > > struct A > > { > > -- > > 2.39.3 > >