| ; Test the profile summary for context sensitive PGO (CSPGO) |
| |
| ; RUN: llvm-profdata merge %S/Inputs/cspgo.proftext -o %t.profdata |
| ; RUN: opt < %s -passes='default<O2>' -disable-preinline -pgo-instrument-entry=false -pgo-kind=pgo-instr-use-pipeline -profile-file=%t.profdata -S | FileCheck %s --check-prefix=PGOSUMMARY |
| ; RUN: opt < %s -O2 -disable-preinline -pgo-instrument-entry=false -pgo-kind=pgo-instr-use-pipeline -profile-file=%t.profdata -S | FileCheck %s --check-prefix=PGOSUMMARY |
| ; RUN: opt < %s -O2 -disable-preinline -pgo-instrument-entry=false -pgo-kind=pgo-instr-use-pipeline -profile-file=%t.profdata -S -cspgo-kind=cspgo-instr-use-pipeline| FileCheck %s --check-prefix=CSPGOSUMMARY |
| |
| target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| target triple = "x86_64-unknown-linux-gnu" |
| |
| @odd = common dso_local global i32 0, align 4 |
| @even = common dso_local global i32 0, align 4 |
| @not_six = common dso_local global i32 0, align 4 |
| |
| define dso_local i32 @goo(i32 %n) { |
| entry: |
| %i = alloca i32, align 4 |
| store volatile i32 %n, ptr %i, align 4 |
| %i.0. = load volatile i32, ptr %i, align 4 |
| ret i32 %i.0. |
| } |
| |
| define dso_local void @bar(i32 %n) { |
| entry: |
| %call = call fastcc i32 @cond(i32 %n) |
| %tobool = icmp eq i32 %call, 0 |
| br i1 %tobool, label %if.else, label %if.then |
| |
| if.then: |
| %0 = load i32, ptr @odd, align 4 |
| %inc = add i32 %0, 1 |
| store i32 %inc, ptr @odd, align 4 |
| br label %if.end |
| |
| if.else: |
| %1 = load i32, ptr @even, align 4 |
| %inc1 = add i32 %1, 1 |
| store i32 %inc1, ptr @even, align 4 |
| br label %if.end |
| |
| if.end: |
| br label %for.cond |
| |
| for.cond: |
| %i.0 = phi i32 [ 0, %if.end ], [ %inc6, %for.inc ] |
| %cmp = icmp ult i32 %i.0, 4 |
| br i1 %cmp, label %for.body, label %for.end |
| |
| for.body: |
| %mul = mul nsw i32 %i.0, %n |
| %rem = srem i32 %mul, 6 |
| %tobool2 = icmp eq i32 %rem, 0 |
| br i1 %tobool2, label %for.inc, label %if.then3 |
| |
| if.then3: |
| %2 = load i32, ptr @not_six, align 4 |
| %inc4 = add i32 %2, 1 |
| store i32 %inc4, ptr @not_six, align 4 |
| br label %for.inc |
| |
| for.inc: |
| %inc6 = add nuw nsw i32 %i.0, 1 |
| br label %for.cond |
| |
| for.end: |
| ret void |
| } |
| ; PGOSUMMARY-LABEL: @bar |
| ; PGOSUMMARY: %even.odd = select i1 %tobool{{[0-9]*}}, ptr @even, ptr @odd |
| ; PGOSUMMARY-SAME: !prof ![[BW_PGO_BAR:[0-9]+]] |
| ; CSPGOSUMMARY-LABEL: @bar |
| ; CSPGOSUMMARY: %even.odd = select i1 %tobool{{[0-9]*}}, ptr @even, ptr @odd |
| ; CSPGOSUMMARY-SAME: !prof ![[BW_CSPGO_BAR:[0-9]+]] |
| |
| define internal fastcc i32 @cond(i32 %i) { |
| entry: |
| %rem = srem i32 %i, 2 |
| ret i32 %rem |
| } |
| |
| define dso_local void @foo() { |
| entry: |
| br label %for.cond |
| |
| for.cond: |
| %i.0 = phi i32 [ 0, %entry ], [ %add4, %for.body ] |
| %cmp = icmp slt i32 %i.0, 200000 |
| br i1 %cmp, label %for.body, label %for.end |
| |
| for.body: |
| %call = call i32 @goo(i32 %i.0) |
| call void @bar(i32 %call) |
| %add = add nsw i32 %call, 1 |
| call void @bar(i32 %add) |
| %call1 = call i32 @bar_m(i32 %call) #4 |
| %call3 = call i32 @bar_m2(i32 %add) #4 |
| call fastcc void @barbar() |
| %add4 = add nsw i32 %call, 2 |
| br label %for.cond |
| |
| for.end: |
| ret void |
| } |
| ; CSPGOSUMMARY-LABEL: @foo |
| ; CSPGOSUMMARY: %even.odd.i = select i1 %tobool.i{{[0-9]*}}, ptr @even, ptr @odd |
| ; CSPGOSUMMARY-SAME: !prof ![[BW_CSPGO_BAR]] |
| ; CSPGOSUMMARY: %even.odd.i2 = select i1 %tobool.i{{[0-9]*}}, ptr @even, ptr @odd |
| ; CSPGOSUMMARY-SAME: !prof ![[BW_CSPGO_BAR]] |
| |
| declare dso_local i32 @bar_m(i32) |
| declare dso_local i32 @bar_m2(i32) |
| |
| define internal fastcc void @barbar() { |
| entry: |
| %0 = load i32, ptr @odd, align 4 |
| %inc = add i32 %0, 1 |
| store i32 %inc, ptr @odd, align 4 |
| ret void |
| } |
| |
| define dso_local i32 @main() { |
| entry: |
| call void @foo() |
| ret i32 0 |
| } |
| |
| ; PGOSUMMARY: {{![0-9]+}} = !{i32 1, !"ProfileSummary", !{{[0-9]+}}} |
| ; PGOSUMMARY: {{![0-9]+}} = !{!"ProfileFormat", !"InstrProf"} |
| ; PGOSUMMARY: {{![0-9]+}} = !{!"TotalCount", i64 2100001} |
| ; PGOSUMMARY: {{![0-9]+}} = !{!"MaxCount", i64 800000} |
| ; PGOSUMMARY: {{![0-9]+}} = !{!"MaxInternalCount", i64 399999} |
| ; PGOSUMMARY: {{![0-9]+}} = !{!"MaxFunctionCount", i64 800000} |
| ; PGOSUMMARY: {{![0-9]+}} = !{!"NumCounts", i64 14} |
| ; PGOSUMMARY: {{![0-9]+}} = !{!"NumFunctions", i64 8} |
| ; PGOSUMMARY-DAG: ![[BW_PGO_BAR]] = !{!"branch_weights", i32 100000, i32 100000} |
| |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{i32 1, !"ProfileSummary", !1} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"ProfileFormat", !"InstrProf"} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"TotalCount", i64 2100001} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"MaxCount", i64 800000} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"MaxInternalCount", i64 399999} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"MaxFunctionCount", i64 800000} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"NumCounts", i64 14} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"NumFunctions", i64 8} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"DetailedSummary", !{{[0-9]+}}} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{i32 1, !"CSProfileSummary", !{{[0-9]+}}} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"ProfileFormat", !"CSInstrProf"} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"TotalCount", i64 1299950} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"MaxCount", i64 200000} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"MaxInternalCount", i64 100000} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"MaxFunctionCount", i64 200000} |
| ; CSPGOSUMMARY: {{![0-9]+}} = !{!"NumCounts", i64 23} |
| ; CSPGOSUMMARY-DAG: ![[BW_CSPGO_BAR]] = !{!"branch_weights", i32 100000, i32 100000} |