[Git][ghc/ghc][wip/drop-long-reg] cmm: Drop LongReg GlobalRegs

Ben Gamari (@bgamari) gitlab at gitlab.haskell.org
Tue Oct 18 16:27:16 UTC 2022



Ben Gamari pushed to branch wip/drop-long-reg at Glasgow Haskell Compiler / GHC


Commits:
3fd62e9a by Ben Gamari at 2022-10-18T12:27:03-04:00
cmm: Drop LongReg GlobalRegs

This register is not mapped to a machine register on any platform that
we currently support. Consequently, it doesn't really make sense to
carry around the infrastructure for this register.

- - - - -


13 changed files:

- compiler/CodeGen.Platform.h
- compiler/GHC/Cmm/CallConv.hs
- compiler/GHC/Cmm/Lexer.x
- compiler/GHC/Cmm/Reg.hs
- compiler/GHC/CmmToC.hs
- compiler/GHC/CmmToLlvm/Regs.hs
- compiler/GHC/StgToCmm/CgUtils.hs
- rts/HeapStackCheck.cmm
- rts/StgMiscClosures.cmm
- rts/include/stg/MachRegs.h
- rts/include/stg/Regs.h
- utils/deriveConstants/Main.hs
- utils/genapply/Main.hs


Changes:

=====================================
compiler/CodeGen.Platform.h
=====================================
@@ -449,9 +449,6 @@ callerSaves (DoubleReg 5)     = True
 #if defined(CALLER_SAVES_D6)
 callerSaves (DoubleReg 6)     = True
 #endif
-#if defined(CALLER_SAVES_L1)
-callerSaves (LongReg 1)       = True
-#endif
 #if defined(CALLER_SAVES_Sp)
 callerSaves Sp                = True
 #endif
@@ -797,12 +794,6 @@ globalRegMaybe (ZmmReg 6)               = Just (RealRegSingle REG_ZMM6)
 # if defined(REG_Sp)
 globalRegMaybe Sp                       = Just (RealRegSingle REG_Sp)
 # endif
-# if defined(REG_Lng1)
-globalRegMaybe (LongReg 1)              = Just (RealRegSingle REG_Lng1)
-# endif
-# if defined(REG_Lng2)
-globalRegMaybe (LongReg 2)              = Just (RealRegSingle REG_Lng2)
-# endif
 # if defined(REG_SpLim)
 globalRegMaybe SpLim                    = Just (RealRegSingle REG_SpLim)
 # endif


=====================================
compiler/GHC/Cmm/CallConv.hs
=====================================
@@ -68,29 +68,27 @@ assignArgumentsPos profile off conv arg_ty reps = (stk_off, assignments)
                                     | isFloatType ty = float
                                     | otherwise      = int
         where vec = case (w, regs) of
-                      (W128, (vs, fs, ds, ls, s:ss))
-                          | passVectorInReg W128 profile -> k (RegisterParam (XmmReg s), (vs, fs, ds, ls, ss))
-                      (W256, (vs, fs, ds, ls, s:ss))
-                          | passVectorInReg W256 profile -> k (RegisterParam (YmmReg s), (vs, fs, ds, ls, ss))
-                      (W512, (vs, fs, ds, ls, s:ss))
-                          | passVectorInReg W512 profile -> k (RegisterParam (ZmmReg s), (vs, fs, ds, ls, ss))
+                      (W128, (vs, fs, ds, s:ss))
+                          | passVectorInReg W128 profile -> k (RegisterParam (XmmReg s), (vs, fs, ds, ss))
+                      (W256, (vs, fs, ds, s:ss))
+                          | passVectorInReg W256 profile -> k (RegisterParam (YmmReg s), (vs, fs, ds, ss))
+                      (W512, (vs, fs, ds, s:ss))
+                          | passVectorInReg W512 profile -> k (RegisterParam (ZmmReg s), (vs, fs, ds, ss))
                       _ -> (assts, (r:rs))
               float = case (w, regs) of
-                        (W32, (vs, fs, ds, ls, s:ss))
-                            | passFloatInXmm          -> k (RegisterParam (FloatReg s), (vs, fs, ds, ls, ss))
-                        (W32, (vs, f:fs, ds, ls, ss))
-                            | not passFloatInXmm      -> k (RegisterParam f, (vs, fs, ds, ls, ss))
-                        (W64, (vs, fs, ds, ls, s:ss))
-                            | passFloatInXmm          -> k (RegisterParam (DoubleReg s), (vs, fs, ds, ls, ss))
-                        (W64, (vs, fs, d:ds, ls, ss))
-                            | not passFloatInXmm      -> k (RegisterParam d, (vs, fs, ds, ls, ss))
+                        (W32, (vs, fs, ds, s:ss))
+                            | passFloatInXmm          -> k (RegisterParam (FloatReg s), (vs, fs, ds, ss))
+                        (W32, (vs, f:fs, ds, ss))
+                            | not passFloatInXmm      -> k (RegisterParam f, (vs, fs, ds, ss))
+                        (W64, (vs, fs, ds, s:ss))
+                            | passFloatInXmm          -> k (RegisterParam (DoubleReg s), (vs, fs, ds, ss))
+                        (W64, (vs, fs, d:ds, ss))
+                            | not passFloatInXmm      -> k (RegisterParam d, (vs, fs, ds, ss))
                         _ -> (assts, (r:rs))
               int = case (w, regs) of
                       (W128, _) -> panic "W128 unsupported register type"
-                      (_, (v:vs, fs, ds, ls, ss)) | widthInBits w <= widthInBits (wordWidth platform)
-                          -> k (RegisterParam (v gcp), (vs, fs, ds, ls, ss))
-                      (_, (vs, fs, ds, l:ls, ss)) | widthInBits w > widthInBits (wordWidth platform)
-                          -> k (RegisterParam l, (vs, fs, ds, ls, ss))
+                      (_, (v:vs, fs, ds, ss)) | widthInBits w <= widthInBits (wordWidth platform)
+                          -> k (RegisterParam (v gcp), (vs, fs, ds, ss))
                       _   -> (assts, (r:rs))
               k (asst, regs') = assign_regs ((r, asst) : assts) rs regs'
               ty = arg_ty r
@@ -134,7 +132,6 @@ assignStack platform offset arg_ty args = assign_stk offset [] (reverse args)
 type AvailRegs = ( [VGcPtr -> GlobalReg]   -- available vanilla regs.
                  , [GlobalReg]   -- floats
                  , [GlobalReg]   -- doubles
-                 , [GlobalReg]   -- longs (int64 and word64)
                  , [Int]         -- XMM (floats and doubles)
                  )
 
@@ -149,7 +146,6 @@ getRegsWithoutNode platform =
   ( filter (\r -> r VGcPtr /= node) (realVanillaRegs platform)
   , realFloatRegs platform
   , realDoubleRegs platform
-  , realLongRegs platform
   , realXmmRegNos platform)
 
 -- getRegsWithNode uses R1/node even if it isn't a register
@@ -159,26 +155,23 @@ getRegsWithNode platform =
     else realVanillaRegs platform
   , realFloatRegs platform
   , realDoubleRegs platform
-  , realLongRegs platform
   , realXmmRegNos platform)
 
-allFloatRegs, allDoubleRegs, allLongRegs :: Platform -> [GlobalReg]
+allFloatRegs, allDoubleRegs :: Platform -> [GlobalReg]
 allVanillaRegs :: Platform -> [VGcPtr -> GlobalReg]
 allXmmRegs :: Platform -> [Int]
 
 allVanillaRegs platform = map VanillaReg $ regList (pc_MAX_Vanilla_REG (platformConstants platform))
 allFloatRegs   platform = map FloatReg   $ regList (pc_MAX_Float_REG   (platformConstants platform))
 allDoubleRegs  platform = map DoubleReg  $ regList (pc_MAX_Double_REG  (platformConstants platform))
-allLongRegs    platform = map LongReg    $ regList (pc_MAX_Long_REG    (platformConstants platform))
 allXmmRegs     platform =                  regList (pc_MAX_XMM_REG     (platformConstants platform))
 
-realFloatRegs, realDoubleRegs, realLongRegs :: Platform -> [GlobalReg]
+realFloatRegs, realDoubleRegs :: Platform -> [GlobalReg]
 realVanillaRegs :: Platform -> [VGcPtr -> GlobalReg]
 
 realVanillaRegs platform = map VanillaReg $ regList (pc_MAX_Real_Vanilla_REG (platformConstants platform))
 realFloatRegs   platform = map FloatReg   $ regList (pc_MAX_Real_Float_REG   (platformConstants platform))
 realDoubleRegs  platform = map DoubleReg  $ regList (pc_MAX_Real_Double_REG  (platformConstants platform))
-realLongRegs    platform = map LongReg    $ regList (pc_MAX_Real_Long_REG    (platformConstants platform))
 
 realXmmRegNos :: Platform -> [Int]
 realXmmRegNos platform
@@ -192,12 +185,11 @@ allRegs :: Platform -> AvailRegs
 allRegs platform = ( allVanillaRegs platform
                    , allFloatRegs   platform
                    , allDoubleRegs  platform
-                   , allLongRegs    platform
                    , allXmmRegs     platform
                    )
 
 nodeOnly :: AvailRegs
-nodeOnly = ([VanillaReg 1], [], [], [], [])
+nodeOnly = ([VanillaReg 1], [], [], [])
 
 -- This returns the set of global registers that *cover* the machine registers
 -- used for argument passing. On platforms where registers can overlap---right
@@ -208,7 +200,6 @@ realArgRegsCover :: Platform -> [GlobalReg]
 realArgRegsCover platform
     | passFloatArgsInXmm platform
     = map ($ VGcPtr) (realVanillaRegs platform) ++
-      realLongRegs platform ++
       realDoubleRegs platform -- we only need to save the low Double part of XMM registers.
                               -- Moreover, the NCG can't load/store full XMM
                               -- registers for now...
@@ -216,8 +207,7 @@ realArgRegsCover platform
     | otherwise
     = map ($ VGcPtr) (realVanillaRegs platform) ++
       realFloatRegs  platform ++
-      realDoubleRegs platform ++
-      realLongRegs   platform
+      realDoubleRegs platform
       -- we don't save XMM registers if they are not used for parameter passing
 
 -- Like realArgRegsCover but always includes the node. This covers the real


=====================================
compiler/GHC/Cmm/Lexer.x
=====================================
@@ -103,7 +103,6 @@ $white_no_nl+           ;
   R at decimal             { global_regN (\n -> VanillaReg n VNonGcPtr) }
   F at decimal             { global_regN FloatReg }
   D at decimal             { global_regN DoubleReg }
-  L at decimal             { global_regN LongReg }
   Sp                    { global_reg Sp }
   SpLim                 { global_reg SpLim }
   Hp                    { global_reg Hp }


=====================================
compiler/GHC/Cmm/Reg.hs
=====================================
@@ -142,9 +142,6 @@ data GlobalReg
   | DoubleReg           -- double-precision floating-point registers
         {-# UNPACK #-} !Int     -- its number
 
-  | LongReg             -- long int registers (64-bit, really)
-        {-# UNPACK #-} !Int     -- its number
-
   | XmmReg                      -- 128-bit SIMD vector register
         {-# UNPACK #-} !Int     -- its number
 
@@ -197,7 +194,6 @@ instance Eq GlobalReg where
    VanillaReg i _ == VanillaReg j _ = i==j -- Ignore type when seeking clashes
    FloatReg i == FloatReg j = i==j
    DoubleReg i == DoubleReg j = i==j
-   LongReg i == LongReg j = i==j
    -- NOTE: XMM, YMM, ZMM registers actually are the same registers
    -- at least with respect to store at YMM i and then read from XMM i
    -- and similarly for ZMM etc.
@@ -228,7 +224,6 @@ instance Ord GlobalReg where
      -- Ignore type when seeking clashes
    compare (FloatReg i)  (FloatReg  j) = compare i j
    compare (DoubleReg i) (DoubleReg j) = compare i j
-   compare (LongReg i)   (LongReg   j) = compare i j
    compare (XmmReg i)    (XmmReg    j) = compare i j
    compare (YmmReg i)    (YmmReg    j) = compare i j
    compare (ZmmReg i)    (ZmmReg    j) = compare i j
@@ -253,8 +248,6 @@ instance Ord GlobalReg where
    compare _ (FloatReg _)     = GT
    compare (DoubleReg _) _    = LT
    compare _ (DoubleReg _)    = GT
-   compare (LongReg _) _      = LT
-   compare _ (LongReg _)      = GT
    compare (XmmReg _) _       = LT
    compare _ (XmmReg _)       = GT
    compare (YmmReg _) _       = LT
@@ -305,7 +298,6 @@ pprGlobalReg gr
 --        VanillaReg n VGcPtr    -> char 'P' <> int n
         FloatReg   n   -> char 'F' <> int n
         DoubleReg  n   -> char 'D' <> int n
-        LongReg    n   -> char 'L' <> int n
         XmmReg     n   -> text "XMM" <> int n
         YmmReg     n   -> text "YMM" <> int n
         ZmmReg     n   -> text "ZMM" <> int n
@@ -349,7 +341,6 @@ globalRegType platform = \case
    (VanillaReg _ VNonGcPtr) -> bWord platform
    (FloatReg _)             -> cmmFloat W32
    (DoubleReg _)            -> cmmFloat W64
-   (LongReg _)              -> cmmBits W64
    -- TODO: improve the internal model of SIMD/vectorized registers
    -- the right design SHOULd improve handling of float and double code too.
    -- see remarks in Note [SIMD Design for the future] in GHC.StgToCmm.Prim
@@ -365,7 +356,6 @@ isArgReg :: GlobalReg -> Bool
 isArgReg (VanillaReg {}) = True
 isArgReg (FloatReg {})   = True
 isArgReg (DoubleReg {})  = True
-isArgReg (LongReg {})    = True
 isArgReg (XmmReg {})     = True
 isArgReg (YmmReg {})     = True
 isArgReg (ZmmReg {})     = True


=====================================
compiler/GHC/CmmToC.hs
=====================================
@@ -1126,7 +1126,6 @@ pprGlobalReg gr = case gr of
         --              JMP_(*R1.p);
     FloatReg   n   -> char 'F' <> int n
     DoubleReg  n   -> char 'D' <> int n
-    LongReg    n   -> char 'L' <> int n
     Sp             -> text "Sp"
     SpLim          -> text "SpLim"
     Hp             -> text "Hp"


=====================================
compiler/GHC/CmmToLlvm/Regs.hs
=====================================
@@ -81,7 +81,7 @@ lmGlobalReg platform suf reg
         MachSp         -> wordGlobal $ "MachSp" ++ suf
         _other         -> panic $ "GHC.CmmToLlvm.Reg: GlobalReg (" ++ (show reg)
                                 ++ ") not supported!"
-        -- LongReg, HpLim, CCSS, CurrentTSO, CurrentNusery, HpAlloc
+        -- HpLim, CCSS, CurrentTSO, CurrentNusery, HpAlloc
         -- EagerBlackholeInfo, GCEnter1, GCFun, BaseReg, PicBaseReg
     where
         wordGlobal   name = LMNLocalVar (fsLit name) (llvmWord platform)


=====================================
compiler/GHC/StgToCmm/CgUtils.hs
=====================================
@@ -81,8 +81,6 @@ baseRegOffset platform reg = case reg of
    ZmmReg n             -> panic ("Registers above ZMM6 are not supported (tried to use ZMM" ++ show n ++ ")")
    Sp                   -> pc_OFFSET_StgRegTable_rSp    constants
    SpLim                -> pc_OFFSET_StgRegTable_rSpLim constants
-   LongReg 1            -> pc_OFFSET_StgRegTable_rL1    constants
-   LongReg n            -> panic ("Registers above L1 are not supported (tried to use L" ++ show n ++ ")")
    Hp                   -> pc_OFFSET_StgRegTable_rHp             constants
    HpLim                -> pc_OFFSET_StgRegTable_rHpLim          constants
    CCCS                 -> pc_OFFSET_StgRegTable_rCCCS           constants


=====================================
rts/HeapStackCheck.cmm
=====================================
@@ -338,13 +338,6 @@ stg_gc_d1 return (D_ d)
 }
 
 
-/*-- L1 contains an int64 ------------------------------------------------- */
-
-stg_gc_l1 return (L_ l)
-{
-    jump stg_gc_noregs (stg_ret_l_info, l) ();
-}
-
 /*-- Unboxed tuples with multiple pointers -------------------------------- */
 
 stg_gc_pp return (P_ arg1, P_ arg2)


=====================================
rts/StgMiscClosures.cmm
=====================================
@@ -178,18 +178,6 @@ INFO_TABLE_RET( stg_ctoi_D1, RET_BCO )
     jump stg_yield_to_interpreter [];
 }
 
-/*
- * When the returned value is in L1
- */
-INFO_TABLE_RET( stg_ctoi_L1, RET_BCO )
-    /* explicit stack */
-{
-    Sp_adj(-1) - 8;
-    L_[Sp + WDS(1)] = L1;
-    Sp(0) = stg_ret_l_info;
-    jump stg_yield_to_interpreter [];
-}
-
 /*
  * When the returned value is a void
  */


=====================================
rts/include/stg/MachRegs.h
=====================================
@@ -123,7 +123,6 @@
 #define MAX_REAL_VANILLA_REG 1  /* always, since it defines the entry conv */
 #define MAX_REAL_FLOAT_REG   0
 #define MAX_REAL_DOUBLE_REG  0
-#define MAX_REAL_LONG_REG    0
 #define MAX_REAL_XMM_REG     4
 #define MAX_REAL_YMM_REG     4
 #define MAX_REAL_ZMM_REG     4
@@ -269,7 +268,6 @@ the stack. See Note [Overlapping global registers] for implications.
 #define MAX_REAL_VANILLA_REG 6
 #define MAX_REAL_FLOAT_REG   6
 #define MAX_REAL_DOUBLE_REG  6
-#define MAX_REAL_LONG_REG    0
 #define MAX_REAL_XMM_REG     6
 #define MAX_REAL_YMM_REG     6
 #define MAX_REAL_ZMM_REG     6
@@ -684,14 +682,6 @@ the stack. See Note [Overlapping global registers] for implications.
 #  endif
 #endif
 
-#if !defined(MAX_REAL_LONG_REG)
-#  if   defined(REG_L1)
-#  define MAX_REAL_LONG_REG 1
-#  else
-#  define MAX_REAL_LONG_REG 0
-#  endif
-#endif
-
 #if !defined(MAX_REAL_XMM_REG)
 #  if   defined(REG_XMM6)
 #  define MAX_REAL_XMM_REG 6


=====================================
rts/include/stg/Regs.h
=====================================
@@ -395,12 +395,6 @@ GLOBAL_REG_DECL(StgWord512,ZMM6,REG_ZMM6)
 #define ZMM6 (BaseReg->rZMM6)
 #endif
 
-#if defined(REG_L1) && !defined(NO_GLOBAL_REG_DECLS)
-GLOBAL_REG_DECL(StgWord64,L1,REG_L1)
-#else
-#define L1 (BaseReg->rL1)
-#endif
-
 /*
  * If BaseReg isn't mapped to a machine register, just use the global
  * address of the current register table (CurrentRegTable in


=====================================
utils/deriveConstants/Main.hs
=====================================
@@ -652,7 +652,6 @@ wanteds os = concat
           ,constantWord Haskell "MAX_Real_Float_REG"   "MAX_REAL_FLOAT_REG"
           ,constantWord Haskell "MAX_Real_Double_REG"  "MAX_REAL_DOUBLE_REG"
           ,constantWord Haskell "MAX_Real_XMM_REG"     "MAX_REAL_XMM_REG"
-          ,constantWord Haskell "MAX_Real_Long_REG"    "MAX_REAL_LONG_REG"
 
           -- This tells the native code generator the size of the spill
           -- area it has available.


=====================================
utils/genapply/Main.hs
=====================================
@@ -86,20 +86,18 @@ data RegStatus = Registerised | Unregisterised
 
 type Reg = String
 
-availableRegs :: RegStatus -> ([Reg],[Reg],[Reg],[Reg])
-availableRegs Unregisterised = ([],[],[],[])
+availableRegs :: RegStatus -> ([Reg],[Reg],[Reg])
+availableRegs Unregisterised = ([],[],[])
 availableRegs Registerised =
   ( vanillaRegs MAX_REAL_VANILLA_REG,
     floatRegs   MAX_REAL_FLOAT_REG,
-    doubleRegs  MAX_REAL_DOUBLE_REG,
-    longRegs    MAX_REAL_LONG_REG
+    doubleRegs  MAX_REAL_DOUBLE_REG
   )
 
-vanillaRegs, floatRegs, doubleRegs, longRegs :: Int -> [Reg]
+vanillaRegs, floatRegs, doubleRegs :: Int -> [Reg]
 vanillaRegs n = [ "R" ++ show m | m <- [2..n] ]  -- never use R1
 floatRegs   n = [ "F" ++ show m | m <- [1..n] ]
 doubleRegs  n = [ "D" ++ show m | m <- [1..n] ]
-longRegs    n = [ "L" ++ show m | m <- [1..n] ]
 
 -- -----------------------------------------------------------------------------
 -- Loading/saving register arguments to the stack
@@ -132,16 +130,14 @@ assign sp (arg : args) regs doc
                             ((reg, sp) : doc)
     Nothing -> (doc, (arg:args), sp)
 
-findAvailableReg N (vreg:vregs, fregs, dregs, lregs) =
-  Just (vreg, (vregs,fregs,dregs,lregs))
-findAvailableReg P (vreg:vregs, fregs, dregs, lregs) =
-  Just (vreg, (vregs,fregs,dregs,lregs))
-findAvailableReg F (vregs, freg:fregs, dregs, lregs) =
-  Just (freg, (vregs,fregs,dregs,lregs))
-findAvailableReg D (vregs, fregs, dreg:dregs, lregs) =
-  Just (dreg, (vregs,fregs,dregs,lregs))
-findAvailableReg L (vregs, fregs, dregs, lreg:lregs) =
-  Just (lreg, (vregs,fregs,dregs,lregs))
+findAvailableReg N (vreg:vregs, fregs, dregs) =
+  Just (vreg, (vregs,fregs,dregs))
+findAvailableReg P (vreg:vregs, fregs, dregs) =
+  Just (vreg, (vregs,fregs,dregs))
+findAvailableReg F (vregs, freg:fregs, dregs) =
+  Just (freg, (vregs,fregs,dregs))
+findAvailableReg D (vregs, fregs, dreg:dregs) =
+  Just (dreg, (vregs,fregs,dregs))
 findAvailableReg _ _ = Nothing
 
 assign_reg_to_stk reg sp



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/3fd62e9a3e80fc3791ae5157ad26ca9ad54afe56

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/3fd62e9a3e80fc3791ae5157ad26ca9ad54afe56
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20221018/9a834980/attachment-0001.html>


More information about the ghc-commits mailing list