[llvm] [aarch64] XOR the frame pointer with the stack cookie when protecting the stack (PR #161114)
Pan Tao via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 2 21:25:18 PST 2025
https://github.com/PanTao2 updated https://github.com/llvm/llvm-project/pull/161114
>From 9c6d4c7ef323e45a8171b63517e05a510aef1f84 Mon Sep 17 00:00:00 2001
From: "Pan, Tao" <tao.pan at intel.com>
Date: Mon, 29 Sep 2025 09:43:17 +0800
Subject: [PATCH 1/8] [aarch64] XOR the frame pointer with the stack cookie
when protecting the stack
---
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 12 +++++++++++-
llvm/lib/Target/AArch64/AArch64ISelLowering.h | 3 +++
llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp | 2 +-
3 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index a4c1e265f0e63..fffc060bbe7cd 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -28818,7 +28818,17 @@ void AArch64TargetLowering::ReplaceNodeResults(
bool AArch64TargetLowering::useLoadStackGuardNode(const Module &M) const {
if (Subtarget->isTargetAndroid() || Subtarget->isTargetFuchsia())
return TargetLowering::useLoadStackGuardNode(M);
- return true;
+ return false;
+}
+
+bool AArch64TargetLowering::useStackGuardXorFP() const { return true; }
+
+SDValue AArch64TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG,
+ SDValue Val,
+ const SDLoc &DL) const {
+ return DAG.getNode(
+ ISD::XOR, DL, Val.getValueType(), Val,
+ DAG.getRegister(getStackPointerRegisterToSaveRestore(), MVT::i64));
}
unsigned AArch64TargetLowering::combineRepeatedFPDivisors() const {
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
index d8072d15853ee..8073b0677a11b 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
@@ -349,6 +349,9 @@ class AArch64TargetLowering : public TargetLowering {
shouldExpandAtomicCmpXchgInIR(AtomicCmpXchgInst *AI) const override;
bool useLoadStackGuardNode(const Module &M) const override;
+ bool useStackGuardXorFP() const override;
+ SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
+ const SDLoc &DL) const override;
TargetLoweringBase::LegalizeTypeAction
getPreferredVectorAction(MVT VT) const override;
diff --git a/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp b/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
index d3b1aa621b61a..163de52386221 100644
--- a/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
@@ -32,7 +32,7 @@ AArch64SelectionDAGInfo::AArch64SelectionDAGInfo()
void AArch64SelectionDAGInfo::verifyTargetNode(const SelectionDAG &DAG,
const SDNode *N) const {
- SelectionDAGGenTargetInfo::verifyTargetNode(DAG, N);
+ // SelectionDAGGenTargetInfo::verifyTargetNode(DAG, N);
#ifndef NDEBUG
// Some additional checks not yet implemented by verifyTargetNode.
>From 00ddddafaed3c5550750f1cc0e3251dc609df8b7 Mon Sep 17 00:00:00 2001
From: "Pan, Tao" <tao.pan at intel.com>
Date: Mon, 29 Sep 2025 15:21:25 +0800
Subject: [PATCH 2/8] Change DAG.getRegister to DAG.getCopyFromReg
---
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index a722b5f42fa65..59f5cca45fb45 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -29101,9 +29101,10 @@ bool AArch64TargetLowering::useStackGuardXorFP() const { return true; }
SDValue AArch64TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG,
SDValue Val,
const SDLoc &DL) const {
- return DAG.getNode(
- ISD::XOR, DL, Val.getValueType(), Val,
- DAG.getRegister(getStackPointerRegisterToSaveRestore(), MVT::i64));
+ return DAG.getNode(ISD::XOR, DL, Val.getValueType(), Val,
+ DAG.getCopyFromReg(DAG.getEntryNode(), DL,
+ getStackPointerRegisterToSaveRestore(),
+ MVT::i64));
}
unsigned AArch64TargetLowering::combineRepeatedFPDivisors() const {
>From 5c230aecd2bd8c18f0f1ccae16e75a15f62c9b32 Mon Sep 17 00:00:00 2001
From: "Pan, Tao" <tao.pan at intel.com>
Date: Fri, 10 Oct 2025 08:58:21 +0800
Subject: [PATCH 3/8] Fix failed tests
---
.../Target/AArch64/AArch64ISelLowering.cpp | 11 +++++--
llvm/test/CodeGen/AArch64/mingw-refptr.ll | 30 +++++++++++--------
.../CodeGen/AArch64/stack-protector-target.ll | 12 ++++----
3 files changed, 33 insertions(+), 20 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 59f5cca45fb45..2ce9282c4156b 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -29093,10 +29093,17 @@ void AArch64TargetLowering::ReplaceNodeResults(
bool AArch64TargetLowering::useLoadStackGuardNode(const Module &M) const {
if (Subtarget->isTargetAndroid() || Subtarget->isTargetFuchsia())
return TargetLowering::useLoadStackGuardNode(M);
- return false;
+ return !Subtarget->getTargetTriple().isOSMSVCRT() ||
+ Subtarget->isTargetMachO() ||
+ getTargetMachine().Options.EnableGlobalISel;
}
-bool AArch64TargetLowering::useStackGuardXorFP() const { return true; }
+bool AArch64TargetLowering::useStackGuardXorFP() const {
+ // Currently only MSVC CRTs XOR the frame pointer into the stack guard value.
+ return Subtarget->getTargetTriple().isOSMSVCRT() &&
+ !Subtarget->isTargetMachO() &&
+ !getTargetMachine().Options.EnableGlobalISel;
+}
SDValue AArch64TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG,
SDValue Val,
diff --git a/llvm/test/CodeGen/AArch64/mingw-refptr.ll b/llvm/test/CodeGen/AArch64/mingw-refptr.ll
index cc9fac0506ff5..445888845f001 100644
--- a/llvm/test/CodeGen/AArch64/mingw-refptr.ll
+++ b/llvm/test/CodeGen/AArch64/mingw-refptr.ll
@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s -mtriple=aarch64-w64-mingw32 | FileCheck %s --check-prefixes=CHECK,CHECK-SD
-; RUN: llc < %s -mtriple=aarch64-w64-mingw32 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
+; RUN: llc < %s -mtriple=aarch64-w64-mingw32 -global-isel | FileCheck %s --check-prefixes=CHECK-GI
@var = external local_unnamed_addr global i32, align 4
@dsolocalvar = external dso_local local_unnamed_addr global i32, align 4
@@ -82,25 +82,31 @@ define dso_local void @sspFunc() #0 {
; CHECK-NEXT: // %bb.0: // %entry
; CHECK-NEXT: sub sp, sp, #32
; CHECK-NEXT: .seh_stackalloc 32
-; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
-; CHECK-NEXT: .seh_save_reg x30, 16
+; CHECK-NEXT: str x19, [sp, #16] // 8-byte Folded Spill
+; CHECK-NEXT: .seh_save_reg x19, 16
+; CHECK-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
+; CHECK-NEXT: .seh_save_reg x30, 24
; CHECK-NEXT: .seh_endprologue
-; CHECK-NEXT: adrp x8, .refptr.__stack_chk_guard
+; CHECK-NEXT: adrp x19, .refptr.__stack_chk_guard
+; CHECK-NEXT: mov x9, sp
; CHECK-NEXT: add x0, sp, #7
-; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
-; CHECK-NEXT: ldr x8, [x8]
+; CHECK-NEXT: ldr x19, [x19, :lo12:.refptr.__stack_chk_guard]
+; CHECK-NEXT: ldr x8, [x19]
+; CHECK-NEXT: eor x8, x8, x9
; CHECK-NEXT: str x8, [sp, #8]
; CHECK-NEXT: bl ptrUser
-; CHECK-NEXT: adrp x8, .refptr.__stack_chk_guard
-; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
; CHECK-NEXT: ldr x9, [sp, #8]
-; CHECK-NEXT: ldr x8, [x8]
-; CHECK-NEXT: cmp x8, x9
+; CHECK-NEXT: mov x8, sp
+; CHECK-NEXT: ldr x10, [x19]
+; CHECK-NEXT: eor x8, x9, x8
+; CHECK-NEXT: cmp x10, x8
; CHECK-NEXT: b.ne .LBB6_2
; CHECK-NEXT: // %bb.1: // %entry
; CHECK-NEXT: .seh_startepilogue
-; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
-; CHECK-NEXT: .seh_save_reg x30, 16
+; CHECK-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
+; CHECK-NEXT: .seh_save_reg x30, 24
+; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload
+; CHECK-NEXT: .seh_save_reg x19, 16
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .seh_stackalloc 32
; CHECK-NEXT: .seh_endepilogue
diff --git a/llvm/test/CodeGen/AArch64/stack-protector-target.ll b/llvm/test/CodeGen/AArch64/stack-protector-target.ll
index b1ddd1d0d160f..9940a4d75d09b 100644
--- a/llvm/test/CodeGen/AArch64/stack-protector-target.ll
+++ b/llvm/test/CodeGen/AArch64/stack-protector-target.ll
@@ -29,16 +29,16 @@ declare void @_Z7CapturePi(ptr)
; FUCHSIA-AARCH64-COMMON: ldr [[D:.*]], [sp,
; FUCHSIA-AARCH64-COMMON: cmp [[C]], [[D]]
-; WINDOWS-AARCH64: adrp x8, __security_cookie
-; WINDOWS-AARCH64: ldr x8, [x8, :lo12:__security_cookie]
+; WINDOWS-AARCH64: adrp x19, __security_cookie
+; WINDOWS-AARCH64: ldr x8, [x19, :lo12:__security_cookie]
; WINDOWS-AARCH64: str x8, [sp, #8]
; WINDOWS-AARCH64: bl _Z7CapturePi
-; WINDOWS-AARCH64: ldr x0, [sp, #8]
+; WINDOWS-AARCH64: ldr x8, [sp, #8]
; WINDOWS-AARCH64: bl __security_check_cookie
-; WINDOWS-ARM64EC: adrp x8, __security_cookie
-; WINDOWS-ARM64EC: ldr x8, [x8, :lo12:__security_cookie]
+; WINDOWS-ARM64EC: adrp x19, __security_cookie
+; WINDOWS-ARM64EC: ldr x8, [x19, :lo12:__security_cookie]
; WINDOWS-ARM64EC: str x8, [sp, #8]
; WINDOWS-ARM64EC: bl "#_Z7CapturePi"
-; WINDOWS-ARM64EC: ldr x0, [sp, #8]
+; WINDOWS-ARM64EC: ldr x8, [sp, #8]
; WINDOWS-ARM64EC: bl "#__security_check_cookie_arm64ec"
>From 12ded1eb51a757fee5229186589fc00b7cb38a76 Mon Sep 17 00:00:00 2001
From: "Pan, Tao" <tao.pan at intel.com>
Date: Thu, 16 Oct 2025 09:09:33 +0800
Subject: [PATCH 4/8] Add the EOR instruction in
AArch64InstrInfo::expandPostRAPseudo
---
.../Target/AArch64/AArch64ISelLowering.cpp | 20 +------------
llvm/lib/Target/AArch64/AArch64ISelLowering.h | 3 --
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 8 +++++
.../AArch64/AArch64SelectionDAGInfo.cpp | 2 +-
llvm/test/CodeGen/AArch64/mingw-refptr.ll | 30 ++++++++-----------
.../CodeGen/AArch64/stack-protector-target.ll | 14 +++++----
6 files changed, 30 insertions(+), 47 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 2ce9282c4156b..60aa61e993b26 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -29093,25 +29093,7 @@ void AArch64TargetLowering::ReplaceNodeResults(
bool AArch64TargetLowering::useLoadStackGuardNode(const Module &M) const {
if (Subtarget->isTargetAndroid() || Subtarget->isTargetFuchsia())
return TargetLowering::useLoadStackGuardNode(M);
- return !Subtarget->getTargetTriple().isOSMSVCRT() ||
- Subtarget->isTargetMachO() ||
- getTargetMachine().Options.EnableGlobalISel;
-}
-
-bool AArch64TargetLowering::useStackGuardXorFP() const {
- // Currently only MSVC CRTs XOR the frame pointer into the stack guard value.
- return Subtarget->getTargetTriple().isOSMSVCRT() &&
- !Subtarget->isTargetMachO() &&
- !getTargetMachine().Options.EnableGlobalISel;
-}
-
-SDValue AArch64TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG,
- SDValue Val,
- const SDLoc &DL) const {
- return DAG.getNode(ISD::XOR, DL, Val.getValueType(), Val,
- DAG.getCopyFromReg(DAG.getEntryNode(), DL,
- getStackPointerRegisterToSaveRestore(),
- MVT::i64));
+ return true;
}
unsigned AArch64TargetLowering::combineRepeatedFPDivisors() const {
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
index fe6ccdc5947fe..2cb8ed29f252a 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
@@ -358,9 +358,6 @@ class AArch64TargetLowering : public TargetLowering {
shouldExpandAtomicCmpXchgInIR(AtomicCmpXchgInst *AI) const override;
bool useLoadStackGuardNode(const Module &M) const override;
- bool useStackGuardXorFP() const override;
- SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
- const SDLoc &DL) const override;
TargetLoweringBase::LegalizeTypeAction
getPreferredVectorAction(MVT VT) const override;
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index 457e5402e0f46..ed1d9639500df 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -2310,6 +2310,14 @@ bool AArch64InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
.addGlobalAddress(GV, 0, LoFlags)
.addMemOperand(*MI.memoperands_begin());
}
+ if (Subtarget.getTargetTriple().isOSMSVCRT() &&
+ !Subtarget.getTargetLowering()
+ ->getTargetMachine()
+ .Options.EnableGlobalISel) {
+ BuildMI(MBB, MI, DL, get(AArch64::EORWrr), Reg)
+ .addReg(Reg, RegState::Kill)
+ .addReg(AArch64::SP);
+ }
}
MBB.erase(MI);
diff --git a/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp b/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
index 163de52386221..d3b1aa621b61a 100644
--- a/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
@@ -32,7 +32,7 @@ AArch64SelectionDAGInfo::AArch64SelectionDAGInfo()
void AArch64SelectionDAGInfo::verifyTargetNode(const SelectionDAG &DAG,
const SDNode *N) const {
- // SelectionDAGGenTargetInfo::verifyTargetNode(DAG, N);
+ SelectionDAGGenTargetInfo::verifyTargetNode(DAG, N);
#ifndef NDEBUG
// Some additional checks not yet implemented by verifyTargetNode.
diff --git a/llvm/test/CodeGen/AArch64/mingw-refptr.ll b/llvm/test/CodeGen/AArch64/mingw-refptr.ll
index 445888845f001..cc9fac0506ff5 100644
--- a/llvm/test/CodeGen/AArch64/mingw-refptr.ll
+++ b/llvm/test/CodeGen/AArch64/mingw-refptr.ll
@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s -mtriple=aarch64-w64-mingw32 | FileCheck %s --check-prefixes=CHECK,CHECK-SD
-; RUN: llc < %s -mtriple=aarch64-w64-mingw32 -global-isel | FileCheck %s --check-prefixes=CHECK-GI
+; RUN: llc < %s -mtriple=aarch64-w64-mingw32 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
@var = external local_unnamed_addr global i32, align 4
@dsolocalvar = external dso_local local_unnamed_addr global i32, align 4
@@ -82,31 +82,25 @@ define dso_local void @sspFunc() #0 {
; CHECK-NEXT: // %bb.0: // %entry
; CHECK-NEXT: sub sp, sp, #32
; CHECK-NEXT: .seh_stackalloc 32
-; CHECK-NEXT: str x19, [sp, #16] // 8-byte Folded Spill
-; CHECK-NEXT: .seh_save_reg x19, 16
-; CHECK-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
-; CHECK-NEXT: .seh_save_reg x30, 24
+; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
+; CHECK-NEXT: .seh_save_reg x30, 16
; CHECK-NEXT: .seh_endprologue
-; CHECK-NEXT: adrp x19, .refptr.__stack_chk_guard
-; CHECK-NEXT: mov x9, sp
+; CHECK-NEXT: adrp x8, .refptr.__stack_chk_guard
; CHECK-NEXT: add x0, sp, #7
-; CHECK-NEXT: ldr x19, [x19, :lo12:.refptr.__stack_chk_guard]
-; CHECK-NEXT: ldr x8, [x19]
-; CHECK-NEXT: eor x8, x8, x9
+; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
+; CHECK-NEXT: ldr x8, [x8]
; CHECK-NEXT: str x8, [sp, #8]
; CHECK-NEXT: bl ptrUser
+; CHECK-NEXT: adrp x8, .refptr.__stack_chk_guard
+; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
; CHECK-NEXT: ldr x9, [sp, #8]
-; CHECK-NEXT: mov x8, sp
-; CHECK-NEXT: ldr x10, [x19]
-; CHECK-NEXT: eor x8, x9, x8
-; CHECK-NEXT: cmp x10, x8
+; CHECK-NEXT: ldr x8, [x8]
+; CHECK-NEXT: cmp x8, x9
; CHECK-NEXT: b.ne .LBB6_2
; CHECK-NEXT: // %bb.1: // %entry
; CHECK-NEXT: .seh_startepilogue
-; CHECK-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
-; CHECK-NEXT: .seh_save_reg x30, 24
-; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload
-; CHECK-NEXT: .seh_save_reg x19, 16
+; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
+; CHECK-NEXT: .seh_save_reg x30, 16
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .seh_stackalloc 32
; CHECK-NEXT: .seh_endepilogue
diff --git a/llvm/test/CodeGen/AArch64/stack-protector-target.ll b/llvm/test/CodeGen/AArch64/stack-protector-target.ll
index 9940a4d75d09b..59045190c8892 100644
--- a/llvm/test/CodeGen/AArch64/stack-protector-target.ll
+++ b/llvm/test/CodeGen/AArch64/stack-protector-target.ll
@@ -29,16 +29,18 @@ declare void @_Z7CapturePi(ptr)
; FUCHSIA-AARCH64-COMMON: ldr [[D:.*]], [sp,
; FUCHSIA-AARCH64-COMMON: cmp [[C]], [[D]]
-; WINDOWS-AARCH64: adrp x19, __security_cookie
-; WINDOWS-AARCH64: ldr x8, [x19, :lo12:__security_cookie]
+; WINDOWS-AARCH64: adrp x8, __security_cookie
+; WINDOWS-AARCH64: ldr x8, [x8, :lo12:__security_cookie]
+; WINDOWS-AARCH64: eor x8, x8, sp
; WINDOWS-AARCH64: str x8, [sp, #8]
; WINDOWS-AARCH64: bl _Z7CapturePi
-; WINDOWS-AARCH64: ldr x8, [sp, #8]
+; WINDOWS-AARCH64: ldr x0, [sp, #8]
; WINDOWS-AARCH64: bl __security_check_cookie
-; WINDOWS-ARM64EC: adrp x19, __security_cookie
-; WINDOWS-ARM64EC: ldr x8, [x19, :lo12:__security_cookie]
+; WINDOWS-ARM64EC: adrp x8, __security_cookie
+; WINDOWS-ARM64EC: ldr x8, [x8, :lo12:__security_cookie]
+; WINDOWS-ARM64EC: eor x8, x8, sp
; WINDOWS-ARM64EC: str x8, [sp, #8]
; WINDOWS-ARM64EC: bl "#_Z7CapturePi"
-; WINDOWS-ARM64EC: ldr x8, [sp, #8]
+; WINDOWS-ARM64EC: ldr x0, [sp, #8]
; WINDOWS-ARM64EC: bl "#__security_check_cookie_arm64ec"
>From 23fbbbbf5e52dcdb04774f2d1041eba42df7cd1a Mon Sep 17 00:00:00 2001
From: "Pan, Tao" <tao.pan at intel.com>
Date: Thu, 16 Oct 2025 14:17:29 +0800
Subject: [PATCH 5/8] Add the eor instruction to any code model
---
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 17 +++++++++--------
llvm/test/CodeGen/AArch64/mingw-refptr.ll | 4 +++-
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index ed1d9639500df..8bc65f8b4c575 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -2310,14 +2310,15 @@ bool AArch64InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
.addGlobalAddress(GV, 0, LoFlags)
.addMemOperand(*MI.memoperands_begin());
}
- if (Subtarget.getTargetTriple().isOSMSVCRT() &&
- !Subtarget.getTargetLowering()
- ->getTargetMachine()
- .Options.EnableGlobalISel) {
- BuildMI(MBB, MI, DL, get(AArch64::EORWrr), Reg)
- .addReg(Reg, RegState::Kill)
- .addReg(AArch64::SP);
- }
+ }
+ // To match MSVC
+ if (Subtarget.getTargetTriple().isOSMSVCRT() &&
+ !Subtarget.getTargetLowering()
+ ->getTargetMachine()
+ .Options.EnableGlobalISel) {
+ BuildMI(MBB, MI, DL, get(AArch64::EORWrr), Reg)
+ .addReg(Reg, RegState::Kill)
+ .addReg(AArch64::SP);
}
MBB.erase(MI);
diff --git a/llvm/test/CodeGen/AArch64/mingw-refptr.ll b/llvm/test/CodeGen/AArch64/mingw-refptr.ll
index cc9fac0506ff5..fb95d945b8e22 100644
--- a/llvm/test/CodeGen/AArch64/mingw-refptr.ll
+++ b/llvm/test/CodeGen/AArch64/mingw-refptr.ll
@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s -mtriple=aarch64-w64-mingw32 | FileCheck %s --check-prefixes=CHECK,CHECK-SD
-; RUN: llc < %s -mtriple=aarch64-w64-mingw32 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
+; RUN: llc < %s -mtriple=aarch64-w64-mingw32 -global-isel | FileCheck %s --check-prefixes=CHECK-GI
@var = external local_unnamed_addr global i32, align 4
@dsolocalvar = external dso_local local_unnamed_addr global i32, align 4
@@ -89,12 +89,14 @@ define dso_local void @sspFunc() #0 {
; CHECK-NEXT: add x0, sp, #7
; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
; CHECK-NEXT: ldr x8, [x8]
+; CHECK-NEXT: eor x8, x8, sp
; CHECK-NEXT: str x8, [sp, #8]
; CHECK-NEXT: bl ptrUser
; CHECK-NEXT: adrp x8, .refptr.__stack_chk_guard
; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
; CHECK-NEXT: ldr x9, [sp, #8]
; CHECK-NEXT: ldr x8, [x8]
+; CHECK-NEXT: eor x8, x8, sp
; CHECK-NEXT: cmp x8, x9
; CHECK-NEXT: b.ne .LBB6_2
; CHECK-NEXT: // %bb.1: // %entry
>From c61707ae9c8a92770b66b28f4a8b3bd55d3708bc Mon Sep 17 00:00:00 2001
From: "Pan, Tao" <tao.pan at intel.com>
Date: Fri, 17 Oct 2025 09:45:22 +0800
Subject: [PATCH 6/8] Add the eor instruction in the failure BB
---
llvm/include/llvm/CodeGen/TargetLowering.h | 2 +-
.../SelectionDAG/SelectionDAGBuilder.cpp | 6 +++---
.../Target/AArch64/AArch64ISelLowering.cpp | 19 +++++++++++++++++++
llvm/lib/Target/AArch64/AArch64ISelLowering.h | 3 +++
llvm/lib/Target/X86/X86ISelLowering.cpp | 3 ++-
llvm/lib/Target/X86/X86ISelLowering.h | 5 ++---
.../CodeGen/AArch64/stack-protector-target.ll | 8 ++++++--
7 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index 1920b98c8a1ef..3dbae93c76efd 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -5798,7 +5798,7 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
virtual bool useLoadStackGuardNode(const Module &M) const { return false; }
virtual SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
- const SDLoc &DL) const {
+ const SDLoc &DL, bool FailureBB) const {
llvm_unreachable("not implemented for this target");
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index a52265055c88a..d12a46ebfe66c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -3129,7 +3129,7 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,
MachineMemOperand::MOVolatile);
if (TLI.useStackGuardXorFP())
- GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
+ GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl, false);
// If we're using function-based instrumentation, call the guard check
// function
@@ -3238,7 +3238,7 @@ void SelectionDAGBuilder::visitSPDescriptorFailure(
MachineMemOperand::MOVolatile);
if (TLI.useStackGuardXorFP())
- GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
+ GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl, true);
// The target provides a guard check function to validate the guard value.
// Generate a call to that function with the content of the guard slot as
@@ -7381,7 +7381,7 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
MachineMemOperand::MOVolatile);
}
if (TLI.useStackGuardXorFP())
- Res = TLI.emitStackGuardXorFP(DAG, Res, sdl);
+ Res = TLI.emitStackGuardXorFP(DAG, Res, sdl, false);
DAG.setRoot(Chain);
setValue(&I, Res);
return;
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 60aa61e993b26..a8e98d92771a2 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -29096,6 +29096,25 @@ bool AArch64TargetLowering::useLoadStackGuardNode(const Module &M) const {
return true;
}
+bool AArch64TargetLowering::useStackGuardXorFP() const {
+ // Currently only MSVC CRTs XOR the frame pointer into the stack guard value.
+ return Subtarget->getTargetTriple().isOSMSVCRT() &&
+ !Subtarget->isTargetMachO() &&
+ !getTargetMachine().Options.EnableGlobalISel;
+}
+
+SDValue AArch64TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG,
+ SDValue Val, const SDLoc &DL,
+ bool FailureBB) const {
+ if (FailureBB) {
+ return DAG.getNode(
+ ISD::XOR, DL, Val.getValueType(), Val,
+ DAG.getCopyFromReg(DAG.getEntryNode(), DL,
+ getStackPointerRegisterToSaveRestore(), MVT::i64));
+ }
+ return Val;
+}
+
unsigned AArch64TargetLowering::combineRepeatedFPDivisors() const {
// Combine multiple FDIVs with the same divisor into multiple FMULs by the
// reciprocal if there are three or more FDIVs.
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
index 2cb8ed29f252a..405a0103f1944 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
@@ -358,6 +358,9 @@ class AArch64TargetLowering : public TargetLowering {
shouldExpandAtomicCmpXchgInIR(AtomicCmpXchgInst *AI) const override;
bool useLoadStackGuardNode(const Module &M) const override;
+ bool useStackGuardXorFP() const override;
+ SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL,
+ bool FailureBB) const override;
TargetLoweringBase::LegalizeTypeAction
getPreferredVectorAction(MVT VT) const override;
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 5785440a20e43..4420cf628962a 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -2739,7 +2739,8 @@ bool X86TargetLowering::useStackGuardXorFP() const {
}
SDValue X86TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
- const SDLoc &DL) const {
+ const SDLoc &DL,
+ bool FailureBB) const {
EVT PtrTy = getPointerTy(DAG.getDataLayout());
unsigned XorOp = Subtarget.is64Bit() ? X86::XOR64_FP : X86::XOR32_FP;
MachineSDNode *Node = DAG.getMachineNode(XorOp, DL, PtrTy, Val);
diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h
index b7151f65942b4..752b94520c4c4 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.h
+++ b/llvm/lib/Target/X86/X86ISelLowering.h
@@ -1592,9 +1592,8 @@ namespace llvm {
bool useLoadStackGuardNode(const Module &M) const override;
bool useStackGuardXorFP() const override;
void insertSSPDeclarations(Module &M) const override;
- SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
- const SDLoc &DL) const override;
-
+ SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL,
+ bool FailureBB) const override;
/// Return true if the target stores SafeStack pointer at a fixed offset in
/// some non-standard address space, and populates the address space and
diff --git a/llvm/test/CodeGen/AArch64/stack-protector-target.ll b/llvm/test/CodeGen/AArch64/stack-protector-target.ll
index 59045190c8892..201950a6355a3 100644
--- a/llvm/test/CodeGen/AArch64/stack-protector-target.ll
+++ b/llvm/test/CodeGen/AArch64/stack-protector-target.ll
@@ -34,7 +34,9 @@ declare void @_Z7CapturePi(ptr)
; WINDOWS-AARCH64: eor x8, x8, sp
; WINDOWS-AARCH64: str x8, [sp, #8]
; WINDOWS-AARCH64: bl _Z7CapturePi
-; WINDOWS-AARCH64: ldr x0, [sp, #8]
+; WINDOWS-AARCH64: ldr x8, [sp, #8]
+; WINDOWS-AARCH64: mov x9, sp
+; WINDOWS-AARCH64: eor x0, x8, x9
; WINDOWS-AARCH64: bl __security_check_cookie
; WINDOWS-ARM64EC: adrp x8, __security_cookie
@@ -42,5 +44,7 @@ declare void @_Z7CapturePi(ptr)
; WINDOWS-ARM64EC: eor x8, x8, sp
; WINDOWS-ARM64EC: str x8, [sp, #8]
; WINDOWS-ARM64EC: bl "#_Z7CapturePi"
-; WINDOWS-ARM64EC: ldr x0, [sp, #8]
+; WINDOWS-ARM64EC: ldr x8, [sp, #8]
+; WINDOWS-ARM64EC: mov x9, sp
+; WINDOWS-ARM64EC: eor x0, x8, x9
; WINDOWS-ARM64EC: bl "#__security_check_cookie_arm64ec"
>From 2b02cb2b8d25c2ec222536d609f8cc4e40d24699 Mon Sep 17 00:00:00 2001
From: "Pan, Tao" <tao.pan at intel.com>
Date: Tue, 21 Oct 2025 09:17:57 +0800
Subject: [PATCH 7/8] Remove the isTargetMachO() check and change EORWrr to
EORXrr
---
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 1 -
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index a8e98d92771a2..37b9c01d730d3 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -29099,7 +29099,6 @@ bool AArch64TargetLowering::useLoadStackGuardNode(const Module &M) const {
bool AArch64TargetLowering::useStackGuardXorFP() const {
// Currently only MSVC CRTs XOR the frame pointer into the stack guard value.
return Subtarget->getTargetTriple().isOSMSVCRT() &&
- !Subtarget->isTargetMachO() &&
!getTargetMachine().Options.EnableGlobalISel;
}
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index 8bc65f8b4c575..312c159748cda 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -2316,7 +2316,7 @@ bool AArch64InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
!Subtarget.getTargetLowering()
->getTargetMachine()
.Options.EnableGlobalISel) {
- BuildMI(MBB, MI, DL, get(AArch64::EORWrr), Reg)
+ BuildMI(MBB, MI, DL, get(AArch64::EORXrr), Reg)
.addReg(Reg, RegState::Kill)
.addReg(AArch64::SP);
}
>From 823bd2f250d8d0ab9778a66aa2741fb1597a7ee7 Mon Sep 17 00:00:00 2001
From: "Pan, Tao" <tao.pan at intel.com>
Date: Mon, 3 Nov 2025 12:44:48 +0800
Subject: [PATCH 8/8] Change the mixed instruction from xor to sub and change
interface name from xor to mix
---
llvm/include/llvm/CodeGen/TargetLowering.h | 10 +++++-----
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 5 +++--
.../lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 12 ++++++------
llvm/lib/CodeGen/StackProtector.cpp | 2 +-
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 11 ++++++-----
llvm/lib/Target/AArch64/AArch64ISelLowering.h | 7 ++++---
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 6 +++---
llvm/lib/Target/X86/X86ISelLowering.cpp | 8 ++++----
llvm/lib/Target/X86/X86ISelLowering.h | 7 ++++---
llvm/test/CodeGen/AArch64/mingw-refptr.ll | 4 ++--
llvm/test/CodeGen/AArch64/stack-protector-target.ll | 8 ++++----
11 files changed, 42 insertions(+), 38 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index 3dbae93c76efd..3eb39ca083416 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -2134,11 +2134,10 @@ class LLVM_ABI TargetLoweringBase {
/// getIRStackGuard returns nullptr.
virtual Value *getSDagStackGuard(const Module &M) const;
- /// If this function returns true, stack protection checks should XOR the
- /// frame pointer (or whichever pointer is used to address locals) into the
+ /// If this function returns true, stack protection checks should mix the
/// stack guard value before checking it. getIRStackGuard must return nullptr
/// if this returns true.
- virtual bool useStackGuardXorFP() const { return false; }
+ virtual bool useStackGuardMixCookie() const { return false; }
/// If the target has a standard stack protection check function that
/// performs validation and error handling, returns the function. Otherwise,
@@ -5797,8 +5796,9 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
/// LOAD_STACK_GUARD node when it is lowering Intrinsic::stackprotector.
virtual bool useLoadStackGuardNode(const Module &M) const { return false; }
- virtual SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
- const SDLoc &DL, bool FailureBB) const {
+ virtual SDValue emitStackGuardMixCookie(SelectionDAG &DAG, SDValue Val,
+ const SDLoc &DL,
+ bool FailureBB) const {
llvm_unreachable("not implemented for this target");
}
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 1fc90d0852aad..75c233f08f03d 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -3934,8 +3934,9 @@ bool IRTranslator::emitSPDescriptorParent(StackProtectorDescriptor &SPD,
MachineMemOperand::MOLoad | MachineMemOperand::MOVolatile)
.getReg(0);
- if (TLI->useStackGuardXorFP()) {
- LLVM_DEBUG(dbgs() << "Stack protector xor'ing with FP not yet implemented");
+ if (TLI->useStackGuardMixCookie()) {
+ LLVM_DEBUG(
+ dbgs() << "Stack protector mix'ing the cookie not yet implemented");
return false;
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index d12a46ebfe66c..62880dac62657 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -3128,8 +3128,8 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,
MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
MachineMemOperand::MOVolatile);
- if (TLI.useStackGuardXorFP())
- GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl, false);
+ if (TLI.useStackGuardMixCookie())
+ GuardVal = TLI.emitStackGuardMixCookie(DAG, GuardVal, dl, false);
// If we're using function-based instrumentation, call the guard check
// function
@@ -3237,8 +3237,8 @@ void SelectionDAGBuilder::visitSPDescriptorFailure(
MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
MachineMemOperand::MOVolatile);
- if (TLI.useStackGuardXorFP())
- GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl, true);
+ if (TLI.useStackGuardMixCookie())
+ GuardVal = TLI.emitStackGuardMixCookie(DAG, GuardVal, dl, true);
// The target provides a guard check function to validate the guard value.
// Generate a call to that function with the content of the guard slot as
@@ -7380,8 +7380,8 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
MachinePointerInfo(Global, 0), Align,
MachineMemOperand::MOVolatile);
}
- if (TLI.useStackGuardXorFP())
- Res = TLI.emitStackGuardXorFP(DAG, Res, sdl, false);
+ if (TLI.useStackGuardMixCookie())
+ Res = TLI.emitStackGuardMixCookie(DAG, Res, sdl, false);
DAG.setRoot(Chain);
setValue(&I, Res);
return;
diff --git a/llvm/lib/CodeGen/StackProtector.cpp b/llvm/lib/CodeGen/StackProtector.cpp
index 2a8234a37a167..346f9eecb9af9 100644
--- a/llvm/lib/CodeGen/StackProtector.cpp
+++ b/llvm/lib/CodeGen/StackProtector.cpp
@@ -577,7 +577,7 @@ bool InsertStackProtectors(const TargetMachine *TM, Function *F,
// impossible to emit the check in IR, so the target *must* support stack
// protection in SDAG.
bool SupportsSelectionDAGSP =
- TLI->useStackGuardXorFP() ||
+ TLI->useStackGuardMixCookie() ||
(EnableSelectionDAGSP && !TM->Options.EnableFastISel);
AllocaInst *AI = nullptr; // Place on stack that stores the stack guard.
BasicBlock *FailBB = nullptr;
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 37b9c01d730d3..4f5b6ebaf1917 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -29096,18 +29096,19 @@ bool AArch64TargetLowering::useLoadStackGuardNode(const Module &M) const {
return true;
}
-bool AArch64TargetLowering::useStackGuardXorFP() const {
+bool AArch64TargetLowering::useStackGuardMixCookie() const {
// Currently only MSVC CRTs XOR the frame pointer into the stack guard value.
return Subtarget->getTargetTriple().isOSMSVCRT() &&
!getTargetMachine().Options.EnableGlobalISel;
}
-SDValue AArch64TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG,
- SDValue Val, const SDLoc &DL,
- bool FailureBB) const {
+SDValue AArch64TargetLowering::emitStackGuardMixCookie(SelectionDAG &DAG,
+ SDValue Val,
+ const SDLoc &DL,
+ bool FailureBB) const {
if (FailureBB) {
return DAG.getNode(
- ISD::XOR, DL, Val.getValueType(), Val,
+ ISD::ADD, DL, Val.getValueType(), Val,
DAG.getCopyFromReg(DAG.getEntryNode(), DL,
getStackPointerRegisterToSaveRestore(), MVT::i64));
}
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
index 405a0103f1944..46057e2d89979 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
@@ -358,9 +358,10 @@ class AArch64TargetLowering : public TargetLowering {
shouldExpandAtomicCmpXchgInIR(AtomicCmpXchgInst *AI) const override;
bool useLoadStackGuardNode(const Module &M) const override;
- bool useStackGuardXorFP() const override;
- SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL,
- bool FailureBB) const override;
+ bool useStackGuardMixCookie() const override;
+ SDValue emitStackGuardMixCookie(SelectionDAG &DAG, SDValue Val,
+ const SDLoc &DL,
+ bool FailureBB) const override;
TargetLoweringBase::LegalizeTypeAction
getPreferredVectorAction(MVT VT) const override;
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index 312c159748cda..091608abcef74 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -2316,9 +2316,9 @@ bool AArch64InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
!Subtarget.getTargetLowering()
->getTargetMachine()
.Options.EnableGlobalISel) {
- BuildMI(MBB, MI, DL, get(AArch64::EORXrr), Reg)
- .addReg(Reg, RegState::Kill)
- .addReg(AArch64::SP);
+ BuildMI(MBB, MI, DL, get(AArch64::SUBXrr), Reg)
+ .addReg(AArch64::SP)
+ .addReg(Reg, RegState::Kill);
}
MBB.erase(MI);
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 4420cf628962a..1aad8b694a107 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -2733,14 +2733,14 @@ bool X86TargetLowering::useLoadStackGuardNode(const Module &M) const {
return Subtarget.isTargetMachO() && Subtarget.is64Bit();
}
-bool X86TargetLowering::useStackGuardXorFP() const {
+bool X86TargetLowering::useStackGuardMixCookie() const {
// Currently only MSVC CRTs XOR the frame pointer into the stack guard value.
return Subtarget.getTargetTriple().isOSMSVCRT() && !Subtarget.isTargetMachO();
}
-SDValue X86TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
- const SDLoc &DL,
- bool FailureBB) const {
+SDValue X86TargetLowering::emitStackGuardMixCookie(SelectionDAG &DAG,
+ SDValue Val, const SDLoc &DL,
+ bool FailureBB) const {
EVT PtrTy = getPointerTy(DAG.getDataLayout());
unsigned XorOp = Subtarget.is64Bit() ? X86::XOR64_FP : X86::XOR32_FP;
MachineSDNode *Node = DAG.getMachineNode(XorOp, DL, PtrTy, Val);
diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h
index 752b94520c4c4..0b8ffe74512a4 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.h
+++ b/llvm/lib/Target/X86/X86ISelLowering.h
@@ -1590,10 +1590,11 @@ namespace llvm {
Value *getIRStackGuard(IRBuilderBase &IRB) const override;
bool useLoadStackGuardNode(const Module &M) const override;
- bool useStackGuardXorFP() const override;
+ bool useStackGuardMixCookie() const override;
void insertSSPDeclarations(Module &M) const override;
- SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL,
- bool FailureBB) const override;
+ SDValue emitStackGuardMixCookie(SelectionDAG &DAG, SDValue Val,
+ const SDLoc &DL,
+ bool FailureBB) const override;
/// Return true if the target stores SafeStack pointer at a fixed offset in
/// some non-standard address space, and populates the address space and
diff --git a/llvm/test/CodeGen/AArch64/mingw-refptr.ll b/llvm/test/CodeGen/AArch64/mingw-refptr.ll
index fb95d945b8e22..5689fcf7997ce 100644
--- a/llvm/test/CodeGen/AArch64/mingw-refptr.ll
+++ b/llvm/test/CodeGen/AArch64/mingw-refptr.ll
@@ -89,14 +89,14 @@ define dso_local void @sspFunc() #0 {
; CHECK-NEXT: add x0, sp, #7
; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
; CHECK-NEXT: ldr x8, [x8]
-; CHECK-NEXT: eor x8, x8, sp
+; CHECK-NEXT: sub x8, sp, x8
; CHECK-NEXT: str x8, [sp, #8]
; CHECK-NEXT: bl ptrUser
; CHECK-NEXT: adrp x8, .refptr.__stack_chk_guard
; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
; CHECK-NEXT: ldr x9, [sp, #8]
; CHECK-NEXT: ldr x8, [x8]
-; CHECK-NEXT: eor x8, x8, sp
+; CHECK-NEXT: sub x8, sp, x8
; CHECK-NEXT: cmp x8, x9
; CHECK-NEXT: b.ne .LBB6_2
; CHECK-NEXT: // %bb.1: // %entry
diff --git a/llvm/test/CodeGen/AArch64/stack-protector-target.ll b/llvm/test/CodeGen/AArch64/stack-protector-target.ll
index 201950a6355a3..4c8c25a31faa1 100644
--- a/llvm/test/CodeGen/AArch64/stack-protector-target.ll
+++ b/llvm/test/CodeGen/AArch64/stack-protector-target.ll
@@ -31,20 +31,20 @@ declare void @_Z7CapturePi(ptr)
; WINDOWS-AARCH64: adrp x8, __security_cookie
; WINDOWS-AARCH64: ldr x8, [x8, :lo12:__security_cookie]
-; WINDOWS-AARCH64: eor x8, x8, sp
+; WINDOWS-AARCH64: sub x8, sp, x8
; WINDOWS-AARCH64: str x8, [sp, #8]
; WINDOWS-AARCH64: bl _Z7CapturePi
; WINDOWS-AARCH64: ldr x8, [sp, #8]
; WINDOWS-AARCH64: mov x9, sp
-; WINDOWS-AARCH64: eor x0, x8, x9
+; WINDOWS-AARCH64: add x0, x8, x9
; WINDOWS-AARCH64: bl __security_check_cookie
; WINDOWS-ARM64EC: adrp x8, __security_cookie
; WINDOWS-ARM64EC: ldr x8, [x8, :lo12:__security_cookie]
-; WINDOWS-ARM64EC: eor x8, x8, sp
+; WINDOWS-ARM64EC: sub x8, sp, x8
; WINDOWS-ARM64EC: str x8, [sp, #8]
; WINDOWS-ARM64EC: bl "#_Z7CapturePi"
; WINDOWS-ARM64EC: ldr x8, [sp, #8]
; WINDOWS-ARM64EC: mov x9, sp
-; WINDOWS-ARM64EC: eor x0, x8, x9
+; WINDOWS-ARM64EC: add x0, x8, x9
; WINDOWS-ARM64EC: bl "#__security_check_cookie_arm64ec"
More information about the llvm-commits
mailing list