Skip to content

Commit 65b710e

Browse files
committed
[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
1 parent fe6de0b commit 65b710e

File tree

5 files changed

+14
-6
lines changed

5 files changed

+14
-6
lines changed

llvm/lib/Target/M68k/M68kISelDAGToDAG.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,13 @@ bool M68kDAGToDAGISel::matchAddressRecursively(SDValue N,
500500
return true;
501501
}
502502
break;
503+
504+
case ISD::TargetGlobalTLSAddress: {
505+
GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(N);
506+
AM.GV = GA->getGlobal();
507+
AM.SymbolFlags = GA->getTargetFlags();
508+
return true;
509+
}
503510
}
504511

505512
return matchAddressBase(N, AM);
@@ -724,6 +731,8 @@ bool M68kDAGToDAGISel::SelectARID(SDNode *Parent, SDValue N, SDValue &Disp,
724731
return false;
725732
}
726733

734+
Base = AM.BaseReg;
735+
727736
if (getSymbolicDisplacement(AM, SDLoc(N), Disp)) {
728737
assert(!AM.Disp && "Should not be any displacement");
729738
LLVM_DEBUG(dbgs() << "SUCCESS, matched Symbol\n");
@@ -736,7 +745,6 @@ bool M68kDAGToDAGISel::SelectARID(SDNode *Parent, SDValue N, SDValue &Disp,
736745
return false;
737746
}
738747

739-
Base = AM.BaseReg;
740748
Disp = getI16Imm(AM.Disp, SDLoc(N));
741749

742750
LLVM_DEBUG(dbgs() << "SUCCESS\n");

llvm/test/CodeGen/M68k/TLS/tlsgd.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ define ptr @get_addr() nounwind {
88
; CHECK: ; %bb.0: ; %entry
99
; CHECK-NEXT: suba.l #4, %sp
1010
; CHECK-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0
11-
; CHECK-NEXT: adda.l myvar@TLSGD, %a0
11+
; CHECK-NEXT: lea (myvar@TLSGD,%a0), %a0
1212
; CHECK-NEXT: move.l %a0, (%sp)
1313
; CHECK-NEXT: jsr (__tls_get_addr@PLT,%pc)
1414
; CHECK-NEXT: adda.l #4, %sp

llvm/test/CodeGen/M68k/TLS/tlsie.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ define dso_local ptr @get_addr() nounwind {
1010
; CHECK-NEXT: jsr __m68k_read_tp@PLT
1111
; CHECK-NEXT: move.l %a0, %d0
1212
; CHECK-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0
13-
; CHECK-NEXT: add.l (0,myvar@GOTTPOFF,%a0), %d0
13+
; CHECK-NEXT: add.l (myvar@GOTTPOFF,%a0), %d0
1414
; CHECK-NEXT: move.l %d0, %a0
1515
; CHECK-NEXT: adda.l #4, %sp
1616
; CHECK-NEXT: rts

llvm/test/CodeGen/M68k/TLS/tlsld.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ define dso_local ptr @get_addr() nounwind {
88
; CHECK: ; %bb.0: ; %entry
99
; CHECK-NEXT: suba.l #4, %sp
1010
; CHECK-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0
11-
; CHECK-NEXT: adda.l myvar@TLSLDM, %a0
11+
; CHECK-NEXT: lea (myvar@TLSLDM,%a0), %a0
1212
; CHECK-NEXT: move.l %a0, (%sp)
1313
; CHECK-NEXT: jsr (__tls_get_addr@PLT,%pc)
14-
; CHECK-NEXT: adda.l myvar@TLSLD, %a0
14+
; CHECK-NEXT: lea (myvar@TLSLD,%a0), %a0
1515
; CHECK-NEXT: adda.l #4, %sp
1616
; CHECK-NEXT: rts
1717
entry:

llvm/test/CodeGen/M68k/TLS/tlsle.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ define dso_local ptr @get_addr() nounwind {
88
; CHECK: ; %bb.0: ; %entry
99
; CHECK-NEXT: suba.l #4, %sp
1010
; CHECK-NEXT: jsr __m68k_read_tp@PLT
11-
; CHECK-NEXT: adda.l myvar@TPOFF, %a0
11+
; CHECK-NEXT: lea (myvar@TPOFF,%a0), %a0
1212
; CHECK-NEXT: adda.l #4, %sp
1313
; CHECK-NEXT: rts
1414
entry:

0 commit comments

Comments
 (0)