8278471: Remove unreached rules in AddNode::IdealIL
Reviewed-by: jiefu, kvn
This commit is contained in:
parent
0dbe4c5d51
commit
f6fbb5a80c
@ -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)"
|
||||
|
@ -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) ) );
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user