[m68k] Fix incorrect handling of TLS when matching addressing mode. `TargetGlobalTLSAddress` is not considered and handled correctly when matching addressing mode, which leads to an incorrect result of instruction selection. fixes #63162. Reviewed By: myhsu Differential Revision: https://reviews.llvm.org/D153103
diff --git a/llvm/lib/Target/M68k/M68kISelDAGToDAG.cpp b/llvm/lib/Target/M68k/M68kISelDAGToDAG.cpp index 075120b..e33654e 100644 --- a/llvm/lib/Target/M68k/M68kISelDAGToDAG.cpp +++ b/llvm/lib/Target/M68k/M68kISelDAGToDAG.cpp
@@ -500,6 +500,13 @@ return true; } break; + + case ISD::TargetGlobalTLSAddress: { + GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(N); + AM.GV = GA->getGlobal(); + AM.SymbolFlags = GA->getTargetFlags(); + return true; + } } return matchAddressBase(N, AM); @@ -724,6 +731,8 @@ return false; } + Base = AM.BaseReg; + if (getSymbolicDisplacement(AM, SDLoc(N), Disp)) { assert(!AM.Disp && "Should not be any displacement"); LLVM_DEBUG(dbgs() << "SUCCESS, matched Symbol\n"); @@ -736,7 +745,6 @@ return false; } - Base = AM.BaseReg; Disp = getI16Imm(AM.Disp, SDLoc(N)); LLVM_DEBUG(dbgs() << "SUCCESS\n");
diff --git a/llvm/test/CodeGen/M68k/TLS/tlsgd.ll b/llvm/test/CodeGen/M68k/TLS/tlsgd.ll index ed891dd..cbbe84e 100644 --- a/llvm/test/CodeGen/M68k/TLS/tlsgd.ll +++ b/llvm/test/CodeGen/M68k/TLS/tlsgd.ll
@@ -8,7 +8,7 @@ ; CHECK: ; %bb.0: ; %entry ; CHECK-NEXT: suba.l #4, %sp ; CHECK-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0 -; CHECK-NEXT: adda.l myvar@TLSGD, %a0 +; CHECK-NEXT: lea (myvar@TLSGD,%a0), %a0 ; CHECK-NEXT: move.l %a0, (%sp) ; CHECK-NEXT: jsr (__tls_get_addr@PLT,%pc) ; CHECK-NEXT: adda.l #4, %sp
diff --git a/llvm/test/CodeGen/M68k/TLS/tlsie.ll b/llvm/test/CodeGen/M68k/TLS/tlsie.ll index db4000e..8e402ce 100644 --- a/llvm/test/CodeGen/M68k/TLS/tlsie.ll +++ b/llvm/test/CodeGen/M68k/TLS/tlsie.ll
@@ -10,7 +10,7 @@ ; CHECK-NEXT: jsr __m68k_read_tp@PLT ; CHECK-NEXT: move.l %a0, %d0 ; CHECK-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0 -; CHECK-NEXT: add.l (0,myvar@GOTTPOFF,%a0), %d0 +; CHECK-NEXT: add.l (myvar@GOTTPOFF,%a0), %d0 ; CHECK-NEXT: move.l %d0, %a0 ; CHECK-NEXT: adda.l #4, %sp ; CHECK-NEXT: rts
diff --git a/llvm/test/CodeGen/M68k/TLS/tlsld.ll b/llvm/test/CodeGen/M68k/TLS/tlsld.ll index 1a0588d..01c4c0f 100644 --- a/llvm/test/CodeGen/M68k/TLS/tlsld.ll +++ b/llvm/test/CodeGen/M68k/TLS/tlsld.ll
@@ -8,10 +8,10 @@ ; CHECK: ; %bb.0: ; %entry ; CHECK-NEXT: suba.l #4, %sp ; CHECK-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0 -; CHECK-NEXT: adda.l myvar@TLSLDM, %a0 +; CHECK-NEXT: lea (myvar@TLSLDM,%a0), %a0 ; CHECK-NEXT: move.l %a0, (%sp) ; CHECK-NEXT: jsr (__tls_get_addr@PLT,%pc) -; CHECK-NEXT: adda.l myvar@TLSLD, %a0 +; CHECK-NEXT: lea (myvar@TLSLD,%a0), %a0 ; CHECK-NEXT: adda.l #4, %sp ; CHECK-NEXT: rts entry:
diff --git a/llvm/test/CodeGen/M68k/TLS/tlsle.ll b/llvm/test/CodeGen/M68k/TLS/tlsle.ll index b0c2b37..a08898f 100644 --- a/llvm/test/CodeGen/M68k/TLS/tlsle.ll +++ b/llvm/test/CodeGen/M68k/TLS/tlsle.ll
@@ -8,7 +8,7 @@ ; CHECK: ; %bb.0: ; %entry ; CHECK-NEXT: suba.l #4, %sp ; CHECK-NEXT: jsr __m68k_read_tp@PLT -; CHECK-NEXT: adda.l myvar@TPOFF, %a0 +; CHECK-NEXT: lea (myvar@TPOFF,%a0), %a0 ; CHECK-NEXT: adda.l #4, %sp ; CHECK-NEXT: rts entry: