[llvm] 7e78d89 - [PowerPC] Fix for compiler side issue in PCRelative Local Exec
Stefan Pintilie via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 22 06:28:27 PDT 2020
Author: Stefan Pintilie
Date: 2020-09-22T08:28:06-05:00
New Revision: 7e78d89052b15f32ea56f018698194c7c9627152
URL: https://github.com/llvm/llvm-project/commit/7e78d89052b15f32ea56f018698194c7c9627152
DIFF: https://github.com/llvm/llvm-project/commit/7e78d89052b15f32ea56f018698194c7c9627152.diff
LOG: [PowerPC] Fix for compiler side issue in PCRelative Local Exec
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.
Reviewed By: NeHuang
Differential Revision: https://reviews.llvm.org/D88030
Added:
Modified:
llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
llvm/test/CodeGen/PowerPC/pcrel-tls-local-exec.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
index a70e7468a15b..d16f2e2dba71 100644
--- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -648,6 +648,8 @@ bool PPCDAGToDAGISel::tryTLSXFormStore(StoreSDNode *ST) {
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();
diff --git a/llvm/test/CodeGen/PowerPC/pcrel-tls-local-exec.ll b/llvm/test/CodeGen/PowerPC/pcrel-tls-local-exec.ll
index 47245991d82f..002400d10656 100644
--- a/llvm/test/CodeGen/PowerPC/pcrel-tls-local-exec.ll
+++ b/llvm/test/CodeGen/PowerPC/pcrel-tls-local-exec.ll
@@ -41,6 +41,22 @@ entry:
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 @@ define i32 @LocalExecValueLoadOffset() {
; 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 @@ define i32* @LocalExecValueLoadOffsetNoLoad() {
; 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)
}
More information about the llvm-commits
mailing list