<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<br>
<p>On Tue, 10 Feb 2026 11:04:41 +0800 fanpeng <fanpeng@loongson.cn>
wrote:</fanpeng@loongson.cn></p>
<p><br>
</p>
<p>Get the patch from upstream directly.</p>
<p>Commit ID: e70d41406b5d5638b42c4d8222cd03e76bbfeb86</p>
<p><br>
</p>
<p>--- a/compiler/GHC/CmmToLlvm.hs<br>
+++ b/compiler/GHC/CmmToLlvm.hs<br>
@@ -221,7 +221,12 @@ cmmMetaLlvmPrelude = do<br>
case platformArch platform of<br>
ArchX86_64 | llvmCgAvxEnabled cfg ->
[mkStackAlignmentMeta 32]<br>
_ -> []<br>
- module_flags_metas <- mkModuleFlagsMeta
stack_alignment_metas<br>
+ let codel_model_metas =<br>
+ case platformArch platform of<br>
+ -- FIXME: We should not rely on LLVM<br>
+ ArchLoongArch64 -> [mkCodeModelMeta CMMedium]<br>
+ _ -> []<br>
+ module_flags_metas <- mkModuleFlagsMeta
(stack_alignment_metas ++ codel_model_metas)<br>
let metas = tbaa_metas ++ module_flags_metas<br>
cfg <- getConfig<br>
renderLlvm (ppLlvmMetas cfg metas)<br>
@@ -244,6 +249,15 @@ mkStackAlignmentMeta :: Integer ->
ModuleFlag<br>
mkStackAlignmentMeta alignment =<br>
ModuleFlag MFBError "override-stack-alignment" (MetaLit $
LMIntLit alignment i32)<br>
<br>
+-- LLVM's @LLVM::CodeModel::Model@ enumeration<br>
+data CodeModel = CMMedium<br>
+<br>
+-- Pass -mcmodel=medium option to LLVM on LoongArch64<br>
+mkCodeModelMeta :: CodeModel -> ModuleFlag<br>
+mkCodeModelMeta codemodel =<br>
+ ModuleFlag MFBError "Code Model" (MetaLit $ LMIntLit n i32)<br>
+ where<br>
+ n = case codemodel of CMMedium -> 3 -- as of LLVM 8<br>
<br>
--
-----------------------------------------------------------------------------<br>
-- | Marks variables as used where necessary<br>
</p>
<p><br>
<fanpeng@loongson.cn></fanpeng@loongson.cn></p>
<fanpeng@loongson.cn>> From
e70d41406b5d5638b42c4d8222cd03e76bbfeb86 Mon Sep 17 00:00:00 2001<br>
> From: Xin Wang <wangxin03@loongson.cn><br>
> Date: Mon, 13 Dec 2024 10:45:20 +0800<br>
> Subject: [PATCH] llvmGen: Pass mcmodel medium option to
LLVM backend on LoongArch<br>
> <br>
> ---<br>
> compiler/GHC/CmmToLlvm.hs | 17 ++++++++++++++++-<br>
> 1 file changed, 16 insertions(+), 1 deletion(-)<br>
> <br>
> --- a/compiler/GHC/CmmToLlvm.hs<br>
> +++ b/compiler/GHC/CmmToLlvm.hs<br>
> @@ -219,7 +219,13 @@ cmmMetaLlvmPrelude = do<br>
> ArchX86_64 | llvmCgAvxEnabled cfg ->
[mkStackAlignmentMeta 32]<br>
> _ -> []<br>
> module_flags_metas <- mkModuleFlagsMeta
stack_alignment_metas<br>
> - let metas = tbaa_metas ++ module_flags_metas<br>
> + let code_model_metas =<br>
> + case platformArch platform of<br>
> + -- FIXME: We should not rely on LLVM<br>
> + ArchLoongArch64 -> [mkCodeModelMeta CMMedium]<br>
> + _ -> []<br>
> + mcmodel_flags_metas <- mkModuleFlagsMeta
code_model_metas<br>
> + let metas = tbaa_metas ++ module_flags_metas ++
mcmodel_flags_metas<br>
> cfg <- getConfig<br>
> renderLlvm (ppLlvmMetas cfg metas)<br>
> (ppLlvmMetas cfg metas)<br>
> @@ -241,6 +247,15 @@ mkStackAlignmentMeta :: Integer ->
ModuleFlag<br>
> mkStackAlignmentMeta alignment =<br>
> ModuleFlag MFBError "override-stack-alignment" (MetaLit $
LMIntLit alignment i32)<br>
> <br>
> +-- LLVM's @LLVM::CodeModel::Model@ enumeration<br>
> +data CodeModel = CMMedium<br>
> +<br>
> +-- Pass -mcmodel=medium option to LLVM on LoongArch64<br>
> +mkCodeModelMeta :: CodeModel -> ModuleFlag<br>
> +mkCodeModelMeta codemodel =<br>
> + ModuleFlag MFBError "Code Model" (MetaLit $ LMIntLit n
i32)<br>
> + where<br>
> + n = case codemodel of CMMedium -> 3 -- as of LLVM 8<br>
> <br>
> --
-----------------------------------------------------------------------------<br>
> -- | Marks variables as used where necessary<br>
</wangxin03@loongson.cn></fanpeng@loongson.cn><br>
</body>
</html>