[llvm] 6f0759d - [SafeStack] Use ptrmask instead of ptrtoint+and+inttoptr (#181649)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 17 00:27:47 PST 2026
Author: Nikita Popov
Date: 2026-02-17T09:27:43+01:00
New Revision: 6f0759d5687eb81d775c590512bdc876b390d7c8
URL: https://github.com/llvm/llvm-project/commit/6f0759d5687eb81d775c590512bdc876b390d7c8
DIFF: https://github.com/llvm/llvm-project/commit/6f0759d5687eb81d775c590512bdc876b390d7c8.diff
LOG: [SafeStack] Use ptrmask instead of ptrtoint+and+inttoptr (#181649)
Use the provenance-preserving ptrmask intrinsic instead of
ptrtoint+and+inttoptr for pointer alignment.
Added:
Modified:
llvm/lib/CodeGen/SafeStack.cpp
llvm/test/Transforms/SafeStack/X86/byval.ll
llvm/test/Transforms/SafeStack/X86/setjmp2.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SafeStack.cpp b/llvm/lib/CodeGen/SafeStack.cpp
index a6e3d231b6fc7..ce7418dfed935 100644
--- a/llvm/lib/CodeGen/SafeStack.cpp
+++ b/llvm/lib/CodeGen/SafeStack.cpp
@@ -112,7 +112,7 @@ class SafeStack {
ScalarEvolution &SE;
Type *StackPtrTy;
- Type *IntPtrTy;
+ Type *AddrTy;
Type *Int32Ty;
Value *UnsafeStackPtr = nullptr;
@@ -189,7 +189,7 @@ class SafeStack {
DomTreeUpdater *DTU, ScalarEvolution &SE)
: F(F), TL(TL), Libcalls(Libcalls), DL(DL), DTU(DTU), SE(SE),
StackPtrTy(DL.getAllocaPtrType(F.getContext())),
- IntPtrTy(DL.getIntPtrType(F.getContext())),
+ AddrTy(DL.getAddressType(StackPtrTy)),
Int32Ty(Type::getInt32Ty(F.getContext())) {}
// Run the transformation on the associated function.
@@ -544,11 +544,9 @@ Value *SafeStack::moveStaticAllocasToUnsafeStack(
if (FrameAlignment > StackAlignment) {
// Re-align the base pointer according to the max requested alignment.
IRB.SetInsertPoint(BasePointer->getNextNode());
- BasePointer = cast<Instruction>(IRB.CreateIntToPtr(
- IRB.CreateAnd(
- IRB.CreatePtrToInt(BasePointer, IntPtrTy),
- ConstantInt::get(IntPtrTy, ~(FrameAlignment.value() - 1))),
- StackPtrTy));
+ BasePointer = IRB.CreateIntrinsic(
+ StackPtrTy, Intrinsic::ptrmask,
+ {BasePointer, ConstantInt::get(AddrTy, ~(FrameAlignment.value() - 1))});
}
IRB.SetInsertPoint(BasePointer->getNextNode());
@@ -663,18 +661,16 @@ void SafeStack::moveDynamicAllocasToUnsafeStack(
IRBuilder<> IRB(AI);
// Compute the new SP value (after AI).
- Value *Size = IRB.CreateAllocationSize(IntPtrTy, AI);
- Value *SP = IRB.CreatePtrToInt(IRB.CreateLoad(StackPtrTy, UnsafeStackPtr),
- IntPtrTy);
- SP = IRB.CreateSub(SP, Size);
+ Value *Size = IRB.CreateAllocationSize(AddrTy, AI);
+ Value *SP = IRB.CreateLoad(StackPtrTy, UnsafeStackPtr);
+ SP = IRB.CreatePtrAdd(SP, IRB.CreateNeg(Size));
// Align the SP value to satisfy the AllocaInst and stack alignments.
auto Align = std::max(AI->getAlign(), StackAlignment);
- Value *NewTop = IRB.CreateIntToPtr(
- IRB.CreateAnd(
- SP, ConstantInt::getSigned(IntPtrTy, ~uint64_t(Align.value() - 1))),
- StackPtrTy);
+ Value *NewTop = IRB.CreateIntrinsic(
+ StackPtrTy, Intrinsic::ptrmask,
+ {SP, ConstantInt::getSigned(AddrTy, ~uint64_t(Align.value() - 1))});
// Save the stack pointer.
IRB.CreateStore(NewTop, UnsafeStackPtr);
diff --git a/llvm/test/Transforms/SafeStack/X86/byval.ll b/llvm/test/Transforms/SafeStack/X86/byval.ll
index 279df22b9d5a3..1f6d5f4de05ba 100644
--- a/llvm/test/Transforms/SafeStack/X86/byval.ll
+++ b/llvm/test/Transforms/SafeStack/X86/byval.ll
@@ -55,8 +55,7 @@ define i32 @ByValUnsafeAligned(ptr byval(%struct.S) nocapture readonly align 64
entry:
; CHECK-LABEL: @ByValUnsafeAligned
; CHECK: %[[A:.*]] = load {{.*}} @__safestack_unsafe_stack_ptr
- ; CHECK: %[[B:.*]] = ptrtoint ptr %[[A]] to i64
- ; CHECK: and i64 %[[B]], -64
+ ; CHECK: call ptr @llvm.ptrmask.p0.i64(ptr %[[A]], i64 -64)
; CHECK: ret i32
%0 = load i32, ptr %zzz, align 64
%arrayidx2 = getelementptr inbounds %struct.S, ptr %zzz, i64 0, i32 0, i64 %idx
diff --git a/llvm/test/Transforms/SafeStack/X86/setjmp2.ll b/llvm/test/Transforms/SafeStack/X86/setjmp2.ll
index e72e2174a4b56..ae72e569d5c8d 100644
--- a/llvm/test/Transforms/SafeStack/X86/setjmp2.ll
+++ b/llvm/test/Transforms/SafeStack/X86/setjmp2.ll
@@ -21,13 +21,12 @@ define i32 @foo(i32 %size) nounwind uwtable safestack {
; I386-NEXT: store ptr [[UNSAFE_STACK_PTR]], ptr [[UNSAFE_STACK_DYNAMIC_PTR]], align 4
; I386-NEXT: [[TMP0:%.*]] = mul i32 [[SIZE]], 4
; I386-NEXT: [[TMP1:%.*]] = load ptr, ptr @__safestack_unsafe_stack_ptr, align 4
-; I386-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i32
-; I386-NEXT: [[TMP3:%.*]] = sub i32 [[TMP2]], [[TMP0]]
-; I386-NEXT: [[TMP4:%.*]] = and i32 [[TMP3]], -16
-; I386-NEXT: [[A:%.*]] = inttoptr i32 [[TMP4]] to ptr
+; I386-NEXT: [[TMP2:%.*]] = sub i32 0, [[TMP0]]
+; I386-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP1]], i32 [[TMP2]]
+; I386-NEXT: [[A:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[TMP3]], i32 -16)
; I386-NEXT: store ptr [[A]], ptr @__safestack_unsafe_stack_ptr, align 4
; I386-NEXT: store ptr [[A]], ptr [[UNSAFE_STACK_DYNAMIC_PTR]], align 4
-; I386-NEXT: [[CALL:%.*]] = call i32 @_setjmp(ptr @buf) #[[ATTR1:[0-9]+]]
+; I386-NEXT: [[CALL:%.*]] = call i32 @_setjmp(ptr @buf) #[[ATTR2:[0-9]+]]
; I386-NEXT: [[TMP5:%.*]] = load ptr, ptr [[UNSAFE_STACK_DYNAMIC_PTR]], align 4
; I386-NEXT: store ptr [[TMP5]], ptr @__safestack_unsafe_stack_ptr, align 4
; I386-NEXT: call void @funcall(ptr [[A]])
@@ -43,13 +42,12 @@ define i32 @foo(i32 %size) nounwind uwtable safestack {
; X86-64-NEXT: [[TMP0:%.*]] = zext i32 [[SIZE]] to i64
; X86-64-NEXT: [[TMP1:%.*]] = mul i64 [[TMP0]], 4
; X86-64-NEXT: [[TMP2:%.*]] = load ptr, ptr @__safestack_unsafe_stack_ptr, align 8
-; X86-64-NEXT: [[TMP3:%.*]] = ptrtoint ptr [[TMP2]] to i64
-; X86-64-NEXT: [[TMP4:%.*]] = sub i64 [[TMP3]], [[TMP1]]
-; X86-64-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], -16
-; X86-64-NEXT: [[A:%.*]] = inttoptr i64 [[TMP5]] to ptr
+; X86-64-NEXT: [[TMP3:%.*]] = sub i64 0, [[TMP1]]
+; X86-64-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP2]], i64 [[TMP3]]
+; X86-64-NEXT: [[A:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[TMP4]], i64 -16)
; X86-64-NEXT: store ptr [[A]], ptr @__safestack_unsafe_stack_ptr, align 8
; X86-64-NEXT: store ptr [[A]], ptr [[UNSAFE_STACK_DYNAMIC_PTR]], align 8
-; X86-64-NEXT: [[CALL:%.*]] = call i32 @_setjmp(ptr @buf) #[[ATTR1:[0-9]+]]
+; X86-64-NEXT: [[CALL:%.*]] = call i32 @_setjmp(ptr @buf) #[[ATTR2:[0-9]+]]
; X86-64-NEXT: [[TMP6:%.*]] = load ptr, ptr [[UNSAFE_STACK_DYNAMIC_PTR]], align 8
; X86-64-NEXT: store ptr [[TMP6]], ptr @__safestack_unsafe_stack_ptr, align 8
; X86-64-NEXT: call void @funcall(ptr [[A]])
More information about the llvm-commits
mailing list