Message ID | patch-18033-tamar@arm.com |
---|---|
State | New |
Headers | show |
Series | middle-end: prevent LIM from hoising vector compares from gconds if target does not support it. | expand |
On Mon, 27 Nov 2023, Tamar Christina wrote: > Hi All, > > LIM notices that in some cases the condition and the results are loop > invariant and tries to move them out of the loop. > > While the resulting code is operationally sound, moving the compare out of the > gcond results in generating code that no longer branches, so cbranch is no > longer applicable. As such I now add code to check during this motion to see > if the target supports flag setting vector comparison as general operation. > > I have tried writing a GIMPLE testcase for this but the gimple FE seems to be > having some trouble with the vector types. It seems to fail parsing. > > The early break code testsuite however has a test for this > (vect-early-break_67.c). > > Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. > > Ok for master? OK. Thanks, Richard. > Thanks, > Tamar > > gcc/ChangeLog: > > * tree-ssa-loop-im.cc (determine_max_movement): Import insn-codes.h > and optabs-tree.h and check for vector compare motion out of gcond. > > --- inline copy of patch -- > diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc > index 396963b6754c7671e2e5404302a69129918555e2..2ebf6d6548c4858fd5a8b4f9ab6f332f3fe8f6cd 100644 > --- a/gcc/tree-ssa-loop-im.cc > +++ b/gcc/tree-ssa-loop-im.cc > @@ -48,6 +48,8 @@ along with GCC; see the file COPYING3. If not see > #include "tree-dfa.h" > #include "tree-ssa.h" > #include "dbgcnt.h" > +#include "insn-codes.h" > +#include "optabs-tree.h" > > /* TODO: Support for predicated code motion. I.e. > > @@ -852,6 +854,17 @@ determine_max_movement (gimple *stmt, bool must_preserve_exec) > if (!extract_true_false_args_from_phi (dom, phi, NULL, NULL)) > return false; > > + /* Check if one of the depedent statement is a vector compare whether > + the target supports it, otherwise it's invalid to hoist it out of > + the gcond it belonged to. */ > + if (VECTOR_TYPE_P (TREE_TYPE (gimple_cond_lhs (cond)))) > + { > + tree type = TREE_TYPE (gimple_cond_lhs (cond)); > + auto code = gimple_cond_code (cond); > + if (!target_supports_op_p (type, code, optab_vector)) > + return false; > + } > + > /* Fold in dependencies and cost of the condition. */ > FOR_EACH_SSA_TREE_OPERAND (val, cond, iter, SSA_OP_USE) > { > > > > >
--- a/gcc/tree-ssa-loop-im.cc +++ b/gcc/tree-ssa-loop-im.cc @@ -48,6 +48,8 @@ along with GCC; see the file COPYING3. If not see #include "tree-dfa.h" #include "tree-ssa.h" #include "dbgcnt.h" +#include "insn-codes.h" +#include "optabs-tree.h" /* TODO: Support for predicated code motion. I.e. @@ -852,6 +854,17 @@ determine_max_movement (gimple *stmt, bool must_preserve_exec) if (!extract_true_false_args_from_phi (dom, phi, NULL, NULL)) return false; + /* Check if one of the depedent statement is a vector compare whether + the target supports it, otherwise it's invalid to hoist it out of + the gcond it belonged to. */ + if (VECTOR_TYPE_P (TREE_TYPE (gimple_cond_lhs (cond)))) + { + tree type = TREE_TYPE (gimple_cond_lhs (cond)); + auto code = gimple_cond_code (cond); + if (!target_supports_op_p (type, code, optab_vector)) + return false; + } + /* Fold in dependencies and cost of the condition. */ FOR_EACH_SSA_TREE_OPERAND (val, cond, iter, SSA_OP_USE) {