Index: test/Profile/c-captured.c =================================================================== --- test/Profile/c-captured.c +++ test/Profile/c-captured.c @@ -8,22 +8,22 @@ // PGOGEN: @[[C1C:"__llvm_profile_counters_c-captured.c:__captured_stmt.1"]] = private global [3 x i64] zeroinitializer // PGOALL-LABEL: define void @debug_captured() -// PGOGEN: store {{.*}} @[[DCC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[DCC]], i64 0, i64 0 void debug_captured() { int x = 10; // Check both debug_captured counters, so we can do this all in one pass - // PGOGEN: store {{.*}} @[[DCC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[DCC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[DC1:[0-9]+]] - // PGOGEN: store {{.*}} @[[DCC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[DCC]], i64 0, i64 2 // PGOUSE: br {{.*}} !prof ![[DC2:[0-9]+]] // PGOALL: ret // PGOALL-LABEL: define internal void @__captured_stmt( - // PGOGEN: store {{.*}} @[[CSC]], i64 0, i64 0 + // PGOGEN: atomicrmw add {{.*}} @[[CSC]], i64 0, i64 0 #pragma clang __debug captured { - // PGOGEN: store {{.*}} @[[CSC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[CSC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[CS1:[0-9]+]] if (x) {} // PGOALL: ret @@ -32,13 +32,13 @@ if (x) {} // This is DC1. Checked above. // PGOALL-LABEL: define internal void @__captured_stmt.1( - // PGOGEN: store {{.*}} @[[C1C]], i64 0, i64 0 + // PGOGEN: atomicrmw add {{.*}} @[[C1C]], i64 0, i64 0 #pragma clang __debug captured { - // PGOGEN: store {{.*}} @[[C1C]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[C1C]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[C11:[0-9]+]] for (int i = 0; i < x; ++i) {} - // PGOGEN: store {{.*}} @[[C1C]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[C1C]], i64 0, i64 2 // PGOUSE: br {{.*}} !prof ![[C12:[0-9]+]] if (x) {} // PGOALL: ret Index: test/Profile/c-general.c =================================================================== --- test/Profile/c-general.c +++ test/Profile/c-general.c @@ -23,95 +23,95 @@ // PGOGEN-LABEL: @simple_loops() // PGOUSE-LABEL: @simple_loops() -// PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[SLC]], i64 0, i64 0 void simple_loops() { int i; - // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[SLC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[SL1:[0-9]+]] for (i = 0; i < 100; ++i) { } - // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[SLC]], i64 0, i64 2 // PGOUSE: br {{.*}} !prof ![[SL2:[0-9]+]] while (i > 0) i--; - // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[SLC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[SL3:[0-9]+]] do {} while (i++ < 75); - // PGOGEN-NOT: store {{.*}} @[[SLC]], + // PGOGEN-NOT: atomicrmw add {{.*}} @[[SLC]] // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ } // PGOGEN-LABEL: @conditionals() // PGOUSE-LABEL: @conditionals() -// PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 0 void conditionals() { - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[IF1:[0-9]+]] for (int i = 0; i < 100; ++i) { - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 2 // PGOUSE: br {{.*}} !prof ![[IF2:[0-9]+]] if (i % 2) { - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[IF3:[0-9]+]] if (i) {} - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 4 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 4 // PGOUSE: br {{.*}} !prof ![[IF4:[0-9]+]] } else if (i % 3) { - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 5 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 5 // PGOUSE: br {{.*}} !prof ![[IF5:[0-9]+]] if (i) {} } else { - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 6 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 6 // PGOUSE: br {{.*}} !prof ![[IF6:[0-9]+]] if (i) {} } - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 8 - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 7 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 8 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 7 // PGOUSE: br {{.*}} !prof ![[IF7:[0-9]+]] if (1 && i) {} - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 10 - // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 9 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 10 + // PGOGEN: atomicrmw add {{.*}} @[[IFC]], i64 0, i64 9 // PGOUSE: br {{.*}} !prof ![[IF8:[0-9]+]] if (0 || i) {} } - // PGOGEN-NOT: store {{.*}} @[[IFC]], + // PGOGEN-NOT: atomicrmw add {{.*}} @[[IFC]], // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ } // PGOGEN-LABEL: @early_exits() // PGOUSE-LABEL: @early_exits() -// PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[EEC]], i64 0, i64 0 void early_exits() { int i = 0; - // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[EEC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[EE1:[0-9]+]] if (i) {} - // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[EEC]], i64 0, i64 2 // PGOUSE: br {{.*}} !prof ![[EE2:[0-9]+]] while (i < 100) { i++; - // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[EEC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[EE3:[0-9]+]] if (i > 50) break; - // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 4 + // PGOGEN: atomicrmw add {{.*}} @[[EEC]], i64 0, i64 4 // PGOUSE: br {{.*}} !prof ![[EE4:[0-9]+]] if (i % 2) continue; } - // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 5 + // PGOGEN: atomicrmw add {{.*}} @[[EEC]], i64 0, i64 5 // PGOUSE: br {{.*}} !prof ![[EE5:[0-9]+]] if (i) {} - // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 6 + // PGOGEN: atomicrmw add {{.*}} @[[EEC]], i64 0, i64 6 do { - // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 7 + // PGOGEN: atomicrmw add {{.*}} @[[EEC]], i64 0, i64 7 // PGOUSE: br {{.*}} !prof ![[EE6:[0-9]+]] if (i > 75) return; @@ -120,337 +120,337 @@ // PGOUSE: br {{.*}} !prof ![[EE7:[0-9]+]] } while (i < 100); - // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 8 + // PGOGEN: atomicrmw add {{.*}} @[[EEC]], i64 0, i64 8 // Never reached -> no weights if (i) {} - // PGOGEN-NOT: store {{.*}} @[[EEC]], + // PGOGEN-NOT: atomicrmw add {{.*}} @[[EEC]], // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ } // PGOGEN-LABEL: @jumps() // PGOUSE-LABEL: @jumps() -// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 0 void jumps() { int i; - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[JM1:[0-9]+]] for (i = 0; i < 2; ++i) { goto outofloop; // Never reached -> no weights if (i) {} } -// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 3 +// PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 3 outofloop: - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 4 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 4 // PGOUSE: br {{.*}} !prof ![[JM2:[0-9]+]] if (i) {} goto loop1; - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 5 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 5 // PGOUSE: br {{.*}} !prof ![[JM3:[0-9]+]] while (i) { - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 6 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 6 loop1: - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 7 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 7 // PGOUSE: br {{.*}} !prof ![[JM4:[0-9]+]] if (i) {} } goto loop2; -// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 8 +// PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 8 first: -// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 9 +// PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 9 second: -// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 10 +// PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 10 third: i++; - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 11 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 11 // PGOUSE: br {{.*}} !prof ![[JM5:[0-9]+]] if (i < 3) goto loop2; - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 12 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 12 // PGOUSE: br {{.*}} !prof ![[JM6:[0-9]+]] while (i < 3) { - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 13 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 13 loop2: // PGOUSE: switch {{.*}} [ // PGOUSE: ], !prof ![[JM7:[0-9]+]] switch (i) { - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 15 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 15 case 0: goto first; - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 16 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 16 case 1: goto second; - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 17 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 17 case 2: goto third; } - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 14 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 14 } - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 18 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 18 // PGOUSE: br {{.*}} !prof ![[JM8:[0-9]+]] for (i = 0; i < 10; ++i) { goto withinloop; // never reached -> no weights if (i) {} - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 20 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 20 withinloop: - // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 21 + // PGOGEN: atomicrmw add {{.*}} @[[JMC]], i64 0, i64 21 // PGOUSE: br {{.*}} !prof ![[JM9:[0-9]+]] if (i) {} } - // PGOGEN-NOT: store {{.*}} @[[JMC]], + // PGOGEN-NOT: atomicrmw add {{.*}} @[[JMC]], // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ } // PGOGEN-LABEL: @switches() // PGOUSE-LABEL: @switches() -// PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 0 void switches() { static int weights[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5}; // No cases -> no weights switch (weights[0]) { - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 2 default: break; } - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 1 - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[SW1:[0-9]+]] for (int i = 0, len = sizeof(weights) / sizeof(weights[0]); i < len; ++i) { // PGOUSE: switch {{.*}} [ // PGOUSE: ], !prof ![[SW2:[0-9]+]] switch (i[weights]) { - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 5 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 5 case 1: - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 6 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 6 // PGOUSE: br {{.*}} !prof ![[SW3:[0-9]+]] if (i) {} // fallthrough - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 7 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 7 case 2: - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 8 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 8 // PGOUSE: br {{.*}} !prof ![[SW4:[0-9]+]] if (i) {} break; - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 9 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 9 case 3: - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 10 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 10 // PGOUSE: br {{.*}} !prof ![[SW5:[0-9]+]] if (i) {} continue; - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 11 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 11 case 4: - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 12 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 12 // PGOUSE: br {{.*}} !prof ![[SW6:[0-9]+]] if (i) {} // PGOUSE: switch {{.*}} [ // PGOUSE: ], !prof ![[SW7:[0-9]+]] switch (i) { - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 14 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 14 case 6 ... 9: - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 15 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 15 // PGOUSE: br {{.*}} !prof ![[SW8:[0-9]+]] if (i) {} continue; } - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 13 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 13 - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 16 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 16 default: - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 17 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 17 // PGOUSE: br {{.*}} !prof ![[SW9:[0-9]+]] if (i == len - 1) return; } - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 4 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 4 } - // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 18 + // PGOGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 18 // Never reached -> no weights if (weights[0]) {} - // PGOGEN-NOT: store {{.*}} @[[SWC]], + // PGOGEN-NOT: atomicrmw add {{.*}} @[[SWC]], // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ } // PGOGEN-LABEL: @big_switch() // PGOUSE-LABEL: @big_switch() -// PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 0 void big_switch() { - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[BS1:[0-9]+]] for (int i = 0; i < 32; ++i) { // PGOUSE: switch {{.*}} [ // PGOUSE: ], !prof ![[BS2:[0-9]+]] switch (1 << i) { - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 3 case (1 << 0): - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 4 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 4 // PGOUSE: br {{.*}} !prof ![[BS3:[0-9]+]] if (i) {} // fallthrough - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 5 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 5 case (1 << 1): - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 6 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 6 // PGOUSE: br {{.*}} !prof ![[BS4:[0-9]+]] if (i) {} break; - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 7 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 7 case (1 << 2) ... (1 << 12): - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 8 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 8 // PGOUSE: br {{.*}} !prof ![[BS5:[0-9]+]] if (i) {} break; // The branch for the large case range above appears after the case body // PGOUSE: br {{.*}} !prof ![[BS6:[0-9]+]] - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 9 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 9 case (1 << 13): - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 10 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 10 // PGOUSE: br {{.*}} !prof ![[BS7:[0-9]+]] if (i) {} break; - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 11 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 11 case (1 << 14) ... (1 << 28): - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 12 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 12 // PGOUSE: br {{.*}} !prof ![[BS8:[0-9]+]] if (i) {} break; // The branch for the large case range above appears after the case body // PGOUSE: br {{.*}} !prof ![[BS9:[0-9]+]] - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 13 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 13 case (1 << 29) ... ((1 << 29) + 1): - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 14 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 14 // PGOUSE: br {{.*}} !prof ![[BS10:[0-9]+]] if (i) {} break; - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 15 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 15 default: - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 16 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 16 // PGOUSE: br {{.*}} !prof ![[BS11:[0-9]+]] if (i) {} break; } - // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[BSC]], i64 0, i64 2 } - // PGOGEN-NOT: store {{.*}} @[[BSC]], + // PGOGEN-NOT: atomicrmw add {{.*}} @[[BSC]], // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ // PGOUSE: ret void } // PGOGEN-LABEL: @boolean_operators() // PGOUSE-LABEL: @boolean_operators() -// PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[BOC]], i64 0, i64 0 void boolean_operators() { int v; - // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[BOC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[BO1:[0-9]+]] for (int i = 0; i < 100; ++i) { - // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[BOC]], i64 0, i64 2 // PGOUSE: br {{.*}} !prof ![[BO2:[0-9]+]] v = i % 3 || i; - // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[BOC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[BO3:[0-9]+]] v = i % 3 && i; - // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 5 - // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 4 + // PGOGEN: atomicrmw add {{.*}} @[[BOC]], i64 0, i64 5 + // PGOGEN: atomicrmw add {{.*}} @[[BOC]], i64 0, i64 4 // PGOUSE: br {{.*}} !prof ![[BO4:[0-9]+]] // PGOUSE: br {{.*}} !prof ![[BO5:[0-9]+]] v = i % 3 || i % 2 || i; - // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 7 - // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 6 + // PGOGEN: atomicrmw add {{.*}} @[[BOC]], i64 0, i64 7 + // PGOGEN: atomicrmw add {{.*}} @[[BOC]], i64 0, i64 6 // PGOUSE: br {{.*}} !prof ![[BO6:[0-9]+]] // PGOUSE: br {{.*}} !prof ![[BO7:[0-9]+]] v = i % 2 && i % 3 && i; } - // PGOGEN-NOT: store {{.*}} @[[BOC]], + // PGOGEN-NOT: atomicrmw add {{.*}} @[[BOC]], // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ } // PGOGEN-LABEL: @boolop_loops() // PGOUSE-LABEL: @boolop_loops() -// PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 0 void boolop_loops() { int i = 100; - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 2 - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[BL1:[0-9]+]] // PGOUSE: br {{.*}} !prof ![[BL2:[0-9]+]] while (i && i > 50) i--; - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 4 - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 4 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[BL3:[0-9]+]] // PGOUSE: br {{.*}} !prof ![[BL4:[0-9]+]] while ((i % 2) || (i > 0)) i--; - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 6 - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 5 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 6 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 5 // PGOUSE: br {{.*}} !prof ![[BL5:[0-9]+]] // PGOUSE: br {{.*}} !prof ![[BL6:[0-9]+]] for (i = 100; i && i > 50; --i); - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 8 - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 7 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 8 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 7 // PGOUSE: br {{.*}} !prof ![[BL7:[0-9]+]] // PGOUSE: br {{.*}} !prof ![[BL8:[0-9]+]] for (; (i % 2) || (i > 0); --i); - // PGOGEN-NOT: store {{.*}} @[[BLC]], + // PGOGEN-NOT: atomicrmw add {{.*}} @[[BLC]], // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ } // PGOGEN-LABEL: @conditional_operator() // PGOUSE-LABEL: @conditional_operator() -// PGOGEN: store {{.*}} @[[COC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[COC]], i64 0, i64 0 void conditional_operator() { int i = 100; - // PGOGEN: store {{.*}} @[[COC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[COC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[CO1:[0-9]+]] int j = i < 50 ? i : 1; - // PGOGEN: store {{.*}} @[[COC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[COC]], i64 0, i64 2 // PGOUSE: br {{.*}} !prof ![[CO2:[0-9]+]] int k = i ?: 0; - // PGOGEN-NOT: store {{.*}} @[[COC]], + // PGOGEN-NOT: atomicrmw add {{.*}} @[[COC]], // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ } // PGOGEN-LABEL: @do_fallthrough() // PGOUSE-LABEL: @do_fallthrough() -// PGOGEN: store {{.*}} @[[DFC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[DFC]], i64 0, i64 0 void do_fallthrough() { - // PGOGEN: store {{.*}} @[[DFC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[DFC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[DF1:[0-9]+]] for (int i = 0; i < 10; ++i) { int j = 0; - // PGOGEN: store {{.*}} @[[DFC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[DFC]], i64 0, i64 2 do { // The number of exits out of this do-loop via the break statement // exceeds the counter value for the loop (which does not include the // fallthrough count). Make sure that does not violate any assertions. - // PGOGEN: store {{.*}} @[[DFC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[DFC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[DF3:[0-9]+]] if (i < 8) break; j++; @@ -461,9 +461,9 @@ // PGOGEN-LABEL: @static_func() // PGOUSE-LABEL: @static_func() -// PGOGEN: store {{.*}} @[[STC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[STC]], i64 0, i64 0 static void static_func() { - // PGOGEN: store {{.*}} @[[STC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[STC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[ST1:[0-9]+]] for (int i = 0; i < 10; ++i) { } Index: test/Profile/c-unreachable-after-switch.c =================================================================== --- test/Profile/c-unreachable-after-switch.c +++ test/Profile/c-unreachable-after-switch.c @@ -3,13 +3,13 @@ // CHECK: @[[C:__llvm_profile_counters_foo]] = private global [3 x i64] zeroinitializer // CHECK-LABEL: @foo() -// CHECK: store {{.*}} @[[C]], i64 0, i64 0 +// CHECK: atomicrmw add {{.*}} @[[C]], i64 0, i64 0 void foo() { - // CHECK: store {{.*}} @[[C]], i64 0, i64 2 + // CHECK: atomicrmw add {{.*}} @[[C]], i64 0, i64 2 switch (0) { default: return; } // We shouldn't emit the unreachable counter. This used to crash in GlobalDCE. - // CHECK-NOT: store {{.*}} @[[SWC]], i64 0, i64 1} + // CHECK-NOT: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 1} } Index: test/Profile/cxx-class.cpp =================================================================== --- test/Profile/cxx-class.cpp +++ test/Profile/cxx-class.cpp @@ -18,12 +18,12 @@ public: // CTRGEN-LABEL: define {{.*}} @_ZN6SimpleC2Ei( // CTRUSE-LABEL: define {{.*}} @_ZN6SimpleC2Ei( - // CTRGEN: store {{.*}} @[[SCC:__llvm_profile_counters__ZN6SimpleC2Ei]], i64 0, i64 0 + // CTRGEN: atomicrmw add {{.*}} @[[SCC:__llvm_profile_counters__ZN6SimpleC2Ei]], i64 0, i64 0 explicit Simple(int Member) : Member(Member) { - // CTRGEN: store {{.*}} @[[SCC]], i64 0, i64 1 + // CTRGEN: atomicrmw add {{.*}} @[[SCC]], i64 0, i64 1 // CTRUSE: br {{.*}} !prof ![[SC1:[0-9]+]] if (Member) {} - // CTRGEN-NOT: store {{.*}} @[[SCC]], + // CTRGEN-NOT: atomicrmw add {{.*}} @[[SCC]], // CTRUSE-NOT: br {{.*}} !prof ![0-9]+ // CTRUSE: ret } @@ -31,12 +31,12 @@ // DTRGEN-LABEL: define {{.*}} @_ZN6SimpleD2Ev( // DTRUSE-LABEL: define {{.*}} @_ZN6SimpleD2Ev( - // DTRGEN: store {{.*}} @[[SDC:__llvm_profile_counters__ZN6SimpleD2Ev]], i64 0, i64 0 + // DTRGEN: atomicrmw add {{.*}} @[[SDC:__llvm_profile_counters__ZN6SimpleD2Ev]], i64 0, i64 0 ~Simple() { - // DTRGEN: store {{.*}} @[[SDC]], i64 0, i64 1 + // DTRGEN: atomicrmw add {{.*}} @[[SDC]], i64 0, i64 1 // DTRUSE: br {{.*}} !prof ![[SD1:[0-9]+]] if (Member) {} - // DTRGEN-NOT: store {{.*}} @[[SDC]], + // DTRGEN-NOT: atomicrmw add {{.*}} @[[SDC]], // DTRUSE-NOT: br {{.*}} !prof ![0-9]+ // DTRUSE: ret } @@ -44,12 +44,12 @@ // MTHGEN-LABEL: define {{.*}} @_ZN6Simple6methodEv( // MTHUSE-LABEL: define {{.*}} @_ZN6Simple6methodEv( - // MTHGEN: store {{.*}} @[[SMC:__llvm_profile_counters__ZN6Simple6methodEv]], i64 0, i64 0 + // MTHGEN: atomicrmw add {{.*}} @[[SMC:__llvm_profile_counters__ZN6Simple6methodEv]], i64 0, i64 0 void method() { - // MTHGEN: store {{.*}} @[[SMC]], i64 0, i64 1 + // MTHGEN: atomicrmw add {{.*}} @[[SMC]], i64 0, i64 1 // MTHUSE: br {{.*}} !prof ![[SM1:[0-9]+]] if (Member) {} - // MTHGEN-NOT: store {{.*}} @[[SMC]], + // MTHGEN-NOT: atomicrmw add {{.*}} @[[SMC]], // MTHUSE-NOT: br {{.*}} !prof ![0-9]+ // MTHUSE: ret } @@ -58,15 +58,15 @@ // WRPGEN-LABEL: define {{.*}} @_Z14simple_wrapperv( // WRPUSE-LABEL: define {{.*}} @_Z14simple_wrapperv( -// WRPGEN: store {{.*}} @[[SWC:__llvm_profile_counters__Z14simple_wrapperv]], i64 0, i64 0 +// WRPGEN: atomicrmw add {{.*}} @[[SWC:__llvm_profile_counters__Z14simple_wrapperv]], i64 0, i64 0 void simple_wrapper() { - // WRPGEN: store {{.*}} @[[SWC]], i64 0, i64 1 + // WRPGEN: atomicrmw add {{.*}} @[[SWC]], i64 0, i64 1 // WRPUSE: br {{.*}} !prof ![[SW1:[0-9]+]] for (int I = 0; I < 100; ++I) { Simple S(I); S.method(); } - // WRPGEN-NOT: store {{.*}} @[[SWC]], + // WRPGEN-NOT: atomicrmw add {{.*}} @[[SWC]], // WRPUSE-NOT: br {{.*}} !prof ![0-9]+ // WRPUSE: ret } Index: test/Profile/cxx-lambda.cpp =================================================================== --- test/Profile/cxx-lambda.cpp +++ test/Profile/cxx-lambda.cpp @@ -15,32 +15,32 @@ // PGOGEN-LABEL: define {{.*}}void @_Z7lambdasv() // PGOUSE-LABEL: define {{.*}}void @_Z7lambdasv() -// PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[LWC]], i64 0, i64 0 void lambdas() { int i = 1; // LMBGEN-LABEL: define internal{{( [0-9_a-z]*cc)?( zeroext)?}} i1 @"_ZZ7lambdasvENK3$_0clEi"( // LMBUSE-LABEL: define internal{{( [0-9_a-z]*cc)?( zeroext)?}} i1 @"_ZZ7lambdasvENK3$_0clEi"( - // LMBGEN: store {{.*}} @[[LFC]], i64 0, i64 0 + // LMBGEN: atomicrmw add {{.*}} @[[LFC]], i64 0, i64 0 auto f = [&i](int k) { - // LMBGEN: store {{.*}} @[[LFC]], i64 0, i64 1 + // LMBGEN: atomicrmw add {{.*}} @[[LFC]], i64 0, i64 1 // LMBUSE: br {{.*}} !prof ![[LF1:[0-9]+]] if (i > 0) {} - // LMBGEN: store {{.*}} @[[LFC]], i64 0, i64 2 + // LMBGEN: atomicrmw add {{.*}} @[[LFC]], i64 0, i64 2 // LMBUSE: br {{.*}} !prof ![[LF2:[0-9]+]] return k && i; }; - // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[LWC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[LW1:[0-9]+]] if (i) {} - // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[LWC]], i64 0, i64 2 // PGOUSE: br {{.*}} !prof ![[LW2:[0-9]+]] for (i = 0; i < 10; ++i) f(9 - i); - // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[LWC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[LW3:[0-9]+]] if (i) {} } Index: test/Profile/cxx-rangefor.cpp =================================================================== --- test/Profile/cxx-rangefor.cpp +++ test/Profile/cxx-rangefor.cpp @@ -10,25 +10,25 @@ // PGOGEN: @[[RFC:__llvm_profile_counters__Z9range_forv]] = private global [5 x i64] zeroinitializer // CHECK-LABEL: define {{.*}}void @_Z9range_forv() -// PGOGEN: store {{.*}} @[[RFC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[RFC]], i64 0, i64 0 void range_for() { int arr[] = {1, 2, 3, 4, 5}; int sum = 0; - // PGOGEN: store {{.*}} @[[RFC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[RFC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[RF1:[0-9]+]] for (auto i : arr) { - // PGOGEN: store {{.*}} @[[RFC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[RFC]], i64 0, i64 2 // PGOUSE: br {{.*}} !prof ![[RF2:[0-9]+]] if (i == 3) continue; sum += i; - // PGOGEN: store {{.*}} @[[RFC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[RFC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[RF3:[0-9]+]] if (sum >= 7) break; } - // PGOGEN: store {{.*}} @[[RFC]], i64 0, i64 4 + // PGOGEN: atomicrmw add {{.*}} @[[RFC]], i64 0, i64 4 // PGOUSE: br {{.*}} !prof ![[RF4:[0-9]+]] if (sum) {} } Index: test/Profile/cxx-templates.cpp =================================================================== --- test/Profile/cxx-templates.cpp +++ test/Profile/cxx-templates.cpp @@ -19,13 +19,13 @@ // T100USE-LABEL: define linkonce_odr {{.*}}void @_Z4loopILj100EEvv() template void loop() { // ALL-NOT: ret - // T0GEN: store {{.*}} @[[T0C]], i64 0, i64 0 - // T100GEN: store {{.*}} @[[T100C]], i64 0, i64 0 + // T0GEN: atomicrmw add {{.*}} @[[T0C]], i64 0, i64 0 + // T100GEN: atomicrmw add {{.*}} @[[T100C]], i64 0, i64 0 // ALL-NOT: ret - // T0GEN: store {{.*}} @[[T0C]], i64 0, i64 1 + // T0GEN: atomicrmw add {{.*}} @[[T0C]], i64 0, i64 1 // T0USE: br {{.*}} !prof ![[T01:[0-9]+]] - // T100GEN: store {{.*}} @[[T100C]], i64 0, i64 1 + // T100GEN: atomicrmw add {{.*}} @[[T100C]], i64 0, i64 1 // T100USE: br {{.*}} !prof ![[T1001:[0-9]+]] for (unsigned I = 0; I < N; ++I) {} Index: test/Profile/cxx-throws.cpp =================================================================== --- test/Profile/cxx-throws.cpp +++ test/Profile/cxx-throws.cpp @@ -16,16 +16,16 @@ // PGOGEN-LABEL: @_Z6throwsv() // PGOUSE-LABEL: @_Z6throwsv() -// PGOGEN: store {{.*}} @[[THC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[THC]], i64 0, i64 0 void throws() { - // PGOGEN: store {{.*}} @[[THC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[THC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[TH1:[0-9]+]] for (int i = 0; i < 100; ++i) { try { - // PGOGEN: store {{.*}} @[[THC]], i64 0, i64 3 + // PGOGEN: atomicrmw add {{.*}} @[[THC]], i64 0, i64 3 // PGOUSE: br {{.*}} !prof ![[TH2:[0-9]+]] if (i % 3) { - // PGOGEN: store {{.*}} @[[THC]], i64 0, i64 4 + // PGOGEN: atomicrmw add {{.*}} @[[THC]], i64 0, i64 4 // PGOUSE: br {{.*}} !prof ![[TH3:[0-9]+]] if (i < 50) throw 1; @@ -36,7 +36,7 @@ // PGOUSE: if.else{{.*}}: // PGOGEN: if.else{{.*}}: - // PGOGEN: store {{.*}} @[[THC]], i64 0, i64 5 + // PGOGEN: atomicrmw add {{.*}} @[[THC]], i64 0, i64 5 // PGOUSE: br {{.*}} !prof ![[TH4:[0-9]+]] if (i >= 50) throw 0; @@ -45,14 +45,14 @@ // PGOUSE-EXC: catch{{.*}}: // PGOGEN-EXC: catch{{.*}}: - // PGOGEN-EXC: store {{.*}} @[[THC]], i64 0, i64 6 - // PGOGEN-EXC: store {{.*}} @[[THC]], i64 0, i64 7 + // PGOGEN-EXC: atomicrmw add {{.*}} @[[THC]], i64 0, i64 6 + // PGOGEN-EXC: atomicrmw add {{.*}} @[[THC]], i64 0, i64 7 // PGOUSE-EXC: br {{.*}} !prof ![[TH5:[0-9]+]] if (e) {} } - // PGOGEN: store {{.*}} @[[THC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[THC]], i64 0, i64 2 - // PGOGEN: store {{.*}} @[[THC]], i64 0, i64 8 + // PGOGEN: atomicrmw add {{.*}} @[[THC]], i64 0, i64 8 // PGOUSE: br {{.*}} !prof ![[TH6:[0-9]+]] if (i < 100) {} } @@ -63,14 +63,14 @@ // PGOGEN-LABEL: @_Z11unreachablei(i32 // PGOUSE-LABEL: @_Z11unreachablei(i32 -// PGOGEN: store {{.*}} @[[UNC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[UNC]], i64 0, i64 0 void unreachable(int i) { - // PGOGEN: store {{.*}} @[[UNC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[UNC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[UN1:[0-9]+]] if (i) throw i; - // PGOGEN: store {{.*}} @[[UNC]], i64 0, i64 2 + // PGOGEN: atomicrmw add {{.*}} @[[UNC]], i64 0, i64 2 // Since we never reach here, the weights should all be zero (and skipped) // PGOUSE-NOT: br {{.*}} !prof !{{.*}} if (i) {} Index: test/Profile/objc-general.m =================================================================== --- test/Profile/objc-general.m +++ test/Profile/objc-general.m @@ -42,19 +42,19 @@ @implementation A // PGOGEN: define {{.*}}+[A foreach:] // PGOUSE: define {{.*}}+[A foreach:] -// PGOGEN: store {{.*}} @[[FRC]], i64 0, i64 0 +// PGOGEN: atomicrmw add {{.*}} @[[FRC]], i64 0, i64 0 + (void)foreach: (NSArray *)array { __block id result; - // PGOGEN: store {{.*}} @[[FRC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[FRC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[FR1:[0-9]+]] // PGOUSE: br {{.*}} !prof ![[FR2:[0-9]+]] for (id x in array) { // PGOGEN: define {{.*}}_block_invoke // PGOUSE: define {{.*}}_block_invoke - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 0 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 0 ^{ static int init = 0; - // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 1 + // PGOGEN: atomicrmw add {{.*}} @[[BLC]], i64 0, i64 1 // PGOUSE: br {{.*}} !prof ![[BL1:[0-9]+]] if (init) result = x;