8321712: C2: "failed: Multiple uses of register" in C2_MacroAssembler::vminmax_fp

Co-authored-by: Volodymyr Paprotski <vpaprotski@openjdk.org>
Reviewed-by: kvn, thartmann, epeter, jbhateja
This commit is contained in:
Sandhya Viswanathan 2024-01-11 16:54:16 +00:00
parent c2e77e2f17
commit e10d14004f
2 changed files with 16 additions and 2 deletions
src/hotspot/cpu/x86
test/hotspot/jtreg/compiler/vectorization/runner

@ -1089,7 +1089,8 @@ void C2_MacroAssembler::vminmax_fp(int opcode, BasicType elem_bt,
assert(opcode == Op_MinV || opcode == Op_MinReductionV ||
opcode == Op_MaxV || opcode == Op_MaxReductionV, "sanity");
assert(elem_bt == T_FLOAT || elem_bt == T_DOUBLE, "sanity");
assert_different_registers(a, b, tmp, atmp, btmp);
assert_different_registers(a, tmp, atmp, btmp);
assert_different_registers(b, tmp, atmp, btmp);
bool is_min = (opcode == Op_MinV || opcode == Op_MinReductionV);
bool is_double_word = is_double_word_type(elem_bt);
@ -1176,7 +1177,8 @@ void C2_MacroAssembler::evminmax_fp(int opcode, BasicType elem_bt,
assert(opcode == Op_MinV || opcode == Op_MinReductionV ||
opcode == Op_MaxV || opcode == Op_MaxReductionV, "sanity");
assert(elem_bt == T_FLOAT || elem_bt == T_DOUBLE, "sanity");
assert_different_registers(dst, a, b, atmp, btmp);
assert_different_registers(dst, a, atmp, btmp);
assert_different_registers(dst, b, atmp, btmp);
bool is_min = (opcode == Op_MinV || opcode == Op_MinReductionV);
bool is_double_word = is_double_word_type(elem_bt);

@ -1,5 +1,6 @@
/*
* Copyright (c) 2022, 2023, Arm Limited. All rights reserved.
* Copyright (c) 2024, 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
@ -237,6 +238,17 @@ public class BasicDoubleOpTest extends VectorizationTestRunner {
return res;
}
@Test
@IR(applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"},
counts = {IRNode.MAX_VD, ">0"})
public double[] vectorMax_8322090() {
double[] res = new double[SIZE];
for (int i = 0; i < SIZE; i++) {
res[i] = Math.max(d[i], d[i]);
}
return res;
}
@Test
@IR(applyIfCPUFeatureOr = {"asimd", "true", "avx", "true"},
counts = {IRNode.MIN_VD, ">0"})