Skip to content

[llvm][LoongArch] Support per-global code model attribute for LoongArch #72079

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 6, 2024

Conversation

heiher
Copy link
Member

@heiher heiher commented Nov 13, 2023

This patch gets the code model from global variable attribute if it has, otherwise the target's will be used.

@llvmbot
Copy link
Member

llvmbot commented Nov 13, 2023

@llvm/pr-subscribers-clang
@llvm/pr-subscribers-clang-codegen

@llvm/pr-subscribers-backend-loongarch

Author: hev (heiher)

Changes

This gets the code model from global variable if it has, otherwise the target's will be used.


Full diff: https://github.com/llvm/llvm-project/pull/72079.diff

3 Files Affected:

  • (modified) llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp (+11-6)
  • (modified) llvm/lib/Target/LoongArch/LoongArchISelLowering.h (+2-1)
  • (added) llvm/test/CodeGen/LoongArch/global-variable-code-model.ll (+44)
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index f3f72e74ef085a2..873ee87ae14bcd2 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -599,12 +599,12 @@ static SDValue getTargetNode(JumpTableSDNode *N, SDLoc DL, EVT Ty,
 
 template <class NodeTy>
 SDValue LoongArchTargetLowering::getAddr(NodeTy *N, SelectionDAG &DAG,
-                                         bool IsLocal) const {
+                                         CodeModel::Model M, bool IsLocal) const {
   SDLoc DL(N);
   EVT Ty = getPointerTy(DAG.getDataLayout());
   SDValue Addr = getTargetNode(N, DL, Ty, DAG, 0);
 
-  switch (DAG.getTarget().getCodeModel()) {
+  switch (M) {
   default:
     report_fatal_error("Unsupported code model");
 
@@ -645,24 +645,29 @@ SDValue LoongArchTargetLowering::getAddr(NodeTy *N, SelectionDAG &DAG,
 
 SDValue LoongArchTargetLowering::lowerBlockAddress(SDValue Op,
                                                    SelectionDAG &DAG) const {
-  return getAddr(cast<BlockAddressSDNode>(Op), DAG);
+  return getAddr(cast<BlockAddressSDNode>(Op), DAG, DAG.getTarget().getCodeModel());
 }
 
 SDValue LoongArchTargetLowering::lowerJumpTable(SDValue Op,
                                                 SelectionDAG &DAG) const {
-  return getAddr(cast<JumpTableSDNode>(Op), DAG);
+  return getAddr(cast<JumpTableSDNode>(Op), DAG, DAG.getTarget().getCodeModel());
 }
 
 SDValue LoongArchTargetLowering::lowerConstantPool(SDValue Op,
                                                    SelectionDAG &DAG) const {
-  return getAddr(cast<ConstantPoolSDNode>(Op), DAG);
+  return getAddr(cast<ConstantPoolSDNode>(Op), DAG, DAG.getTarget().getCodeModel());
 }
 
 SDValue LoongArchTargetLowering::lowerGlobalAddress(SDValue Op,
                                                     SelectionDAG &DAG) const {
   GlobalAddressSDNode *N = cast<GlobalAddressSDNode>(Op);
   assert(N->getOffset() == 0 && "unexpected offset in global node");
-  return getAddr(N, DAG, N->getGlobal()->isDSOLocal());
+  auto CM = DAG.getTarget().getCodeModel();
+  const GlobalValue *GV = N->getGlobal();
+  const auto *GO = dyn_cast<GlobalObject>(GV);
+  if (GV->isDSOLocal() && GO && GO->hasCodeModel())
+    CM = GO->getCodeModel();
+  return getAddr(N, DAG, CM, GV->isDSOLocal());
 }
 
 SDValue LoongArchTargetLowering::getStaticTLSAddr(GlobalAddressSDNode *N,
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h
index 3141286671055dd..d7e28608890ac1a 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h
@@ -247,7 +247,8 @@ class LoongArchTargetLowering : public TargetLowering {
                          LoongArchCCAssignFn Fn) const;
 
   template <class NodeTy>
-  SDValue getAddr(NodeTy *N, SelectionDAG &DAG, bool IsLocal = true) const;
+  SDValue getAddr(NodeTy *N, SelectionDAG &DAG, CodeModel::Model M,
+                  bool IsLocal = true) const;
   SDValue getStaticTLSAddr(GlobalAddressSDNode *N, SelectionDAG &DAG,
                            unsigned Opc, bool Large = false) const;
   SDValue getDynamicTLSAddr(GlobalAddressSDNode *N, SelectionDAG &DAG,
diff --git a/llvm/test/CodeGen/LoongArch/global-variable-code-model.ll b/llvm/test/CodeGen/LoongArch/global-variable-code-model.ll
new file mode 100644
index 000000000000000..db2feb5c0acdb38
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/global-variable-code-model.ll
@@ -0,0 +1,44 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s
+
+@a= external dso_local global i32, code_model "small", align 4
+
+define dso_local signext i32 @local_small() #0 {
+; CHECK-LABEL: local_small:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(a)
+; CHECK-NEXT:    addi.d $a0, $a0, %pc_lo12(a)
+; CHECK-NEXT:    ld.w $a0, $a0, 0
+; CHECK-NEXT:    ret
+  %1 = load i32, ptr @a, align 4
+  ret i32 %1
+}
+
+@b= external dso_local global i32, code_model "large", align 4
+
+define dso_local signext i32 @local_large() #0 {
+; CHECK-LABEL: local_large:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(b)
+; CHECK-NEXT:    addi.d $a1, $zero, %pc_lo12(b)
+; CHECK-NEXT:    lu32i.d $a1, %pc64_lo20(b)
+; CHECK-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(b)
+; CHECK-NEXT:    add.d $a0, $a1, $a0
+; CHECK-NEXT:    ld.w $a0, $a0, 0
+; CHECK-NEXT:    ret
+  %1 = load i32, ptr @b, align 4
+  ret i32 %1
+}
+
+@c= external global i32, code_model "large", align 4
+
+define dso_local signext i32 @non_local_large() #0 {
+; CHECK-LABEL: non_local_large:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pcalau12i $a0, %got_pc_hi20(c)
+; CHECK-NEXT:    ld.d $a0, $a0, %got_pc_lo12(c)
+; CHECK-NEXT:    ld.w $a0, $a0, 0
+; CHECK-NEXT:    ret
+  %1 = load i32, ptr @c, align 4
+  ret i32 %1
+}

@heiher heiher marked this pull request as draft November 13, 2023 02:49
Copy link

github-actions bot commented Nov 13, 2023

✅ With the latest revision this PR passed the C/C++ code formatter.

@heiher
Copy link
Member Author

heiher commented Nov 13, 2023

Part 1/3: #72077
Part 2/3: #72078

@heiher heiher force-pushed the model-attr-loongarch branch from 58b733e to 9d2f1fd Compare November 13, 2023 02:58
@heiher
Copy link
Member Author

heiher commented Nov 13, 2023

cc @xen0n @xry111

@heiher heiher force-pushed the model-attr-loongarch branch from 9d2f1fd to 15b4fbe Compare November 15, 2023 10:27
@heiher heiher force-pushed the model-attr-loongarch branch from 15b4fbe to 08f8a1d Compare December 4, 2023 02:36
@heiher heiher changed the title [llvm][LoongArch] Get the code model from the global object [LoongArch] Support per-global code model attribute for LoongArch Dec 5, 2023
@heiher heiher force-pushed the model-attr-loongarch branch from 08f8a1d to f34aaa5 Compare December 5, 2023 04:18
@heiher heiher marked this pull request as ready for review December 5, 2023 04:18
@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:codegen IR generation bugs: mangling, exceptions, etc. labels Dec 5, 2023
@xen0n
Copy link
Contributor

xen0n commented Dec 5, 2023

I think we should initially only support the attribute on LoongArch. GCC's model attribute is only ever supported on ia64 and loongarch, yet the patch currently seems to allow other architectures to use this attribute, with LLVM code model names accepted -- this may or may not be what the targets actually want, if they decide to add support for the attribute in GCC.

@heiher heiher force-pushed the model-attr-loongarch branch from f34aaa5 to 7640e36 Compare December 5, 2023 07:25
@heiher heiher changed the title [LoongArch] Support per-global code model attribute for LoongArch [llvm][LoongArch] Support per-global code model attribute for LoongArch Dec 5, 2023
@heiher
Copy link
Member Author

heiher commented Dec 5, 2023

I think we should initially only support the attribute on LoongArch. GCC's model attribute is only ever supported on ia64 and loongarch, yet the patch currently seems to allow other architectures to use this attribute, with LLVM code model names accepted -- this may or may not be what the targets actually want, if they decide to add support for the attribute in GCC.

Done. Thanks

@heiher heiher removed clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:codegen IR generation bugs: mangling, exceptions, etc. labels Dec 11, 2023
Copy link
Contributor

@SixWeining SixWeining left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM with a small nit.

heiher added 2 commits January 6, 2024 11:42
This patch gets the code model from global variable attribute if it has,
otherwise the target's will be used.

Signed-off-by: WANG Rui <[email protected]>
@heiher heiher force-pushed the model-attr-loongarch branch from 3dffa96 to a988196 Compare January 6, 2024 03:47
@heiher heiher merged commit 16094cb into llvm:main Jan 6, 2024
@heiher heiher deleted the model-attr-loongarch branch January 6, 2024 05:36
justinfargnoli pushed a commit to justinfargnoli/llvm-project that referenced this pull request Jan 28, 2024
…ch (llvm#72079)

This patch gets the code model from global variable attribute if it has,
otherwise the target's will be used.

---------

Signed-off-by: WANG Rui <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants