Skip to content

Commit 104569b

Browse files
committed
[Outline] When outlining a helper function, remove any prologue data cloned from the parent function onto the helper. Addresses issue llvm#77.
1 parent ba3d904 commit 104569b

File tree

2 files changed

+322
-0
lines changed

2 files changed

+322
-0
lines changed

llvm/lib/Transforms/Tapir/Outline.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,10 @@ Function *llvm::CreateHelper(
385385
AttributeList::get(NewFunc->getContext(), OldAttrs.getFnAttrs(),
386386
OldAttrs.getRetAttrs(), NewArgAttrs));
387387

388+
// Remove prologue data
389+
if (NewFunc->hasPrologueData())
390+
NewFunc->setPrologueData(nullptr);
391+
388392
// Remove old return attributes.
389393
NewFunc->removeRetAttrs(
390394
AttributeFuncs::typeIncompatible(NewFunc->getReturnType()));
Lines changed: 318 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,318 @@
1+
; Check that prologue data attached to a function with Tapir
2+
; instructions does not get copied to a generated helper function.
3+
;
4+
; RUN: opt < %s -tapir2target -tapir-target=opencilk -opencilk-runtime-bc-path=%S/libopencilk-abi.bc -S | FileCheck %s
5+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
6+
target triple = "x86_64-unknown-linux-gnu"
7+
8+
%class.object = type { i8 }
9+
%class.anon = type { i8 }
10+
11+
$_ZN6object4funcEv = comdat any
12+
13+
$_Z12parallel_forIZN6object4funcEvEUliE_EviiT_ = comdat any
14+
15+
$_ZZN6object4funcEvENKUliE_clEi = comdat any
16+
17+
$_ZTSFvvE = comdat any
18+
19+
$_ZTIFvvE = comdat any
20+
21+
$_ZTSFivE = comdat any
22+
23+
$_ZTIFivE = comdat any
24+
25+
$_ZTSFviiZN6object4funcEvEUliE_E = comdat any
26+
27+
$_ZTIFviiZN6object4funcEvEUliE_E = comdat any
28+
29+
@_ZTVN10__cxxabiv120__function_type_infoE = external dso_local global i8*
30+
@_ZTSFvvE = linkonce_odr dso_local constant [5 x i8] c"FvvE\00", comdat, align 1
31+
@_ZTIFvvE = linkonce_odr dso_local constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv120__function_type_infoE, i64 2) to i8*), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @_ZTSFvvE, i32 0, i32 0) }, comdat, align 8
32+
@0 = private constant i8* bitcast ({ i8*, i8* }* @_ZTIFvvE to i8*)
33+
@_ZTSFivE = linkonce_odr dso_local constant [5 x i8] c"FivE\00", comdat, align 1
34+
@_ZTIFivE = linkonce_odr dso_local constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv120__function_type_infoE, i64 2) to i8*), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @_ZTSFivE, i32 0, i32 0) }, comdat, align 8
35+
@1 = private constant i8* bitcast ({ i8*, i8* }* @_ZTIFivE to i8*)
36+
@.src = private unnamed_addr constant [17 x i8] c"bug-20220610.cpp\00", align 1
37+
@2 = private unnamed_addr constant { i16, i16, [11 x i8] } { i16 -1, i16 0, [11 x i8] c"'object *'\00" }
38+
@3 = private unnamed_addr global { { [17 x i8]*, i32, i32 }, { i16, i16, [11 x i8] }*, i8, i8 } { { [17 x i8]*, i32, i32 } { [17 x i8]* @.src, i32 11, i32 8 }, { i16, i16, [11 x i8] }* @2, i8 0, i8 4 }
39+
@_ZTSFviiZN6object4funcEvEUliE_E = linkonce_odr dso_local constant [28 x i8] c"FviiZN6object4funcEvEUliE_E\00", comdat, align 1
40+
@_ZTIFviiZN6object4funcEvEUliE_E = linkonce_odr dso_local constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv120__function_type_infoE, i64 2) to i8*), i8* getelementptr inbounds ([28 x i8], [28 x i8]* @_ZTSFviiZN6object4funcEvEUliE_E, i32 0, i32 0) }, comdat, align 8
41+
@4 = private constant i8* bitcast ({ i8*, i8* }* @_ZTIFviiZN6object4funcEvEUliE_E to i8*)
42+
@5 = private unnamed_addr constant { i16, i16, [6 x i8] } { i16 0, i16 11, [6 x i8] c"'int'\00" }
43+
@6 = private unnamed_addr global { { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* } { { [17 x i8]*, i32, i32 } { [17 x i8]* @.src, i32 4, i32 29 }, { i16, i16, [6 x i8] }* @5 }
44+
@7 = private unnamed_addr global { { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* } { { [17 x i8]*, i32, i32 } { [17 x i8]* @.src, i32 4, i32 29 }, { i16, i16, [6 x i8] }* @5 }
45+
@8 = private unnamed_addr global { { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* } { { [17 x i8]*, i32, i32 } { [17 x i8]* @.src, i32 4, i32 29 }, { i16, i16, [6 x i8] }* @5 }
46+
@9 = private unnamed_addr global { { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* } { { [17 x i8]*, i32, i32 } { [17 x i8]* @.src, i32 4, i32 29 }, { i16, i16, [6 x i8] }* @5 }
47+
@10 = private unnamed_addr global { { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* } { { [17 x i8]*, i32, i32 } { [17 x i8]* @.src, i32 4, i32 12 }, { i16, i16, [6 x i8] }* @5 }
48+
@11 = private unnamed_addr global { { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* } { { [17 x i8]*, i32, i32 } { [17 x i8]* @.src, i32 4, i32 12 }, { i16, i16, [6 x i8] }* @5 }
49+
@12 = private unnamed_addr global { { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* } { { [17 x i8]*, i32, i32 } { [17 x i8]* @.src, i32 4, i32 37 }, { i16, i16, [6 x i8] }* @5 }
50+
@13 = private unnamed_addr constant { i16, i16, [45 x i8] } { i16 -1, i16 0, [45 x i8] c"'const (lambda at bug-20220610.cpp:12:26) *'\00" }
51+
@14 = private unnamed_addr global { { [17 x i8]*, i32, i32 }, { i16, i16, [45 x i8] }*, i8, i8 } { { [17 x i8]*, i32, i32 } { [17 x i8]* @.src, i32 12, i32 26 }, { i16, i16, [45 x i8] }* @13, i8 0, i8 4 }
52+
53+
; Function Attrs: mustprogress noinline nounwind optnone uwtable
54+
define dso_local void @_Z3addv() #0 prologue <{ i32, i32 }> <{ i32 846595819, i32 trunc (i64 sub (i64 ptrtoint (i8** @0 to i64), i64 ptrtoint (void ()* @_Z3addv to i64)) to i32) }> {
55+
entry:
56+
ret void
57+
}
58+
59+
; Function Attrs: mustprogress noinline norecurse optnone uwtable
60+
define dso_local noundef i32 @main() #1 prologue <{ i32, i32 }> <{ i32 846595819, i32 trunc (i64 sub (i64 ptrtoint (i8** @1 to i64), i64 ptrtoint (i32 ()* @main to i64)) to i32) }> {
61+
entry:
62+
%retval = alloca i32, align 4
63+
%foo = alloca %class.object, align 1
64+
store i32 0, i32* %retval, align 4
65+
call void @_ZN6object4funcEv(%class.object* noundef nonnull align 1 dereferenceable(1) %foo)
66+
ret i32 0
67+
}
68+
69+
; Function Attrs: mustprogress noinline optnone uwtable
70+
define linkonce_odr dso_local void @_ZN6object4funcEv(%class.object* noundef nonnull align 1 dereferenceable(1) %this) #2 comdat align 2 {
71+
entry:
72+
%this.addr = alloca %class.object*, align 8
73+
%agg.tmp = alloca %class.anon, align 1
74+
store %class.object* %this, %class.object** %this.addr, align 8
75+
%this1 = load %class.object*, %class.object** %this.addr, align 8
76+
%0 = icmp ne %class.object* %this1, null, !nosanitize !4
77+
br i1 %0, label %cont, label %handler.type_mismatch, !prof !5, !nosanitize !4
78+
79+
handler.type_mismatch: ; preds = %entry
80+
%1 = ptrtoint %class.object* %this1 to i64, !nosanitize !4
81+
call void @__ubsan_handle_type_mismatch_v1(i8* bitcast ({ { [17 x i8]*, i32, i32 }, { i16, i16, [11 x i8] }*, i8, i8 }* @3 to i8*), i64 %1) #7, !nosanitize !4
82+
br label %cont, !nosanitize !4
83+
84+
cont: ; preds = %handler.type_mismatch, %entry
85+
call void @_Z12parallel_forIZN6object4funcEvEUliE_EviiT_(i32 noundef 0, i32 noundef 111)
86+
ret void
87+
}
88+
89+
; Function Attrs: uwtable
90+
declare dso_local void @__ubsan_handle_type_mismatch_v1(i8*, i64) #3
91+
92+
; Function Attrs: mustprogress noinline optnone uwtable
93+
define linkonce_odr dso_local void @_Z12parallel_forIZN6object4funcEvEUliE_EviiT_(i32 noundef %start, i32 noundef %end) #2 comdat prologue <{ i32, i32 }> <{ i32 846595819, i32 trunc (i64 sub (i64 ptrtoint (i8** @4 to i64), i64 ptrtoint (void (i32, i32)* @_Z12parallel_forIZN6object4funcEvEUliE_EviiT_ to i64)) to i32) }> {
94+
entry:
95+
%f = alloca %class.anon, align 1
96+
%start.addr = alloca i32, align 4
97+
%end.addr = alloca i32, align 4
98+
%syncreg = call token @llvm.syncregion.start()
99+
%__init = alloca i32, align 4
100+
%__limit = alloca i32, align 4
101+
%__begin = alloca i32, align 4
102+
%__end = alloca i32, align 4
103+
store i32 %start, i32* %start.addr, align 4
104+
store i32 %end, i32* %end.addr, align 4
105+
%0 = load i32, i32* %start.addr, align 4
106+
store i32 %0, i32* %__init, align 4
107+
%1 = load i32, i32* %end.addr, align 4
108+
store i32 %1, i32* %__limit, align 4
109+
%2 = load i32, i32* %__init, align 4
110+
%3 = load i32, i32* %__limit, align 4
111+
%cmp = icmp slt i32 %2, %3
112+
br i1 %cmp, label %pfor.ph, label %pfor.end
113+
114+
pfor.ph: ; preds = %entry
115+
store i32 0, i32* %__begin, align 4
116+
%4 = load i32, i32* %__limit, align 4
117+
%5 = load i32, i32* %__init, align 4
118+
%6 = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %4, i32 %5), !nosanitize !4
119+
%7 = extractvalue { i32, i1 } %6, 0, !nosanitize !4
120+
%8 = extractvalue { i32, i1 } %6, 1, !nosanitize !4
121+
%9 = xor i1 %8, true, !nosanitize !4
122+
br i1 %9, label %cont, label %handler.sub_overflow, !prof !5, !nosanitize !4
123+
124+
handler.sub_overflow: ; preds = %pfor.ph
125+
%10 = zext i32 %4 to i64, !nosanitize !4
126+
%11 = zext i32 %5 to i64, !nosanitize !4
127+
call void @__ubsan_handle_sub_overflow(i8* bitcast ({ { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* }* @6 to i8*), i64 %10, i64 %11) #7, !nosanitize !4
128+
br label %cont, !nosanitize !4
129+
130+
cont: ; preds = %handler.sub_overflow, %pfor.ph
131+
%12 = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %7, i32 1), !nosanitize !4
132+
%13 = extractvalue { i32, i1 } %12, 0, !nosanitize !4
133+
%14 = extractvalue { i32, i1 } %12, 1, !nosanitize !4
134+
%15 = xor i1 %14, true, !nosanitize !4
135+
br i1 %15, label %cont2, label %handler.sub_overflow1, !prof !5, !nosanitize !4
136+
137+
handler.sub_overflow1: ; preds = %cont
138+
%16 = zext i32 %7 to i64, !nosanitize !4
139+
call void @__ubsan_handle_sub_overflow(i8* bitcast ({ { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* }* @7 to i8*), i64 %16, i64 1) #7, !nosanitize !4
140+
br label %cont2, !nosanitize !4
141+
142+
cont2: ; preds = %handler.sub_overflow1, %cont
143+
%17 = icmp ne i32 %13, -2147483648, !nosanitize !4
144+
%or = or i1 %17, true, !nosanitize !4
145+
%18 = and i1 true, %or, !nosanitize !4
146+
br i1 %18, label %cont3, label %handler.divrem_overflow, !prof !5, !nosanitize !4
147+
148+
handler.divrem_overflow: ; preds = %cont2
149+
%19 = zext i32 %13 to i64, !nosanitize !4
150+
call void @__ubsan_handle_divrem_overflow(i8* bitcast ({ { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* }* @8 to i8*), i64 %19, i64 1) #7, !nosanitize !4
151+
br label %cont3, !nosanitize !4
152+
153+
cont3: ; preds = %handler.divrem_overflow, %cont2
154+
%div = sdiv i32 %13, 1
155+
%20 = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %div, i32 1), !nosanitize !4
156+
%21 = extractvalue { i32, i1 } %20, 0, !nosanitize !4
157+
%22 = extractvalue { i32, i1 } %20, 1, !nosanitize !4
158+
%23 = xor i1 %22, true, !nosanitize !4
159+
br i1 %23, label %cont4, label %handler.add_overflow, !prof !5, !nosanitize !4
160+
161+
handler.add_overflow: ; preds = %cont3
162+
%24 = zext i32 %div to i64, !nosanitize !4
163+
call void @__ubsan_handle_add_overflow(i8* bitcast ({ { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* }* @9 to i8*), i64 %24, i64 1) #7, !nosanitize !4
164+
br label %cont4, !nosanitize !4
165+
166+
cont4: ; preds = %handler.add_overflow, %cont3
167+
store i32 %21, i32* %__end, align 4
168+
br label %pfor.cond
169+
170+
pfor.cond: ; preds = %cont9, %cont4
171+
br label %pfor.detach
172+
173+
pfor.detach: ; preds = %pfor.cond
174+
%25 = load i32, i32* %__init, align 4
175+
%26 = load i32, i32* %__begin, align 4
176+
%27 = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %26, i32 1), !nosanitize !4
177+
%28 = extractvalue { i32, i1 } %27, 0, !nosanitize !4
178+
%29 = extractvalue { i32, i1 } %27, 1, !nosanitize !4
179+
%30 = xor i1 %29, true, !nosanitize !4
180+
br i1 %30, label %cont5, label %handler.mul_overflow, !prof !5, !nosanitize !4
181+
182+
handler.mul_overflow: ; preds = %pfor.detach
183+
%31 = zext i32 %26 to i64, !nosanitize !4
184+
call void @__ubsan_handle_mul_overflow(i8* bitcast ({ { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* }* @10 to i8*), i64 %31, i64 1) #7, !nosanitize !4
185+
br label %cont5, !nosanitize !4
186+
187+
cont5: ; preds = %handler.mul_overflow, %pfor.detach
188+
%32 = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %25, i32 %28), !nosanitize !4
189+
%33 = extractvalue { i32, i1 } %32, 0, !nosanitize !4
190+
%34 = extractvalue { i32, i1 } %32, 1, !nosanitize !4
191+
%35 = xor i1 %34, true, !nosanitize !4
192+
br i1 %35, label %cont7, label %handler.add_overflow6, !prof !5, !nosanitize !4
193+
194+
handler.add_overflow6: ; preds = %cont5
195+
%36 = zext i32 %25 to i64, !nosanitize !4
196+
%37 = zext i32 %28 to i64, !nosanitize !4
197+
call void @__ubsan_handle_add_overflow(i8* bitcast ({ { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* }* @11 to i8*), i64 %36, i64 %37) #7, !nosanitize !4
198+
br label %cont7, !nosanitize !4
199+
200+
cont7: ; preds = %handler.add_overflow6, %cont5
201+
detach within %syncreg, label %pfor.body.entry, label %pfor.inc
202+
203+
pfor.body.entry: ; preds = %cont7
204+
%i = alloca i32, align 4
205+
store i32 %33, i32* %i, align 4
206+
br label %pfor.body
207+
208+
pfor.body: ; preds = %pfor.body.entry
209+
%38 = load i32, i32* %i, align 4
210+
call void @_ZZN6object4funcEvENKUliE_clEi(%class.anon* noundef nonnull align 1 dereferenceable(1) %f, i32 noundef %38)
211+
br label %pfor.preattach
212+
213+
pfor.preattach: ; preds = %pfor.body
214+
reattach within %syncreg, label %pfor.inc
215+
216+
pfor.inc: ; preds = %pfor.preattach, %cont7
217+
%39 = load i32, i32* %__begin, align 4
218+
%40 = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %39, i32 1), !nosanitize !4
219+
%41 = extractvalue { i32, i1 } %40, 0, !nosanitize !4
220+
%42 = extractvalue { i32, i1 } %40, 1, !nosanitize !4
221+
%43 = xor i1 %42, true, !nosanitize !4
222+
br i1 %43, label %cont9, label %handler.add_overflow8, !prof !5, !nosanitize !4
223+
224+
handler.add_overflow8: ; preds = %pfor.inc
225+
%44 = zext i32 %39 to i64, !nosanitize !4
226+
call void @__ubsan_handle_add_overflow(i8* bitcast ({ { [17 x i8]*, i32, i32 }, { i16, i16, [6 x i8] }* }* @12 to i8*), i64 %44, i64 1) #7, !nosanitize !4
227+
br label %cont9, !nosanitize !4
228+
229+
cont9: ; preds = %handler.add_overflow8, %pfor.inc
230+
store i32 %41, i32* %__begin, align 4
231+
%45 = load i32, i32* %__begin, align 4
232+
%46 = load i32, i32* %__end, align 4
233+
%cmp10 = icmp slt i32 %45, %46
234+
br i1 %cmp10, label %pfor.cond, label %pfor.cond.cleanup, !llvm.loop !6
235+
236+
pfor.cond.cleanup: ; preds = %cont9
237+
sync within %syncreg, label %sync.continue
238+
239+
sync.continue: ; preds = %pfor.cond.cleanup
240+
call void @llvm.sync.unwind(token %syncreg)
241+
br label %pfor.end
242+
243+
pfor.end: ; preds = %sync.continue, %entry
244+
ret void
245+
}
246+
247+
; Function Attrs: argmemonly nounwind willreturn
248+
declare token @llvm.syncregion.start() #4
249+
250+
; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
251+
declare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32) #5
252+
253+
; Function Attrs: uwtable
254+
declare dso_local void @__ubsan_handle_sub_overflow(i8*, i64, i64) #3
255+
256+
; Function Attrs: uwtable
257+
declare dso_local void @__ubsan_handle_divrem_overflow(i8*, i64, i64) #3
258+
259+
; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
260+
declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) #5
261+
262+
; Function Attrs: uwtable
263+
declare dso_local void @__ubsan_handle_add_overflow(i8*, i64, i64) #3
264+
265+
; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
266+
declare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32) #5
267+
268+
; Function Attrs: uwtable
269+
declare dso_local void @__ubsan_handle_mul_overflow(i8*, i64, i64) #3
270+
271+
; Function Attrs: mustprogress noinline nounwind optnone uwtable
272+
define linkonce_odr dso_local void @_ZZN6object4funcEvENKUliE_clEi(%class.anon* noundef nonnull align 1 dereferenceable(1) %this, i32 noundef %i) #0 comdat align 2 {
273+
entry:
274+
%this.addr = alloca %class.anon*, align 8
275+
%i.addr = alloca i32, align 4
276+
store %class.anon* %this, %class.anon** %this.addr, align 8
277+
store i32 %i, i32* %i.addr, align 4
278+
%this1 = load %class.anon*, %class.anon** %this.addr, align 8
279+
%0 = icmp ne %class.anon* %this1, null, !nosanitize !4
280+
br i1 %0, label %cont, label %handler.type_mismatch, !prof !5, !nosanitize !4
281+
282+
handler.type_mismatch: ; preds = %entry
283+
%1 = ptrtoint %class.anon* %this1 to i64, !nosanitize !4
284+
call void @__ubsan_handle_type_mismatch_v1(i8* bitcast ({ { [17 x i8]*, i32, i32 }, { i16, i16, [45 x i8] }*, i8, i8 }* @14 to i8*), i64 %1) #7, !nosanitize !4
285+
br label %cont, !nosanitize !4
286+
287+
cont: ; preds = %handler.type_mismatch, %entry
288+
call void @_Z3addv()
289+
ret void
290+
}
291+
292+
; CHECK: define internal fastcc void @_Z12parallel_forIZN6object4funcEvEUliE_EviiT_.outline_pfor.body.entry.otd1(
293+
; CHECK-NOT: prologue
294+
; CHECK {
295+
296+
; Function Attrs: argmemonly willreturn
297+
declare void @llvm.sync.unwind(token) #6
298+
299+
attributes #0 = { mustprogress noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
300+
attributes #1 = { mustprogress noinline norecurse optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
301+
attributes #2 = { mustprogress noinline optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
302+
attributes #3 = { uwtable }
303+
attributes #4 = { argmemonly nounwind willreturn }
304+
attributes #5 = { nofree nosync nounwind readnone speculatable willreturn }
305+
attributes #6 = { argmemonly willreturn }
306+
attributes #7 = { nounwind }
307+
308+
!llvm.module.flags = !{!0, !1, !2}
309+
!llvm.ident = !{!3}
310+
311+
!0 = !{i32 1, !"wchar_size", i32 4}
312+
!1 = !{i32 7, !"uwtable", i32 1}
313+
!2 = !{i32 7, !"frame-pointer", i32 2}
314+
!3 = !{!"clang version 14.0.4 ([email protected]:OpenCilk/opencilk-project.git bb40f6253a942b78bd0be7d50945fed88960a60e)"}
315+
!4 = !{}
316+
!5 = !{!"branch_weights", i32 1048575, i32 1}
317+
!6 = distinct !{!6, !7}
318+
!7 = !{!"tapir.loop.spawn.strategy", i32 1}

0 commit comments

Comments
 (0)