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 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 >