1*f5b81aa6Sgulfemsavrun; RUN: opt < %s -S -passes=instrprof -conditional-counter-update | FileCheck %s 2*f5b81aa6Sgulfemsavrun 3*f5b81aa6Sgulfemsavruntarget triple = "x86_64-unknown-linux-gnu" 4*f5b81aa6Sgulfemsavrun 5*f5b81aa6Sgulfemsavrun@__profn_foo = private constant [3 x i8] c"foo" 6*f5b81aa6Sgulfemsavrun@__profn_bar = private constant [3 x i8] c"bar" 7*f5b81aa6Sgulfemsavrun 8*f5b81aa6Sgulfemsavrun; CHECK-LABEL: define void @foo 9*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %pgocount = load i8, ptr @__profc_foo, align 1 10*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %pgocount.ifnonzero = icmp ne i8 %pgocount, 0 11*f5b81aa6Sgulfemsavrun; CHECK-NEXT: br i1 %pgocount.ifnonzero, label %1, label %2 12*f5b81aa6Sgulfemsavrun 13*f5b81aa6Sgulfemsavrun; CHECK-LABEL: 1: 14*f5b81aa6Sgulfemsavrun; CHECK-NEXT: store i8 0, ptr @__profc_foo, align 1 15*f5b81aa6Sgulfemsavrun; CHECK-NEXT: br label %2 16*f5b81aa6Sgulfemsavrun 17*f5b81aa6Sgulfemsavrun; CHECK-LABEL: 2: 18*f5b81aa6Sgulfemsavrun; CHECK-NEXT: ret void 19*f5b81aa6Sgulfemsavrundefine void @foo() { 20*f5b81aa6Sgulfemsavrun call void @llvm.instrprof.cover(ptr @__profn_foo, i64 0, i32 1, i32 0) 21*f5b81aa6Sgulfemsavrun ret void 22*f5b81aa6Sgulfemsavrun} 23*f5b81aa6Sgulfemsavrun 24*f5b81aa6Sgulfemsavrun; CHECK-LABEL: define i32 @bar 25*f5b81aa6Sgulfemsavrun; CHECK-LABEL: entry: 26*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %retval = alloca i32, align 4 27*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %cond.addr = alloca i32, align 4 28*f5b81aa6Sgulfemsavrun; CHECK-NEXT: store i32 %cond, ptr %cond.addr, align 4 29*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %pgocount = load i8, ptr @__profc_bar, align 1 30*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %pgocount.ifnonzero = icmp ne i8 %pgocount, 0 31*f5b81aa6Sgulfemsavrun; CHECK-NEXT: br i1 %pgocount.ifnonzero, label %0, label %1 32*f5b81aa6Sgulfemsavrun 33*f5b81aa6Sgulfemsavrun; CHECK-LABEL: 0: ; preds = %entry 34*f5b81aa6Sgulfemsavrun; CHECK-NEXT: store i8 0, ptr @__profc_bar, align 1 35*f5b81aa6Sgulfemsavrun; CHECK-NEXT: br label %1 36*f5b81aa6Sgulfemsavrun 37*f5b81aa6Sgulfemsavrun; CHECK-LABEL: 1: ; preds = %entry, %0 38*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %2 = load i32, ptr %cond.addr, align 4 39*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %cmp = icmp slt i32 %2, 0 40*f5b81aa6Sgulfemsavrun; CHECK-NEXT: br i1 %cmp, label %if.then, label %if.end 41*f5b81aa6Sgulfemsavrun 42*f5b81aa6Sgulfemsavrun; CHECK-LABEL: if.then: ; preds = %1 43*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %pgocount1 = load i8, ptr getelementptr inbounds ([3 x i8], ptr @__profc_bar, i32 0, i32 1), align 1 44*f5b81aa6Sgulfemsavrun; CHECK-NEXT: %pgocount.ifnonzero2 = icmp ne i8 %pgocount1, 0 45*f5b81aa6Sgulfemsavrun; CHECK-NEXT: br i1 %pgocount.ifnonzero2, label %3, label %4 46*f5b81aa6Sgulfemsavrundefine i32 @bar(i32 %cond) #0 { 47*f5b81aa6Sgulfemsavrunentry: 48*f5b81aa6Sgulfemsavrun %retval = alloca i32, align 4 49*f5b81aa6Sgulfemsavrun %cond.addr = alloca i32, align 4 50*f5b81aa6Sgulfemsavrun store i32 %cond, ptr %cond.addr, align 4 51*f5b81aa6Sgulfemsavrun call void @llvm.instrprof.cover(ptr @__profn_bar, i64 0, i32 3, i32 0) 52*f5b81aa6Sgulfemsavrun %0 = load i32, ptr %cond.addr, align 4 53*f5b81aa6Sgulfemsavrun %cmp = icmp slt i32 %0, 0 54*f5b81aa6Sgulfemsavrun br i1 %cmp, label %if.then, label %if.end 55*f5b81aa6Sgulfemsavrun 56*f5b81aa6Sgulfemsavrunif.then: ; preds = %entry 57*f5b81aa6Sgulfemsavrun call void @llvm.instrprof.cover(ptr @__profn_bar, i64 0, i32 3, i32 1) 58*f5b81aa6Sgulfemsavrun store i32 -1, ptr %retval, align 4 59*f5b81aa6Sgulfemsavrun br label %return 60*f5b81aa6Sgulfemsavrun 61*f5b81aa6Sgulfemsavrunif.end: ; preds = %entry 62*f5b81aa6Sgulfemsavrun call void @llvm.instrprof.cover(ptr @__profn_bar, i64 0, i32 3, i32 2) 63*f5b81aa6Sgulfemsavrun store i32 0, ptr %retval, align 4 64*f5b81aa6Sgulfemsavrun br label %return 65*f5b81aa6Sgulfemsavrun 66*f5b81aa6Sgulfemsavrunreturn: ; preds = %if.end, %if.then 67*f5b81aa6Sgulfemsavrun %1 = load i32, ptr %retval, align 4 68*f5b81aa6Sgulfemsavrun ret i32 %1 69*f5b81aa6Sgulfemsavrun} 70