Skip to content

Commit 26c37b4

Browse files
committed
[X86] Don't allow prologue stack probing with live EFLAGS
Fixes #49509 Differential Revision: https://reviews.llvm.org/D134494
1 parent 4dcfb09 commit 26c37b4

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

llvm/lib/Target/X86/X86FrameLowering.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -3509,6 +3509,12 @@ bool X86FrameLowering::canUseAsPrologue(const MachineBasicBlock &MBB) const {
35093509
if (!MBB.isLiveIn(X86::EFLAGS))
35103510
return true;
35113511

3512+
// If stack probes have to loop inline or call, that will clobber EFLAGS.
3513+
const X86Subtarget &STI = MF.getSubtarget<X86Subtarget>();
3514+
const X86TargetLowering &TLI = *STI.getTargetLowering();
3515+
if (TLI.hasInlineStackProbe(MF) || TLI.hasStackProbeSymbol(MF))
3516+
return false;
3517+
35123518
const X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
35133519
return !TRI->hasStackRealignment(MF) && !X86FI->hasSwiftAsyncContext();
35143520
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s | FileCheck %s
3+
4+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
5+
target triple = "x86_64-unknown-linux-gnu"
6+
7+
; https://github.com/llvm/llvm-project/issues/49509
8+
; Stack probes must not clobber live EFLAGS. Previously, the prologue was
9+
; inserted in %bb.2, with "subq $8, %rsp" clobbering the "sets %bl" flag.
10+
11+
define i32 @f(i32 %a, i32 %b) #0 {
12+
; CHECK-LABEL: f:
13+
; CHECK: # %bb.0: # %bb13.i
14+
; CHECK-NEXT: pushq %rbp
15+
; CHECK-NEXT: pushq %rbx
16+
; CHECK-NEXT: subq $8, %rsp
17+
; CHECK-NEXT: testl %edi, %edi
18+
; CHECK-NEXT: je .LBB0_1
19+
; CHECK-NEXT: # %bb.2: # %bb16.i
20+
; CHECK-NEXT: sets %bl
21+
; CHECK-NEXT: testl %esi, %esi
22+
; CHECK-NEXT: sets %bpl
23+
; CHECK-NEXT: xorl %eax, %eax
24+
; CHECK-NEXT: callq *%rax
25+
; CHECK-NEXT: movb $1, %al
26+
; CHECK-NEXT: testb %al, %al
27+
; CHECK-NEXT: xorb %bpl, %bl
28+
; CHECK-NEXT: testb %al, %al
29+
; CHECK-NEXT: xorb $1, %bl
30+
; CHECK-NEXT: movzbl %bl, %eax
31+
; CHECK-NEXT: jmp .LBB0_3
32+
; CHECK-NEXT: .LBB0_1:
33+
; CHECK-NEXT: xorl %eax, %eax
34+
; CHECK-NEXT: .LBB0_3: # %exit2
35+
; CHECK-NEXT: addq $8, %rsp
36+
; CHECK-NEXT: popq %rbx
37+
; CHECK-NEXT: popq %rbp
38+
; CHECK-NEXT: retq
39+
bb13.i:
40+
%0 = icmp eq i32 %a, 0
41+
br i1 %0, label %exit2, label %bb16.i
42+
43+
bb16.i: ; preds = %bb13.i
44+
%1 = icmp slt i32 %a, 0
45+
%2 = icmp slt i32 %b, 0
46+
%sign_z.i = xor i1 %1, %2
47+
br label %exit1
48+
49+
exit1: ; preds = %bb16.i
50+
%3 = call { i64, i64 } null()
51+
%4 = icmp eq i64 0, 0
52+
br i1 %4, label %bb41.i, label %bb33.i
53+
54+
bb33.i: ; preds = %exit1
55+
%rcarry.not.i = icmp ult i64 0, 0
56+
br label %bb41.i
57+
58+
bb41.i: ; preds = %bb33.i, %exit1
59+
br label %bb62.i
60+
61+
bb62.i: ; preds = %bb41.i
62+
%_109.not.i = icmp eq i8 0, 0
63+
br i1 %_109.not.i, label %bb70.i, label %bb64.i
64+
65+
bb64.i: ; preds = %bb62.i
66+
%5 = icmp ne i64 0, 0
67+
br label %bb70.i
68+
69+
bb70.i: ; preds = %bb64.i, %bb62.i
70+
%spec.select.i.i = select i1 %sign_z.i, i32 0, i32 1
71+
br label %exit2
72+
73+
exit2: ; preds = %bb70.i, %bb13.i
74+
%.1.i = phi i32 [ %spec.select.i.i, %bb70.i ], [ 0, %bb13.i ]
75+
ret i32 %.1.i
76+
}
77+
78+
attributes #0 = { nounwind "probe-stack"="inline-asm" }

0 commit comments

Comments
 (0)