8278471: Remove unreached rules in AddNode::IdealIL

Reviewed-by: jiefu, kvn
This commit is contained in:
Zhiqiang Zang 2021-12-16 03:57:29 +00:00 committed by Jie Fu
parent 0dbe4c5d51
commit f6fbb5a80c
4 changed files with 86 additions and 10 deletions

View File

@ -302,16 +302,6 @@ Node* AddNode::IdealIL(PhaseGVN* phase, bool can_reshape, BasicType bt) {
assert(in1->in(1) != this && in2->in(1) != this,"dead loop in AddINode::Ideal/AddLNode::Ideal");
return AddNode::make(in1->in(1), in2->in(1), bt);
}
// Convert "(a-b)+(b-c)" into "(a-c)"
if (op2 == Op_Sub(bt) && in1->in(2) == in2->in(1)) {
assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddINode::Ideal/AddLNode::Ideal");
return SubNode::make(in1->in(1), in2->in(2), bt);
}
// Convert "(a-b)+(c-a)" into "(c-b)"
if (op2 == Op_Sub(bt) && in1->in(1) == in2->in(2)) {
assert(in1->in(2) != this && in2->in(1) != this,"dead loop in AddINode::Ideal/AddLNode::Ideal");
return SubNode::make(in2->in(1), in1->in(2), bt);
}
}
// Convert "x+(0-y)" into "(x-y)"

View File

@ -435,6 +435,14 @@ Node *SubLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
if( op1 == Op_AddL && op2 == Op_AddL && in1->in(2) == in2->in(2) )
return new SubLNode( in1->in(1), in2->in(1) );
// Convert "(A+X) - (X+B)" into "A - B"
if( op1 == Op_AddL && op2 == Op_AddL && in1->in(2) == in2->in(1) )
return new SubLNode( in1->in(1), in2->in(2) );
// Convert "(X+A) - (B+X)" into "A - B"
if( op1 == Op_AddL && op2 == Op_AddL && in1->in(1) == in2->in(2) )
return new SubLNode( in1->in(2), in2->in(1) );
// Convert "A-(B-C)" into (A+C)-B"
if( op2 == Op_SubL && in2->outcnt() == 1) {
Node *add1 = phase->transform( new AddLNode( in1, in2->in(2) ) );

View File

@ -0,0 +1,76 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package compiler.c2.irTests;
import jdk.test.lib.Asserts;
import compiler.lib.ir_framework.*;
/*
* @test
* @bug 8278471
* @summary Remove unreached rules in AddNode::IdealIL
* @library /test/lib /
* @run driver compiler.c2.irTests.TestSpecialCasesOf_AMinusB_Plus_CMinusD_InAddIdeal
*/
/* Test conversion from (a - b) + (b - c) to (a - c) and conversion
* from (a - b) + (c - a) to (c - b) have really happened so we can
* safely remove both. */
public class TestSpecialCasesOf_AMinusB_Plus_CMinusD_InAddIdeal {
public static void main(String[] args) {
TestFramework.run();
}
@Test
@Arguments({Argument.RANDOM_ONCE, Argument.RANDOM_ONCE, Argument.RANDOM_ONCE})
@IR(failOn = {IRNode.ADD_I})
@IR(counts = {IRNode.SUB_I, "1"})
public int test1Int(int a, int b, int c) {
return (a - b) + (b - c); // transformed to a - c rather than (a + b) - (b + c)
}
@Test
@Arguments({Argument.RANDOM_ONCE, Argument.RANDOM_ONCE, Argument.RANDOM_ONCE})
@IR(failOn = {IRNode.ADD_L})
@IR(counts = {IRNode.SUB_L, "1"})
public long test1Long(long a, long b, long c) {
return (a - b) + (b - c); // transformed to a - c rather than (a + b) - (b + c)
}
@Test
@Arguments({Argument.RANDOM_ONCE, Argument.RANDOM_ONCE, Argument.RANDOM_ONCE})
@IR(failOn = {IRNode.ADD_I})
@IR(counts = {IRNode.SUB_I, "1"})
public int test2Int(int b, int a, int c) { // make sure inputs sorted
return (a - b) + (c - a); // transformed to c - b rather than (a + c) - (b + a)
}
@Test
@Arguments({Argument.RANDOM_ONCE, Argument.RANDOM_ONCE, Argument.RANDOM_ONCE})
@IR(failOn = {IRNode.ADD_L})
@IR(counts = {IRNode.SUB_L, "1"})
public long test2Long(long b, long a, long c) { // make sure inputs sorted
return (a - b) + (c - a); // transformed to return c - b rather than (a + c) - (b + a)
}
}

View File

@ -139,6 +139,8 @@ public class IRNode {
public static final String LSHIFT_L = START + "LShiftL" + MID + END;
public static final String ADD_I = START + "AddI" + MID + END;
public static final String ADD_L = START + "AddL" + MID + END;
public static final String SUB_I = START + "SubI" + MID + END;
public static final String SUB_L = START + "SubL" + MID + END;
public static final String CONV_I2L = START + "ConvI2L" + MID + END;
public static final String VECTOR_CAST_B2X = START + "VectorCastB2X" + MID + END;