Skip to content

Commit 82a49e2

Browse files
committed
Incorporated code review changes and added alloca and spills test cases.
1 parent 2dd9f4e commit 82a49e2

File tree

6 files changed

+301
-189
lines changed

6 files changed

+301
-189
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4620,26 +4620,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
46204620
Address Buf = EmitPointerWithAlignment(E->getArg(0));
46214621

46224622
if (getTarget().getTriple().getArch() == llvm::Triple::systemz) {
4623-
// Call LLVM's EH setjmp, which is lightweight.
4624-
// We're not filling any fields of the jmp_buf here and leave
4625-
// it all to the back-end.
4626-
// Current LLVM implementation and documentation of the builtin is
4627-
// somewhat inconsistent with itself. The documentation starts out with:
4628-
// The buffer format and the overall functioning of this intrinsic is
4629-
// compatible with the GCC __builtin_setjmp implementation allowing code
4630-
// built with the clang and GCC to interoperate.
4631-
// But in GCC the format of the buffer is completely target-dependent,
4632-
// while LLVM attempts to impose some constraints on certain fields.
4633-
// 1. LLVM documentation continues with - The front end places the frame
4634-
// pointer in the first word - What clang puts into the first word,
4635-
// however, is the result of the frameaddress intrinsic - this value
4636-
// matches the frame pointer register contents on some but not all
4637-
// targets. On SystemZ these values differ, which would cause
4638-
// incompatibilties with GCC.
4639-
// 2. Clang front-end also writes the stack pointer into the third
4640-
// slot. Not only is this not even mentioned in the docs, it also does
4641-
// not match GCC behavior on all targets. On SystemZ we use the fourth
4642-
// slot.
4623+
// On this target, the back end fills in the context buffer completely.
46434624
Function *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
46444625
return RValue::get(Builder.CreateCall(F, Buf.emitRawPointer(*this)));
46454626
}

clang/test/CodeGen/SystemZ/builtin-setjmp-logjmp-backchain.c

Lines changed: 0 additions & 25 deletions
This file was deleted.

llvm/lib/Target/SystemZ/SystemZISelLowering.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===-- SystemZISelLowering.cpp - SystemZ DAG lowering implementation -----===//
1+
//===-- systemzisellowering.cpp - systemz dag lowering implementation -----===//
22
//
33
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44
// See https://llvm.org/LICENSE.txt for license information.
@@ -987,7 +987,7 @@ SystemZTargetLowering::emitEHSjLjSetJmp(MachineInstr &MI,
987987
// | phi(v_mainMBB,v_restoreMBB) |
988988
// -----------------------------
989989
// thisMBB:
990-
// buf[0] = Frame Pointer if hasFP.
990+
// buf[FPOffset] = Frame Pointer if hasFP.
991991
// buf[LabelOffset] = restoreMBB <-- takes address of restoreMBB.
992992
// buf[BCOffset] = Backchain value if building with -mbackchain.
993993
// buf[SPOffset] = Stack Pointer.
@@ -6533,10 +6533,10 @@ SDValue SystemZTargetLowering::LowerOperation(SDValue Op,
65336533
return lowerREADCYCLECOUNTER(Op, DAG);
65346534
case ISD::EH_SJLJ_SETJMP:
65356535
case ISD::EH_SJLJ_LONGJMP:
6536-
// These operations action are Legal now, not Custom. The reason we need
6537-
// to keep it here is that common code treats these Pseudos as Custom,
6538-
// and expands them using EmitInstrWithCustomInserter in FinalizeISel.cpp
6539-
// after ISel.
6536+
// These operations are legal on our platform, but we cannot actually
6537+
// set the operation action to Legal as common code would treat this
6538+
// as equivalent to Expand. Instead, we keep the operation action to
6539+
// Custom and just leave them unchanged here.
65406540
return Op;
65416541

65426542
default:
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; Test setjmp store to jmp_buf when frame pointer is used and saved
3+
; because of variable size alloca.
4+
; Frame Pointer is stored in slot 1.
5+
; Return address in slot 2.
6+
; Backchain value is stored in slot 3 for -mbackchain option.
7+
; Stack Pointer in slot 4.
8+
; Clobber %r6-%r15, %f8-%f15.
9+
10+
; RUN: llc < %s -mtriple=s390x-linux-gnu -O2 | FileCheck %s
11+
12+
declare i32 @llvm.eh.sjlj.setjmp(ptr)
13+
@buf = global [20 x ptr] zeroinitializer, align 8
14+
15+
define signext i32 @foo() "frame-pointer"="all" {
16+
; CHECK-LABEL: foo:
17+
; CHECK: # %bb.0: # %entry
18+
; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
19+
; CHECK-NEXT: .cfi_offset %r6, -112
20+
; CHECK-NEXT: .cfi_offset %r7, -104
21+
; CHECK-NEXT: .cfi_offset %r8, -96
22+
; CHECK-NEXT: .cfi_offset %r9, -88
23+
; CHECK-NEXT: .cfi_offset %r10, -80
24+
; CHECK-NEXT: .cfi_offset %r11, -72
25+
; CHECK-NEXT: .cfi_offset %r12, -64
26+
; CHECK-NEXT: .cfi_offset %r13, -56
27+
; CHECK-NEXT: .cfi_offset %r14, -48
28+
; CHECK-NEXT: .cfi_offset %r15, -40
29+
; CHECK-NEXT: aghi %r15, -240
30+
; CHECK-NEXT: .cfi_def_cfa_offset 400
31+
; CHECK-NEXT: lgr %r11, %r15
32+
; CHECK-NEXT: .cfi_def_cfa_register %r11
33+
; CHECK-NEXT: std %f8, 232(%r11) # 8-byte Folded Spill
34+
; CHECK-NEXT: std %f9, 224(%r11) # 8-byte Folded Spill
35+
; CHECK-NEXT: std %f10, 216(%r11) # 8-byte Folded Spill
36+
; CHECK-NEXT: std %f11, 208(%r11) # 8-byte Folded Spill
37+
; CHECK-NEXT: std %f12, 200(%r11) # 8-byte Folded Spill
38+
; CHECK-NEXT: std %f13, 192(%r11) # 8-byte Folded Spill
39+
; CHECK-NEXT: std %f14, 184(%r11) # 8-byte Folded Spill
40+
; CHECK-NEXT: std %f15, 176(%r11) # 8-byte Folded Spill
41+
; CHECK-NEXT: .cfi_offset %f8, -168
42+
; CHECK-NEXT: .cfi_offset %f9, -176
43+
; CHECK-NEXT: .cfi_offset %f10, -184
44+
; CHECK-NEXT: .cfi_offset %f11, -192
45+
; CHECK-NEXT: .cfi_offset %f12, -200
46+
; CHECK-NEXT: .cfi_offset %f13, -208
47+
; CHECK-NEXT: .cfi_offset %f14, -216
48+
; CHECK-NEXT: .cfi_offset %f15, -224
49+
; CHECK-NEXT: la %r0, 160(%r11)
50+
; CHECK-NEXT: lgrl %r1, buf@GOT
51+
; CHECK-NEXT: stg %r0, 168(%r11)
52+
; CHECK-NEXT: mvhi 160(%r11), 10
53+
; CHECK-NEXT: larl %r0, .LBB0_1
54+
; CHECK-NEXT: stg %r0, 8(%r1)
55+
; CHECK-NEXT: stg %r11, 0(%r1)
56+
; CHECK-NEXT: stg %r15, 24(%r1)
57+
; CHECK-NEXT: .LBB0_1: # Block address taken
58+
; CHECK-NEXT: # %entry
59+
; CHECK-NEXT: .LBB0_2: # %entry
60+
; CHECK-NEXT: lg %r1, 168(%r11)
61+
; CHECK-NEXT: lgf %r2, 0(%r1)
62+
; CHECK-NEXT: ld %f8, 232(%r11) # 8-byte Folded Reload
63+
; CHECK-NEXT: ld %f9, 224(%r11) # 8-byte Folded Reload
64+
; CHECK-NEXT: ld %f10, 216(%r11) # 8-byte Folded Reload
65+
; CHECK-NEXT: ld %f11, 208(%r11) # 8-byte Folded Reload
66+
; CHECK-NEXT: ld %f12, 200(%r11) # 8-byte Folded Reload
67+
; CHECK-NEXT: ld %f13, 192(%r11) # 8-byte Folded Reload
68+
; CHECK-NEXT: ld %f14, 184(%r11) # 8-byte Folded Reload
69+
; CHECK-NEXT: ld %f15, 176(%r11) # 8-byte Folded Reload
70+
; CHECK-NEXT: lmg %r6, %r15, 288(%r11)
71+
; CHECK-NEXT: br %r14
72+
entry:
73+
%val = alloca ptr, align 8
74+
%0 = alloca i8, i64 4, align 8
75+
store ptr %0, ptr %val, align 8
76+
%1 = load ptr, ptr %val, align 8
77+
store volatile i32 10, ptr %1, align 4
78+
%2 = call i32 @llvm.eh.sjlj.setjmp(ptr @buf)
79+
%3 = load ptr, ptr %val, align 8
80+
%4 = load volatile i32, ptr %3, align 4
81+
ret i32 %4
82+
}
83+
84+
define signext i32 @foo1() "backchain" "frame-pointer"="all" {
85+
; CHECK-LABEL: foo1:
86+
; CHECK: # %bb.0: # %entry
87+
; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
88+
; CHECK-NEXT: .cfi_offset %r6, -112
89+
; CHECK-NEXT: .cfi_offset %r7, -104
90+
; CHECK-NEXT: .cfi_offset %r8, -96
91+
; CHECK-NEXT: .cfi_offset %r9, -88
92+
; CHECK-NEXT: .cfi_offset %r10, -80
93+
; CHECK-NEXT: .cfi_offset %r11, -72
94+
; CHECK-NEXT: .cfi_offset %r12, -64
95+
; CHECK-NEXT: .cfi_offset %r13, -56
96+
; CHECK-NEXT: .cfi_offset %r14, -48
97+
; CHECK-NEXT: .cfi_offset %r15, -40
98+
; CHECK-NEXT: lgr %r1, %r15
99+
; CHECK-NEXT: aghi %r15, -240
100+
; CHECK-NEXT: .cfi_def_cfa_offset 400
101+
; CHECK-NEXT: stg %r1, 0(%r15)
102+
; CHECK-NEXT: lgr %r11, %r15
103+
; CHECK-NEXT: .cfi_def_cfa_register %r11
104+
; CHECK-NEXT: std %f8, 232(%r11) # 8-byte Folded Spill
105+
; CHECK-NEXT: std %f9, 224(%r11) # 8-byte Folded Spill
106+
; CHECK-NEXT: std %f10, 216(%r11) # 8-byte Folded Spill
107+
; CHECK-NEXT: std %f11, 208(%r11) # 8-byte Folded Spill
108+
; CHECK-NEXT: std %f12, 200(%r11) # 8-byte Folded Spill
109+
; CHECK-NEXT: std %f13, 192(%r11) # 8-byte Folded Spill
110+
; CHECK-NEXT: std %f14, 184(%r11) # 8-byte Folded Spill
111+
; CHECK-NEXT: std %f15, 176(%r11) # 8-byte Folded Spill
112+
; CHECK-NEXT: .cfi_offset %f8, -168
113+
; CHECK-NEXT: .cfi_offset %f9, -176
114+
; CHECK-NEXT: .cfi_offset %f10, -184
115+
; CHECK-NEXT: .cfi_offset %f11, -192
116+
; CHECK-NEXT: .cfi_offset %f12, -200
117+
; CHECK-NEXT: .cfi_offset %f13, -208
118+
; CHECK-NEXT: .cfi_offset %f14, -216
119+
; CHECK-NEXT: .cfi_offset %f15, -224
120+
; CHECK-NEXT: la %r0, 160(%r11)
121+
; CHECK-NEXT: lgrl %r1, buf@GOT
122+
; CHECK-NEXT: stg %r0, 168(%r11)
123+
; CHECK-NEXT: mvhi 160(%r11), 10
124+
; CHECK-NEXT: larl %r0, .LBB1_1
125+
; CHECK-NEXT: stg %r0, 8(%r1)
126+
; CHECK-NEXT: stg %r11, 0(%r1)
127+
; CHECK-NEXT: stg %r15, 24(%r1)
128+
; CHECK-NEXT: lg %r0, 0(%r15)
129+
; CHECK-NEXT: stg %r0, 16(%r1)
130+
; CHECK-NEXT: .LBB1_1: # Block address taken
131+
; CHECK-NEXT: # %entry
132+
; CHECK-NEXT: .LBB1_2: # %entry
133+
; CHECK-NEXT: lg %r1, 168(%r11)
134+
; CHECK-NEXT: lgf %r2, 0(%r1)
135+
; CHECK-NEXT: ld %f8, 232(%r11) # 8-byte Folded Reload
136+
; CHECK-NEXT: ld %f9, 224(%r11) # 8-byte Folded Reload
137+
; CHECK-NEXT: ld %f10, 216(%r11) # 8-byte Folded Reload
138+
; CHECK-NEXT: ld %f11, 208(%r11) # 8-byte Folded Reload
139+
; CHECK-NEXT: ld %f12, 200(%r11) # 8-byte Folded Reload
140+
; CHECK-NEXT: ld %f13, 192(%r11) # 8-byte Folded Reload
141+
; CHECK-NEXT: ld %f14, 184(%r11) # 8-byte Folded Reload
142+
; CHECK-NEXT: ld %f15, 176(%r11) # 8-byte Folded Reload
143+
; CHECK-NEXT: lmg %r6, %r15, 288(%r11)
144+
; CHECK-NEXT: br %r14
145+
entry:
146+
%val = alloca ptr, align 8
147+
%0 = alloca i8, i64 4, align 8
148+
store ptr %0, ptr %val, align 8
149+
%1 = load ptr, ptr %val, align 8
150+
store volatile i32 10, ptr %1, align 4
151+
%2 = call i32 @llvm.eh.sjlj.setjmp(ptr @buf)
152+
%3 = load ptr, ptr %val, align 8
153+
%4 = load volatile i32, ptr %3, align 4
154+
ret i32 %4
155+
}
156+

0 commit comments

Comments
 (0)