8223140: Clean-up in 'ok_to_convert()'

Simplify logic in function. Added precond/postcond macros.

Reviewed-by: vlivanov, neliasso
This commit is contained in:
Patric Hedlin 2019-04-17 14:55:11 +02:00
parent ceef0f69dc
commit f4faee7bae
4 changed files with 42 additions and 37 deletions

View File

@ -42,17 +42,13 @@
#include "opto/superword.hpp"
//=============================================================================
//------------------------------is_loop_iv-------------------------------------
// Determine if a node is Counted loop induction variable.
// The method is declared in node.hpp.
const Node* Node::is_loop_iv() const {
if (this->is_Phi() && !this->as_Phi()->is_copy() &&
this->as_Phi()->region()->is_CountedLoop() &&
this->as_Phi()->region()->as_CountedLoop()->phi() == this) {
return this;
} else {
return NULL;
}
//--------------------------is_cloop_ind_var-----------------------------------
// Determine if a node is a counted loop induction variable.
// NOTE: The method is declared in "node.hpp".
bool Node::is_cloop_ind_var() const {
return (is_Phi() && !as_Phi()->is_copy() &&
as_Phi()->region()->is_CountedLoop() &&
as_Phi()->region()->as_CountedLoop()->phi() == this);
}
//=============================================================================

View File

@ -1007,9 +1007,9 @@ public:
// value, if it appears (by local graph inspection) to be computed by a simple conditional.
bool is_iteratively_computed();
// Determine if a node is Counted loop induction variable.
// The method is defined in loopnode.cpp.
const Node* is_loop_iv() const;
// Determine if a node is a counted loop induction variable.
// NOTE: The method is defined in "loopnode.cpp".
bool is_cloop_ind_var() const;
// Return a node with opcode "opc" and same inputs as "this" if one can
// be found; Otherwise return NULL;

View File

@ -114,31 +114,37 @@ const Type* SubNode::Value(PhaseGVN* phase) const {
}
//=============================================================================
//------------------------------Helper function--------------------------------
static bool ok_to_convert(Node* inc, Node* iv) {
// Do not collapse (x+c0)-y if "+" is a loop increment, because the
// "-" is loop invariant and collapsing extends the live-range of "x"
// to overlap with the "+", forcing another register to be used in
// the loop.
// This test will be clearer with '&&' (apply DeMorgan's rule)
// but I like the early cutouts that happen here.
const PhiNode *phi;
if( ( !inc->in(1)->is_Phi() ||
!(phi=inc->in(1)->as_Phi()) ||
phi->is_copy() ||
!phi->region()->is_CountedLoop() ||
inc != phi->region()->as_CountedLoop()->incr() )
&&
// Do not collapse (x+c0)-iv if "iv" is a loop induction variable,
// because "x" maybe invariant.
( !iv->is_loop_iv() )
) {
return true;
} else {
return false;
}
static bool is_cloop_increment(Node* inc) {
precond(inc->Opcode() == Op_AddI || inc->Opcode() == Op_AddL);
if (!inc->in(1)->is_Phi()) {
return false;
}
const PhiNode* phi = inc->in(1)->as_Phi();
if (phi->is_copy() || !phi->region()->is_CountedLoop()) {
return false;
}
return inc == phi->region()->as_CountedLoop()->incr();
}
// Given the expression '(x + C) - v', or
// 'v - (x + C)', we examine nodes '+' and 'v':
//
// 1. Do not convert if '+' is a counted-loop increment, because the '-' is
// loop invariant and converting extends the live-range of 'x' to overlap
// with the '+', forcing another register to be used in the loop.
//
// 2. Do not convert if 'v' is a counted-loop induction variable, because
// 'x' might be invariant.
//
static bool ok_to_convert(Node* inc, Node* var) {
return !(is_cloop_increment(inc) || var->is_cloop_ind_var());
}
//------------------------------Ideal------------------------------------------
Node *SubINode::Ideal(PhaseGVN *phase, bool can_reshape){
Node *in1 = in(1);

View File

@ -63,6 +63,9 @@ do { \
// For backward compatibility.
#define assert(p, ...) vmassert(p, __VA_ARGS__)
#define precond(p) assert(p, "precond")
#define postcond(p) assert(p, "postcond")
#ifndef ASSERT
#define vmassert_status(p, status, msg)
#else