|
| 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