Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8368950

RISC-V: fail to catch out of order declarations among dependent cpu extensions/flags

XMLWordPrintable

    • Icon: Enhancement Enhancement
    • Resolution: Unresolved
    • Icon: P4 P4
    • tbd
    • None
    • hotspot

      In https://bugs.openjdk.org/browse/JDK-8352218, we introduced dependency among CPU extensions/flags. And to make sure it works, A needs to be declared before B in RV_FEATURE_FLAGS if B depends on A, for example, A is v, B is Zvfh. So in the pr an assert was introduced to make sure A is before B in RV_FEATURE_FLAGS.
      But the assert does not work as expected, means if I move A below B in RV_FEATURE_FLAGS (check below for a simple patch, it's based on 7853415217cc17179abf2e160ca735c936017f4e), it can not be caught by the assert.

      ```
      diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.hpp b/src/hotspot/cpu/riscv/vm_version_riscv.hpp
      index 4214d6c53dc..80896f8fffc 100644
      --- a/src/hotspot/cpu/riscv/vm_version_riscv.hpp
      +++ b/src/hotspot/cpu/riscv/vm_version_riscv.hpp
      @@ -169,7 +169,6 @@ class VM_Version : public Abstract_VM_Version {
         decl(ext_C , "c" , ('C' - 'A'), true , UPDATE_DEFAULT(UseRVC)) \
         decl(ext_Q , "q" , ('Q' - 'A'), true , NO_UPDATE_DEFAULT) \
         decl(ext_H , "h" , ('H' - 'A'), true , NO_UPDATE_DEFAULT) \
      - decl(ext_V , "v" , ('V' - 'A'), true , UPDATE_DEFAULT(UseRVV)) \
         decl(ext_Zicbom , "Zicbom" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicbom)) \
         decl(ext_Zicboz , "Zicboz" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicboz)) \
         decl(ext_Zicbop , "Zicbop" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicbop)) \
      @@ -193,6 +192,7 @@ class VM_Version : public Abstract_VM_Version {
         decl(ext_Zvbc , "Zvbc" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT_DEP(UseZvbc, ext_V)) \
         decl(ext_Zvfh , "Zvfh" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT_DEP(UseZvfh, ext_V)) \
         decl(ext_Zvkn , "Zvkn" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT_DEP(UseZvkn, ext_V)) \
      + decl(ext_V , "v" , ('V' - 'A'), true , UPDATE_DEFAULT(UseRVV)) \
         decl(ext_Zicond , "Zicond" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZicond)) \
         decl(mvendorid , "VendorId" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
         decl(marchid , "ArchId" , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \
      ```

      If added following patch based on the above patch, we can find out what's going on, it will trigger the assert:
      ```
      # Internal Error (/home/hamlin/workspace/repos/github/jdk-master-tmp-2/src/hotspot/cpu/riscv/vm_version_riscv.hpp:211), pid=430595, tid=430603
      # assert((uintptr_t)(&ext_V) > (uintptr_t)(this)) failed: Invalid: dep: 140361453683696 (v), this: 140361453685240 (Zvbc)
      ```

      ```
      diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.hpp b/src/hotspot/cpu/riscv/vm_version_riscv.hpp
      index 4214d6c53dc..0ba636dce96 100644
      --- a/src/hotspot/cpu/riscv/vm_version_riscv.hpp
      +++ b/src/hotspot/cpu/riscv/vm_version_riscv.hpp
      @@ -90,8 +90,8 @@ class VM_Version : public Abstract_VM_Version {
         void update_flag() { \
             assert(enabled(), "Must be."); \
             /* dep must be declared before */ \
      - assert((uintptr_t)(this) > \
      - (uintptr_t)(&dep), "Invalid");\
      + assert((uintptr_t)(&dep) > \
      + (uintptr_t)(this), "Invalid: dep: %ld (%s), this: %ld (%s)", p2i(&dep), dep.pretty(), p2i(this), pretty()); \
             if (FLAG_IS_DEFAULT(flag)) { \
               if (dep.enabled()) { \
                 FLAG_SET_DEFAULT(flag, true); \
      ```

      But I don't think we can rely on the address of different ext_x to determine their declaration order in RV_FEATURE_FLAGS, even if the patch above can catch it.
      So, we need to figure out another way to catch the out of order declaration in RV_FEATURE_FLAGS.

            mli Hamlin Li
            mli Hamlin Li
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: