[PATCH] D88030: [PowerPC] Fix for compiler side issue in PCRelative Local Exec
Stefan Pintilie via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 21 09:28:43 PDT 2020
stefanp created this revision.
stefanp added a reviewer: nemanjai.
Herald added subscribers: shchenz, kbarton, hiraditya.
Herald added a project: LLVM.
stefanp requested review of this revision.
Stop combining loads and stores with PPCISD::ADD_TLS before we can merge the
node with with TLS_LOCAL_EXEC_MAT_ADDR. The issue is that
TLS_LOCAL_EXEC_MAT_ADDR cannot be selected by itself and requires the previous
ADD_TLS node that goes with it. However, we sometimes try to combine ADD_TLS
with loads and stores that come after it. If this happens then the ADD_TLS is
removed and TLS_LOCAL_EXEC_MAT_ADDR cannot be selected.
While this bug fix will address the issue it my not be ideal from a performance
perspective as we may be able to add patterns to combine TLS_LOCAL_EXEC_MAT_ADDR
with ADD_TLS with the load and store that comes after it all in one. However,
this is beyond the scope of this patch.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D88030
Files:
llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
llvm/test/CodeGen/PowerPC/pcrel-tls-local-exec.ll
Index: llvm/test/CodeGen/PowerPC/pcrel-tls-local-exec.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/pcrel-tls-local-exec.ll
+++ llvm/test/CodeGen/PowerPC/pcrel-tls-local-exec.ll
@@ -41,6 +41,22 @@
ret i32 %0
}
+define void @LocalExecValueStore(i32 %in) {
+; CHECK-S-LABEL: LocalExecValueStore:
+; CHECK-S: # %bb.0: # %entry
+; CHECK-S-NEXT: paddi r4, r13, x at TPREL, 0
+; CHECK-S-NEXT: stw r3, 0(r4)
+; CHECK-S-NEXT: blr
+; CHECK-O-LABEL: <LocalExecValueStore>:
+; CHECK-O: 40: paddi 4, 13, 0, 0
+; CHECK-O-NEXT: 0000000000000040: R_PPC64_TPREL34 x
+; CHECK-O-NEXT: 48: stw 3, 0(4)
+; CHECK-O-NEXT: 4c: blr
+entry:
+ store i32 %in, i32* @x, align 4
+ ret void
+}
+
define i32 @LocalExecValueLoadOffset() {
; CHECK-S-LABEL: LocalExecValueLoadOffset:
; CHECK-S: # %bb.0: # %entry
@@ -48,10 +64,10 @@
; CHECK-S-NEXT: lwz r3, 12(r3)
; CHECK-S-NEXT: blr
; CHECK-O-LABEL: <LocalExecValueLoadOffset>:
-; CHECK-O: 40: paddi 3, 13, 0, 0
-; CHECK-O-NEXT: 0000000000000040: R_PPC64_TPREL34 y
-; CHECK-O-NEXT: 48: lwz 3, 12(3)
-; CHECK-O-NEXT: 4c: blr
+; CHECK-O: 60: paddi 3, 13, 0, 0
+; CHECK-O-NEXT: 0000000000000060: R_PPC64_TPREL34 y
+; CHECK-O-NEXT: 68: lwz 3, 12(3)
+; CHECK-O-NEXT: 6c: blr
entry:
%0 = load i32, i32* getelementptr inbounds ([5 x i32], [5 x i32]* @y, i64 0, i64 3), align 4
ret i32 %0
@@ -65,10 +81,10 @@
; CHECK-S-NEXT: addi r3, r3, 12
; CHECK-S-NEXT: blr
; CHECK-O-LABEL: <LocalExecValueLoadOffsetNoLoad>:
-; CHECK-O: 60: paddi 3, 13, 0, 0
-; CHECK-O-NEXT: 0000000000000060: R_PPC64_TPREL34 y
-; CHECK-O-NEXT: 68: addi 3, 3, 12
-; CHECK-O-NEXT: 6c: blr
+; CHECK-O: 80: paddi 3, 13, 0, 0
+; CHECK-O-NEXT: 0000000000000080: R_PPC64_TPREL34 y
+; CHECK-O-NEXT: 88: addi 3, 3, 12
+; CHECK-O-NEXT: 8c: blr
entry:
ret i32* getelementptr inbounds ([5 x i32], [5 x i32]* @y, i64 0, i64 3)
}
Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
===================================================================
--- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -648,6 +648,8 @@
SDValue Offset = ST->getOffset();
if (!Offset.isUndef())
return false;
+ if (Base.getOperand(1).getOpcode() == PPCISD::TLS_LOCAL_EXEC_MAT_ADDR)
+ return false;
SDLoc dl(ST);
EVT MemVT = ST->getMemoryVT();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88030.293196.patch
Type: text/x-patch
Size: 2464 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200921/b0dc9b19/attachment.bin>
More information about the llvm-commits
mailing list