--- a/src/hotspot/share/adlc/formssel.cpp Thu Oct 17 20:27:44 2019 +0100
+++ b/src/hotspot/share/adlc/formssel.cpp Thu Oct 17 20:53:35 2019 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2019, 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
@@ -757,7 +757,6 @@
return NO_MEMORY_OPERAND;
}
-
// This instruction captures the machine-independent bottom_type
// Expected use is for pointer vs oop determination for LoadP
bool InstructForm::captures_bottom_type(FormDict &globals) const {
@@ -774,10 +773,6 @@
!strcmp(_matrule->_rChild->_opType,"CheckCastPP") ||
!strcmp(_matrule->_rChild->_opType,"GetAndSetP") ||
!strcmp(_matrule->_rChild->_opType,"GetAndSetN") ||
-#if INCLUDE_ZGC
- !strcmp(_matrule->_rChild->_opType,"LoadBarrierSlowReg") ||
- !strcmp(_matrule->_rChild->_opType,"LoadBarrierWeakSlowReg") ||
-#endif
#if INCLUDE_SHENANDOAHGC
!strcmp(_matrule->_rChild->_opType,"ShenandoahCompareAndExchangeP") ||
!strcmp(_matrule->_rChild->_opType,"ShenandoahCompareAndExchangeN") ||
@@ -1513,7 +1508,7 @@
MatchNode *mnode =
strcmp(_matrule->_opType, "Set") ? _matrule : _matrule->_rChild;
- mnode->count_instr_names(names);
+ if (mnode != NULL) mnode->count_instr_names(names);
uint first = 1;
// Start with the predicate supplied in the .ad file.
@@ -1726,26 +1721,25 @@
const char *description = NULL;
const char *value = NULL;
// Check if user provided any opcode definitions
- if( this != NULL ) {
- // Update 'value' if user provided a definition in the instruction
- switch (desired_opcode) {
- case PRIMARY:
- description = "primary()";
- if( _primary != NULL) { value = _primary; }
- break;
- case SECONDARY:
- description = "secondary()";
- if( _secondary != NULL ) { value = _secondary; }
- break;
- case TERTIARY:
- description = "tertiary()";
- if( _tertiary != NULL ) { value = _tertiary; }
- break;
- default:
- assert( false, "ShouldNotReachHere();");
- break;
- }
+ // Update 'value' if user provided a definition in the instruction
+ switch (desired_opcode) {
+ case PRIMARY:
+ description = "primary()";
+ if( _primary != NULL) { value = _primary; }
+ break;
+ case SECONDARY:
+ description = "secondary()";
+ if( _secondary != NULL ) { value = _secondary; }
+ break;
+ case TERTIARY:
+ description = "tertiary()";
+ if( _tertiary != NULL ) { value = _tertiary; }
+ break;
+ default:
+ assert( false, "ShouldNotReachHere();");
+ break;
}
+
if (value != NULL) {
fprintf(fp, "(%s /*%s*/)", value, description);
}
@@ -3413,7 +3407,6 @@
// Count occurrences of operands names in the leaves of the instruction
// match rule.
void MatchNode::count_instr_names( Dict &names ) {
- if( this == NULL ) return;
if( _lChild ) _lChild->count_instr_names(names);
if( _rChild ) _rChild->count_instr_names(names);
if( !_lChild && !_rChild ) {
@@ -3506,16 +3499,23 @@
"CompareAndSwapB", "CompareAndSwapS", "CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN",
"WeakCompareAndSwapB", "WeakCompareAndSwapS", "WeakCompareAndSwapI", "WeakCompareAndSwapL", "WeakCompareAndSwapP", "WeakCompareAndSwapN",
"CompareAndExchangeB", "CompareAndExchangeS", "CompareAndExchangeI", "CompareAndExchangeL", "CompareAndExchangeP", "CompareAndExchangeN",
+#if INCLUDE_SHENANDOAHGC
"ShenandoahCompareAndSwapN", "ShenandoahCompareAndSwapP", "ShenandoahWeakCompareAndSwapP", "ShenandoahWeakCompareAndSwapN", "ShenandoahCompareAndExchangeP", "ShenandoahCompareAndExchangeN",
+#endif
"StoreCM",
- "ClearArray",
"GetAndSetB", "GetAndSetS", "GetAndAddI", "GetAndSetI", "GetAndSetP",
"GetAndAddB", "GetAndAddS", "GetAndAddL", "GetAndSetL", "GetAndSetN",
- "LoadBarrierSlowReg", "LoadBarrierWeakSlowReg"
+ "ClearArray"
};
int cnt = sizeof(needs_ideal_memory_list)/sizeof(char*);
if( strcmp(_opType,"PrefetchAllocation")==0 )
return 1;
+ if( strcmp(_opType,"CacheWB")==0 )
+ return 1;
+ if( strcmp(_opType,"CacheWBPreSync")==0 )
+ return 1;
+ if( strcmp(_opType,"CacheWBPostSync")==0 )
+ return 1;
if( _lChild ) {
const char *opType = _lChild->_opType;
for( int i=0; i<cnt; i++ )
@@ -3999,40 +3999,13 @@
}
int MatchRule::is_ideal_copy() const {
- if( _rChild ) {
- const char *opType = _rChild->_opType;
-#if 1
- if( strcmp(opType,"CastIP")==0 )
- return 1;
-#else
- if( strcmp(opType,"CastII")==0 )
- return 1;
- // Do not treat *CastPP this way, because it
- // may transfer a raw pointer to an oop.
- // If the register allocator were to coalesce this
- // into a single LRG, the GC maps would be incorrect.
- //if( strcmp(opType,"CastPP")==0 )
- // return 1;
- //if( strcmp(opType,"CheckCastPP")==0 )
- // return 1;
- //
- // Do not treat CastX2P or CastP2X this way, because
- // raw pointers and int types are treated differently
- // when saving local & stack info for safepoints in
- // Output().
- //if( strcmp(opType,"CastX2P")==0 )
- // return 1;
- //if( strcmp(opType,"CastP2X")==0 )
- // return 1;
-#endif
+ if (is_chain_rule(_AD.globalNames()) &&
+ _lChild && strncmp(_lChild->_opType, "stackSlot", 9) == 0) {
+ return 1;
}
- if( is_chain_rule(_AD.globalNames()) &&
- _lChild && strncmp(_lChild->_opType,"stackSlot",9)==0 )
- return 1;
return 0;
}
-
int MatchRule::is_expensive() const {
if( _rChild ) {
const char *opType = _rChild->_opType;
@@ -4066,6 +4039,7 @@
strcmp(opType,"FmaD") == 0 ||
strcmp(opType,"FmaF") == 0 ||
strcmp(opType,"RoundDouble")==0 ||
+ strcmp(opType,"RoundDoubleMode")==0 ||
strcmp(opType,"RoundFloat")==0 ||
strcmp(opType,"ReverseBytesI")==0 ||
strcmp(opType,"ReverseBytesL")==0 ||
@@ -4194,7 +4168,7 @@
"URShiftVB","URShiftVS","URShiftVI","URShiftVL",
"MaxReductionV", "MinReductionV",
"ReplicateB","ReplicateS","ReplicateI","ReplicateL","ReplicateF","ReplicateD",
- "LoadVector","StoreVector",
+ "RoundDoubleModeV","LoadVector","StoreVector",
"FmaVD", "FmaVF","PopCountVI",
// Next are not supported currently.
"PackB","PackS","PackI","PackL","PackF","PackD","Pack2L","Pack2D",