[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
This commit is contained in:
parent
fe6de0be2f
commit
65b710efc1
@ -500,6 +500,13 @@ bool M68kDAGToDAGISel::matchAddressRecursively(SDValue N,
|
||||
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 @@ bool M68kDAGToDAGISel::SelectARID(SDNode *Parent, SDValue N, SDValue &Disp,
|
||||
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 @@ bool M68kDAGToDAGISel::SelectARID(SDNode *Parent, SDValue N, SDValue &Disp,
|
||||
return false;
|
||||
}
|
||||
|
||||
Base = AM.BaseReg;
|
||||
Disp = getI16Imm(AM.Disp, SDLoc(N));
|
||||
|
||||
LLVM_DEBUG(dbgs() << "SUCCESS\n");
|
||||
|
||||
@ -8,7 +8,7 @@ define ptr @get_addr() nounwind {
|
||||
; 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
|
||||
|
||||
@ -10,7 +10,7 @@ define dso_local ptr @get_addr() nounwind {
|
||||
; 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
|
||||
|
||||
@ -8,10 +8,10 @@ define dso_local ptr @get_addr() nounwind {
|
||||
; 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:
|
||||
|
||||
@ -8,7 +8,7 @@ define dso_local ptr @get_addr() nounwind {
|
||||
; 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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user