1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2; RUN: opt -S -passes=guard-widening < %s | FileCheck %s 3 4; Hot loop, frequently entered, should widen. 5define i32 @test_intrinsic_very_profitable(i32 %n, i1 %cond.1, i1 %cond.2) { 6; CHECK-LABEL: define i32 @test_intrinsic_very_profitable 7; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) { 8; CHECK-NEXT: entry: 9; CHECK-NEXT: [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]] 10; CHECK-NEXT: [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]] 11; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition() 12; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]] 13; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0:![0-9]+]] 14; CHECK: deopt: 15; CHECK-NEXT: [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 16; CHECK-NEXT: ret i32 [[DEOPTCALL]] 17; CHECK: guarded: 18; CHECK-NEXT: [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100 19; CHECK-NEXT: br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF0]] 20; CHECK: loop: 21; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ] 22; CHECK-NEXT: [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition() 23; CHECK-NEXT: [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]] 24; CHECK-NEXT: br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]] 25; CHECK: deopt2: 26; CHECK-NEXT: [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 27; CHECK-NEXT: ret i32 [[DEOPTCALL3]] 28; CHECK: guarded1: 29; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 30; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100 31; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1:![0-9]+]] 32; CHECK: exit: 33; CHECK-NEXT: ret i32 0 34; CHECK: failed: 35; CHECK-NEXT: ret i32 -1 36; 37entry: 38 %widenable_cond = call i1 @llvm.experimental.widenable.condition() 39 %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond 40 br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0 41 42deopt: ; preds = %entry 43 %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 44 ret i32 %deoptcall 45 46guarded: ; preds = %entry 47 %loop.precondition = icmp uge i32 %n, 100 48 br i1 %loop.precondition, label %loop, label %failed, !prof !0 49 50loop: ; preds = %guarded1, %guarded 51 %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ] 52 %widenable_cond4 = call i1 @llvm.experimental.widenable.condition() 53 %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4 54 br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0 55 56deopt2: ; preds = %loop 57 %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 58 ret i32 %deoptcall3 59 60guarded1: ; preds = %loop 61 %iv.next = add nuw nsw i32 %iv, 1 62 %loop.cond = icmp ult i32 %iv.next, 100 63 br i1 %loop.cond, label %loop, label %exit, !prof !1 64 65exit: ; preds = %guarded1 66 ret i32 0 67 68failed: ; preds = %guarded 69 ret i32 -1 70} 71 72; Even though the loop is rarely entered, it has so many iterations that the widening 73; is still profitable. 74define i32 @test_intrinsic_profitable(i32 %n, i1 %cond.1, i1 %cond.2) { 75; CHECK-LABEL: define i32 @test_intrinsic_profitable 76; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) { 77; CHECK-NEXT: entry: 78; CHECK-NEXT: [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]] 79; CHECK-NEXT: [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]] 80; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition() 81; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]] 82; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]] 83; CHECK: deopt: 84; CHECK-NEXT: [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 85; CHECK-NEXT: ret i32 [[DEOPTCALL]] 86; CHECK: guarded: 87; CHECK-NEXT: [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100 88; CHECK-NEXT: br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF2:![0-9]+]] 89; CHECK: loop: 90; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ] 91; CHECK-NEXT: [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition() 92; CHECK-NEXT: [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]] 93; CHECK-NEXT: br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]] 94; CHECK: deopt2: 95; CHECK-NEXT: [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 96; CHECK-NEXT: ret i32 [[DEOPTCALL3]] 97; CHECK: guarded1: 98; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 99; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100 100; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1]] 101; CHECK: exit: 102; CHECK-NEXT: ret i32 0 103; CHECK: failed: 104; CHECK-NEXT: ret i32 -1 105; 106entry: 107 %widenable_cond = call i1 @llvm.experimental.widenable.condition() 108 %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond 109 br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0 110 111deopt: ; preds = %entry 112 %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 113 ret i32 %deoptcall 114 115guarded: ; preds = %entry 116 %loop.precondition = icmp uge i32 %n, 100 117 br i1 %loop.precondition, label %loop, label %failed, !prof !2 118 119loop: ; preds = %guarded1, %guarded 120 %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ] 121 %widenable_cond4 = call i1 @llvm.experimental.widenable.condition() 122 %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4 123 br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0 124 125deopt2: ; preds = %loop 126 %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 127 ret i32 %deoptcall3 128 129guarded1: ; preds = %loop 130 %iv.next = add nuw nsw i32 %iv, 1 131 %loop.cond = icmp ult i32 %iv.next, 100 132 br i1 %loop.cond, label %loop, label %exit, !prof !1 133 134exit: ; preds = %guarded1 135 ret i32 0 136 137failed: ; preds = %guarded 138 ret i32 -1 139} 140 141; Loop's hotness compensates rareness of its entrance. We still want to widen, because 142; it may open up some optimization opportunities. 143define i32 @test_intrinsic_neutral(i32 %n, i1 %cond.1, i1 %cond.2) { 144; CHECK-LABEL: define i32 @test_intrinsic_neutral 145; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) { 146; CHECK-NEXT: entry: 147; CHECK-NEXT: [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]] 148; CHECK-NEXT: [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]] 149; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition() 150; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]] 151; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]] 152; CHECK: deopt: 153; CHECK-NEXT: [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 154; CHECK-NEXT: ret i32 [[DEOPTCALL]] 155; CHECK: guarded: 156; CHECK-NEXT: [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100 157; CHECK-NEXT: br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF3:![0-9]+]] 158; CHECK: loop: 159; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ] 160; CHECK-NEXT: [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition() 161; CHECK-NEXT: [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]] 162; CHECK-NEXT: br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]] 163; CHECK: deopt2: 164; CHECK-NEXT: [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 165; CHECK-NEXT: ret i32 [[DEOPTCALL3]] 166; CHECK: guarded1: 167; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 168; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100 169; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1]] 170; CHECK: exit: 171; CHECK-NEXT: ret i32 0 172; CHECK: failed: 173; CHECK-NEXT: ret i32 -1 174; 175entry: 176 %widenable_cond = call i1 @llvm.experimental.widenable.condition() 177 %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond 178 br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0 179 180deopt: ; preds = %entry 181 %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 182 ret i32 %deoptcall 183 184guarded: ; preds = %entry 185 %loop.precondition = icmp uge i32 %n, 100 186 br i1 %loop.precondition, label %loop, label %failed, !prof !3 187 188loop: ; preds = %guarded1, %guarded 189 %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ] 190 %widenable_cond4 = call i1 @llvm.experimental.widenable.condition() 191 %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4 192 br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0 193 194deopt2: ; preds = %loop 195 %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 196 ret i32 %deoptcall3 197 198guarded1: ; preds = %loop 199 %iv.next = add nuw nsw i32 %iv, 1 200 %loop.cond = icmp ult i32 %iv.next, 100 201 br i1 %loop.cond, label %loop, label %exit, !prof !1 202 203exit: ; preds = %guarded1 204 ret i32 0 205 206failed: ; preds = %guarded 207 ret i32 -1 208} 209 210; FIXME: This loop is so rarely entered, that we don't want to widen here. 211define i32 @test_intrinsic_very_unprofitable(i32 %n, i1 %cond.1, i1 %cond.2) { 212; CHECK-LABEL: define i32 @test_intrinsic_very_unprofitable 213; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) { 214; CHECK-NEXT: entry: 215; CHECK-NEXT: [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]] 216; CHECK-NEXT: [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]] 217; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition() 218; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]] 219; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]] 220; CHECK: deopt: 221; CHECK-NEXT: [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 222; CHECK-NEXT: ret i32 [[DEOPTCALL]] 223; CHECK: guarded: 224; CHECK-NEXT: [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100 225; CHECK-NEXT: br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF4:![0-9]+]] 226; CHECK: loop: 227; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ] 228; CHECK-NEXT: [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition() 229; CHECK-NEXT: [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]] 230; CHECK-NEXT: br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]] 231; CHECK: deopt2: 232; CHECK-NEXT: [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 233; CHECK-NEXT: ret i32 [[DEOPTCALL3]] 234; CHECK: guarded1: 235; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 236; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100 237; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1]] 238; CHECK: exit: 239; CHECK-NEXT: ret i32 0 240; CHECK: failed: 241; CHECK-NEXT: ret i32 -1 242; 243entry: 244 %widenable_cond = call i1 @llvm.experimental.widenable.condition() 245 %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond 246 br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0 247 248deopt: ; preds = %entry 249 %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 250 ret i32 %deoptcall 251 252guarded: ; preds = %entry 253 %loop.precondition = icmp uge i32 %n, 100 254 br i1 %loop.precondition, label %loop, label %failed, !prof !4 255 256loop: ; preds = %guarded1, %guarded 257 %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ] 258 %widenable_cond4 = call i1 @llvm.experimental.widenable.condition() 259 %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4 260 br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0 261 262deopt2: ; preds = %loop 263 %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 264 ret i32 %deoptcall3 265 266guarded1: ; preds = %loop 267 %iv.next = add nuw nsw i32 %iv, 1 268 %loop.cond = icmp ult i32 %iv.next, 100 269 br i1 %loop.cond, label %loop, label %exit, !prof !1 270 271exit: ; preds = %guarded1 272 ret i32 0 273 274failed: ; preds = %guarded 275 ret i32 -1 276} 277 278; FIXME: This loop is so rarely entered, that we don't want to widen here. 279define i32 @test_intrinsic_unprofitable(i32 %n, i1 %cond.1, i1 %cond.2) { 280; CHECK-LABEL: define i32 @test_intrinsic_unprofitable 281; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) { 282; CHECK-NEXT: entry: 283; CHECK-NEXT: [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]] 284; CHECK-NEXT: [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]] 285; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition() 286; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]] 287; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]] 288; CHECK: deopt: 289; CHECK-NEXT: [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 290; CHECK-NEXT: ret i32 [[DEOPTCALL]] 291; CHECK: guarded: 292; CHECK-NEXT: [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100 293; CHECK-NEXT: br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF5:![0-9]+]] 294; CHECK: loop: 295; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ] 296; CHECK-NEXT: [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition() 297; CHECK-NEXT: [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]] 298; CHECK-NEXT: br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]] 299; CHECK: deopt2: 300; CHECK-NEXT: [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 301; CHECK-NEXT: ret i32 [[DEOPTCALL3]] 302; CHECK: guarded1: 303; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 304; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100 305; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1]] 306; CHECK: exit: 307; CHECK-NEXT: ret i32 0 308; CHECK: failed: 309; CHECK-NEXT: ret i32 -1 310; 311entry: 312 %widenable_cond = call i1 @llvm.experimental.widenable.condition() 313 %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond 314 br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0 315 316deopt: ; preds = %entry 317 %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 318 ret i32 %deoptcall 319 320guarded: ; preds = %entry 321 %loop.precondition = icmp uge i32 %n, 100 322 br i1 %loop.precondition, label %loop, label %failed, !prof !5 323 324loop: ; preds = %guarded1, %guarded 325 %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ] 326 %widenable_cond4 = call i1 @llvm.experimental.widenable.condition() 327 %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4 328 br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0 329 330deopt2: ; preds = %loop 331 %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ] 332 ret i32 %deoptcall3 333 334guarded1: ; preds = %loop 335 %iv.next = add nuw nsw i32 %iv, 1 336 %loop.cond = icmp ult i32 %iv.next, 100 337 br i1 %loop.cond, label %loop, label %exit, !prof !1 338 339exit: ; preds = %guarded1 340 ret i32 0 341 342failed: ; preds = %guarded 343 ret i32 -1 344} 345 346declare i32 @llvm.experimental.deoptimize.i32(...) 347 348; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(inaccessiblemem: readwrite) 349declare noundef i1 @llvm.experimental.widenable.condition() #1 350 351attributes #0 = { nocallback nofree nosync willreturn } 352attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(inaccessiblemem: readwrite) } 353 354!0 = !{!"branch_weights", i32 1048576, i32 1} 355!1 = !{!"branch_weights", i32 99, i32 1} 356!2 = !{!"branch_weights", i32 1, i32 10} 357!3 = !{!"branch_weights", i32 1, i32 99} 358!4 = !{!"branch_weights", i32 1, i32 1048576} 359!5 = !{!"branch_weights", i32 1, i32 1000} 360