[jdk17] RFR: 8269580: assert(is_valid()) failed: invalid register (-1)

Dean Long dlong at openjdk.java.net
Thu Jul 1 08:48:01 UTC 2021


On Thu, 1 Jul 2021 07:33:48 GMT, Jatin Bhateja <jbhateja at openjdk.org> wrote:

>> - Assertion fails during emit phase of rep_stos instruction pattern on targets not supporting AVX512BW feature.
>> - Pattern is selected under following predication logic.
>>  predicate(!((ClearArrayNode*)n)->is_large() &&
>>               (UseAVX <= 2 || !VM_Version::supports_avx512vlbw()));
>> - Encoding block of this pattern passes a  knoreg opmask register having a default encoding of -1,  this later causes an assertion failure while assembling instruction operating over this register. 
>> - Existing pattern rep_stos_evex should be able to handle case for AVX512 targets as instructions operating of opmask registers are anyways guarded by target feature checks.
>
> Hi @sviswa7 , in all the following code paths originating from rep_stos and rep_stos_evex instruction pattern EVEX encoded instructions are guarded by compile time checks, thus it should be safe to remove AVX512BW check from rep_stos and just enable it for UseAVX <= 2.
> - fill64_avx:  Emits 64 byte mode if AVXThreshold=0 and UseAVX > 2 else it disintegrates to two 32 byte vex encoded moves.
> - fill64_masked_avx : Is again guarded by AVX3Threshold = 0 and UseAVX > 2
> - fill32_masked_avx : Guarded by UseAVX > 2 and AVX512VL == true.
> 
> This bug is related to clear operation over small non-constant length.

@jatin-bhateja I see your point.  With your change, the predicates are enough to prevent the assert.  But I noticed an existing issue for both the small and large cases.   The predicates do not prevent some cases where a mask register will be reserved when it isn't really needed.  For example when UseFastStosb is TRUE or UseXMMForObjInit is FALSE.  It seems like a good followup RFE.

-------------

PR: https://git.openjdk.java.net/jdk17/pull/172


More information about the hotspot-compiler-dev mailing list