1; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -verify-machineinstrs -apply-ext-tsp-for-size < %s | FileCheck %s -check-prefix=CHECK-SIZE 2; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK-PERF 3 4define void @func1() minsize { 5; 6; +-----+ 7; | b0 | -+ 8; +-----+ | 9; | | 10; | 10 | 11; v | 12; +-----+ | 13; | b1 | | 10000 14; +-----+ | 15; | | 16; | 10 | 17; v | 18; +-----+ | 19; | b2 | <+ 20; +-----+ 21; 22; CHECK-SIZE-LABEL: func1: 23; CHECK-SIZE: %b0 24; CHECK-SIZE: %b1 25; CHECK-SIZE: %b2 26; 27; CHECK-PERF-LABEL: func1: 28; CHECK-PERF: %b0 29; CHECK-PERF: %b2 30; CHECK-PERF: %b1 31 32b0: 33 %call = call zeroext i1 @a() 34 br i1 %call, label %b1, label %b2, !prof !1 35 36b1: 37 call void @d() 38 call void @d() 39 call void @d() 40 br label %b2 41 42b2: 43 call void @e() 44 ret void 45} 46 47define void @func_loop() minsize !prof !9 { 48; Test that the algorithm can rotate loops in the presence of profile data. 49; 50; +--------+ 51; | entry | 52; +--------+ 53; | 54; | 1 55; v 56; +--------+ 16 +--------+ 57; | if.then| <---- | header | <+ 58; +--------+ +--------+ | 59; | | | 60; | | 160 | 61; | v | 62; | +--------+ | 63; | | if.else| | 175 64; | +--------+ | 65; | | | 66; | | 160 | 67; | v | 68; | 16 +--------+ | 69; +------------> | if.end | -+ 70; +--------+ 71; | 72; | 1 73; v 74; +--------+ 75; | end | 76; +--------+ 77; 78; CHECK-SIZE-LABEL: func_loop: 79; CHECK-SIZE: %entry 80; CHECK-SIZE: %header 81; CHECK-SIZE: %if.then 82; CHECK-SIZE: %if.else 83; CHECK-SIZE: %if.end 84; CHECK-SIZE: %end 85; 86; CHECK-PERF-LABEL: func_loop: 87; CHECK-PERF: %entry 88; CHECK-PERF: %header 89; CHECK-PERF: %if.else 90; CHECK-PERF: %if.end 91; CHECK-PERF: %if.then 92; CHECK-PERF: %end 93 94entry: 95 br label %header 96 97header: 98 call void @e() 99 %call = call zeroext i1 @a() 100 br i1 %call, label %if.then, label %if.else, !prof !10 101 102if.then: 103 call void @f() 104 br label %if.end 105 106if.else: 107 call void @g() 108 br label %if.end 109 110if.end: 111 call void @h() 112 %call2 = call zeroext i1 @a() 113 br i1 %call2, label %header, label %end 114 115end: 116 ret void 117} 118 119 120declare zeroext i1 @a() 121declare void @b() 122declare void @c() 123declare void @d() 124declare void @e() 125declare void @g() 126declare void @f() 127declare void @h() 128 129!1 = !{!"branch_weights", i32 10, i32 10000} 130!9 = !{!"function_entry_count", i64 1} 131!10 = !{!"branch_weights", i32 16, i32 160} 132