13155e307SPaul Kirth; Test that misexpect diagnostics are issued in sample profiling 23155e307SPaul Kirth; RUN: opt < %s -passes="function(lower-expect),sample-profile" -sample-profile-file=%S/Inputs/misexpect.prof -pgo-warn-misexpect -S 2>&1 | FileCheck %s --check-prefix=WARNING 33155e307SPaul Kirth 43155e307SPaul Kirth; Test that if expect intrinsics are not lowered, then no diagnostics are issued 53155e307SPaul Kirth; RUN: opt < %s -passes="sample-profile" -sample-profile-file=%S/Inputs/misexpect.prof -pgo-warn-misexpect -S 2>&1 | FileCheck %s --check-prefix=NONE 63155e307SPaul Kirth 73155e307SPaul Kirth; Original C++ code for this test case: 83155e307SPaul Kirth; 93155e307SPaul Kirth; #include <stdio.h> 103155e307SPaul Kirth; #include <stdlib.h> 113155e307SPaul Kirth 123155e307SPaul Kirth; int main(int argc, char *argv[]) { 133155e307SPaul Kirth; if (argc < 2) 143155e307SPaul Kirth; return 1; 153155e307SPaul Kirth; double result; 163155e307SPaul Kirth; int limit = atoi(argv[1]); 173155e307SPaul Kirth; if (limit > 100) { 183155e307SPaul Kirth; double s = 23.041968 * atoi(argv[2]); 193155e307SPaul Kirth; for (int u = 0; u < limit; u++) { 203155e307SPaul Kirth; double x = s; 213155e307SPaul Kirth; s = x + 3.049 + (double)u; 223155e307SPaul Kirth; s -= s + 3.94 / x * 0.32; 233155e307SPaul Kirth; } 243155e307SPaul Kirth; result = s; 253155e307SPaul Kirth; } else { 263155e307SPaul Kirth; result = atoi(argv[2]); 273155e307SPaul Kirth; } 283155e307SPaul Kirth; printf("result is %lf\n", result); 293155e307SPaul Kirth; return 0; 303155e307SPaul Kirth; } 313155e307SPaul Kirth 323155e307SPaul Kirth; WARNING-DAG: warning: test.cc:9:14: 20.06% 333155e307SPaul Kirth; WARNING-DAG: warning: test.cc:11:24: 92.74% 343155e307SPaul Kirth 353155e307SPaul Kirth; NONE-NOT: warning: test.cc:9:14: 20.06% 363155e307SPaul Kirth; NONE-NOT: warning: test.cc:11:24: 92.74% 373155e307SPaul Kirth 383155e307SPaul Kirth@.str = private unnamed_addr constant [15 x i8] c"result is %lf\0A\00", align 1 393155e307SPaul Kirth 403155e307SPaul Kirth; Function Attrs: uwtable 41*0d2271bbSMatt Arsenaultdefine i32 @main(i32 %argc, ptr %argv) #0 !dbg !6 { 423155e307SPaul Kirth 433155e307SPaul Kirthentry: 443155e307SPaul Kirth %retval = alloca i32, align 4 453155e307SPaul Kirth %argc.addr = alloca i32, align 4 46*0d2271bbSMatt Arsenault %argv.addr = alloca ptr, align 8 473155e307SPaul Kirth %result = alloca double, align 8 483155e307SPaul Kirth %limit = alloca i32, align 4 493155e307SPaul Kirth %s = alloca double, align 8 503155e307SPaul Kirth %u = alloca i32, align 4 513155e307SPaul Kirth %x = alloca double, align 8 52*0d2271bbSMatt Arsenault store i32 0, ptr %retval, align 4 53*0d2271bbSMatt Arsenault store i32 %argc, ptr %argc.addr, align 4 54*0d2271bbSMatt Arsenault call void @llvm.dbg.declare(metadata ptr %argc.addr, metadata !16, metadata !17), !dbg !18 55*0d2271bbSMatt Arsenault store ptr %argv, ptr %argv.addr, align 8 56*0d2271bbSMatt Arsenault call void @llvm.dbg.declare(metadata ptr %argv.addr, metadata !19, metadata !17), !dbg !20 57*0d2271bbSMatt Arsenault %0 = load i32, ptr %argc.addr, align 4, !dbg !21 583155e307SPaul Kirth %cmp = icmp slt i32 %0, 2, !dbg !23 593155e307SPaul Kirth br i1 %cmp, label %if.then, label %if.end, !dbg !24 603155e307SPaul Kirth 613155e307SPaul Kirthif.then: ; preds = %entry 62*0d2271bbSMatt Arsenault store i32 1, ptr %retval, align 4, !dbg !25 633155e307SPaul Kirth br label %return, !dbg !25 643155e307SPaul Kirth 653155e307SPaul Kirthif.end: ; preds = %entry 66*0d2271bbSMatt Arsenault call void @llvm.dbg.declare(metadata ptr %result, metadata !26, metadata !17), !dbg !27 67*0d2271bbSMatt Arsenault call void @llvm.dbg.declare(metadata ptr %limit, metadata !28, metadata !17), !dbg !29 68*0d2271bbSMatt Arsenault %1 = load ptr, ptr %argv.addr, align 8, !dbg !30 69*0d2271bbSMatt Arsenault %arrayidx = getelementptr inbounds ptr, ptr %1, i64 1, !dbg !30 70*0d2271bbSMatt Arsenault %2 = load ptr, ptr %arrayidx, align 8, !dbg !30 71*0d2271bbSMatt Arsenault %call = call i32 @atoi(ptr %2) #4, !dbg !31 72*0d2271bbSMatt Arsenault store i32 %call, ptr %limit, align 4, !dbg !29 73*0d2271bbSMatt Arsenault %3 = load i32, ptr %limit, align 4, !dbg !32 743155e307SPaul Kirth %exp = call i32 @llvm.expect.i32(i32 %3, i32 0) 753155e307SPaul Kirth %tobool = icmp ne i32 %exp, 0, !dbg !34 763155e307SPaul Kirth br i1 %tobool, label %if.then.2, label %if.else, !dbg !35 773155e307SPaul Kirth 783155e307SPaul Kirthif.then.2: ; preds = %if.end 79*0d2271bbSMatt Arsenault call void @llvm.dbg.declare(metadata ptr %s, metadata !36, metadata !17), !dbg !38 80*0d2271bbSMatt Arsenault %4 = load ptr, ptr %argv.addr, align 8, !dbg !39 81*0d2271bbSMatt Arsenault %arrayidx3 = getelementptr inbounds ptr, ptr %4, i64 2, !dbg !39 82*0d2271bbSMatt Arsenault %5 = load ptr, ptr %arrayidx3, align 8, !dbg !39 83*0d2271bbSMatt Arsenault %call4 = call i32 @atoi(ptr %5) #4, !dbg !40 843155e307SPaul Kirth %conv = sitofp i32 %call4 to double, !dbg !40 853155e307SPaul Kirth %mul = fmul double 0x40370ABE6A337A81, %conv, !dbg !41 86*0d2271bbSMatt Arsenault store double %mul, ptr %s, align 8, !dbg !38 87*0d2271bbSMatt Arsenault call void @llvm.dbg.declare(metadata ptr %u, metadata !42, metadata !17), !dbg !44 88*0d2271bbSMatt Arsenault store i32 0, ptr %u, align 4, !dbg !44 893155e307SPaul Kirth br label %for.cond, !dbg !45 903155e307SPaul Kirth 913155e307SPaul Kirthfor.cond: ; preds = %for.inc, %if.then.2 92*0d2271bbSMatt Arsenault %6 = load i32, ptr %u, align 4, !dbg !46 93*0d2271bbSMatt Arsenault %7 = load i32, ptr %limit, align 4, !dbg !48 943155e307SPaul Kirth %expval = call i32 @llvm.expect.i32(i32 %6, i32 1) 953155e307SPaul Kirth %cmp5 = icmp ne i32 %expval, 0, !dbg !49 963155e307SPaul Kirth br i1 %cmp5, label %for.body, label %for.end, !dbg !50 973155e307SPaul Kirth 983155e307SPaul Kirthfor.body: ; preds = %for.cond 99*0d2271bbSMatt Arsenault call void @llvm.dbg.declare(metadata ptr %x, metadata !51, metadata !17), !dbg !53 100*0d2271bbSMatt Arsenault %8 = load double, ptr %s, align 8, !dbg !54 101*0d2271bbSMatt Arsenault store double %8, ptr %x, align 8, !dbg !53 102*0d2271bbSMatt Arsenault %9 = load double, ptr %x, align 8, !dbg !55 1033155e307SPaul Kirth %add = fadd double %9, 3.049000e+00, !dbg !56 104*0d2271bbSMatt Arsenault %10 = load i32, ptr %u, align 4, !dbg !57 1053155e307SPaul Kirth %conv6 = sitofp i32 %10 to double, !dbg !57 1063155e307SPaul Kirth %add7 = fadd double %add, %conv6, !dbg !58 107*0d2271bbSMatt Arsenault store double %add7, ptr %s, align 8, !dbg !59 108*0d2271bbSMatt Arsenault %11 = load double, ptr %s, align 8, !dbg !60 109*0d2271bbSMatt Arsenault %12 = load double, ptr %x, align 8, !dbg !61 1103155e307SPaul Kirth %div = fdiv double 3.940000e+00, %12, !dbg !62 1113155e307SPaul Kirth %mul8 = fmul double %div, 3.200000e-01, !dbg !63 1123155e307SPaul Kirth %add9 = fadd double %11, %mul8, !dbg !64 113*0d2271bbSMatt Arsenault %13 = load double, ptr %s, align 8, !dbg !65 1143155e307SPaul Kirth %sub = fsub double %13, %add9, !dbg !65 115*0d2271bbSMatt Arsenault store double %sub, ptr %s, align 8, !dbg !65 1163155e307SPaul Kirth br label %for.inc, !dbg !66 1173155e307SPaul Kirth 1183155e307SPaul Kirthfor.inc: ; preds = %for.body 119*0d2271bbSMatt Arsenault %14 = load i32, ptr %u, align 4, !dbg !67 1203155e307SPaul Kirth %inc = add nsw i32 %14, 1, !dbg !67 121*0d2271bbSMatt Arsenault store i32 %inc, ptr %u, align 4, !dbg !67 1223155e307SPaul Kirth br label %for.cond, !dbg !68 1233155e307SPaul Kirth 1243155e307SPaul Kirthfor.end: ; preds = %for.cond 125*0d2271bbSMatt Arsenault %15 = load double, ptr %s, align 8, !dbg !69 126*0d2271bbSMatt Arsenault store double %15, ptr %result, align 8, !dbg !70 1273155e307SPaul Kirth br label %if.end.13, !dbg !71 1283155e307SPaul Kirth 1293155e307SPaul Kirthif.else: ; preds = %if.end 130*0d2271bbSMatt Arsenault %16 = load ptr, ptr %argv.addr, align 8, !dbg !72 131*0d2271bbSMatt Arsenault %arrayidx10 = getelementptr inbounds ptr, ptr %16, i64 2, !dbg !72 132*0d2271bbSMatt Arsenault %17 = load ptr, ptr %arrayidx10, align 8, !dbg !72 133*0d2271bbSMatt Arsenault %call11 = call i32 @atoi(ptr %17) #4, !dbg !74 1343155e307SPaul Kirth %conv12 = sitofp i32 %call11 to double, !dbg !74 135*0d2271bbSMatt Arsenault store double %conv12, ptr %result, align 8, !dbg !75 1363155e307SPaul Kirth br label %if.end.13 1373155e307SPaul Kirth 1383155e307SPaul Kirthif.end.13: ; preds = %if.else, %for.end 139*0d2271bbSMatt Arsenault %18 = load double, ptr %result, align 8, !dbg !76 140*0d2271bbSMatt Arsenault %call14 = call i32 (ptr, ...) @printf(ptr @.str, double %18), !dbg !77 141*0d2271bbSMatt Arsenault store i32 0, ptr %retval, align 4, !dbg !78 1423155e307SPaul Kirth br label %return, !dbg !78 1433155e307SPaul Kirth 1443155e307SPaul Kirthreturn: ; preds = %if.end.13, %if.then 145*0d2271bbSMatt Arsenault %19 = load i32, ptr %retval, align 4, !dbg !79 1463155e307SPaul Kirth ret i32 %19, !dbg !79 1473155e307SPaul Kirth} 1483155e307SPaul Kirth 1493155e307SPaul Kirth; Function Attrs: nounwind readnone 1503155e307SPaul Kirthdeclare void @llvm.dbg.declare(metadata, metadata, metadata) #1 1513155e307SPaul Kirth 1523155e307SPaul Kirth; Function Attrs: nounwind readonly 153*0d2271bbSMatt Arsenaultdeclare i32 @atoi(ptr) #2 1543155e307SPaul Kirth 155*0d2271bbSMatt Arsenaultdeclare i32 @printf(ptr, ...) #3 1563155e307SPaul Kirth 1573155e307SPaul Kirth; Function Attrs: nounwind readnone willreturn 1583155e307SPaul Kirthdeclare i32 @llvm.expect.i32(i32, i32) #5 1593155e307SPaul Kirth 1603155e307SPaul Kirth 1613155e307SPaul Kirthattributes #0 = { uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" "use-sample-profile" } 1623155e307SPaul Kirthattributes #1 = { nounwind readnone } 1633155e307SPaul Kirthattributes #2 = { nounwind readonly "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" } 1643155e307SPaul Kirthattributes #3 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" } 1653155e307SPaul Kirthattributes #4 = { nounwind readonly } 1663155e307SPaul Kirthattributes #5 = { nounwind readnone willreturn } 1673155e307SPaul Kirth 1683155e307SPaul Kirth!llvm.dbg.cu = !{!0} 1693155e307SPaul Kirth!llvm.module.flags = !{!13, !14} 1703155e307SPaul Kirth!llvm.ident = !{!15} 1713155e307SPaul Kirth 1723155e307SPaul Kirth!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.8.0 (trunk 248211) (llvm/trunk 248217)", isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug, enums: !2, retainedTypes: !3) 1733155e307SPaul Kirth!1 = !DIFile(filename: "test.cc", directory: "/ssd/llvm_commit") 1743155e307SPaul Kirth!2 = !{} 1753155e307SPaul Kirth!3 = !{!4} 1763155e307SPaul Kirth!4 = !DIBasicType(name: "double", size: 64, align: 64, encoding: DW_ATE_float) 1773155e307SPaul Kirth!6 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 4, type: !7, isLocal: false, isDefinition: true, scopeLine: 4, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 1783155e307SPaul Kirth!7 = !DISubroutineType(types: !8) 1793155e307SPaul Kirth!8 = !{!9, !9, !10} 1803155e307SPaul Kirth!9 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) 1813155e307SPaul Kirth!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64, align: 64) 1823155e307SPaul Kirth!11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !12, size: 64, align: 64) 1833155e307SPaul Kirth!12 = !DIBasicType(name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char) 1843155e307SPaul Kirth!13 = !{i32 2, !"Dwarf Version", i32 4} 1853155e307SPaul Kirth!14 = !{i32 2, !"Debug Info Version", i32 3} 1863155e307SPaul Kirth!15 = !{!"clang version 3.8.0 (trunk 248211) (llvm/trunk 248217)"} 1873155e307SPaul Kirth!16 = !DILocalVariable(name: "argc", arg: 1, scope: !6, file: !1, line: 4, type: !9) 1883155e307SPaul Kirth!17 = !DIExpression() 1893155e307SPaul Kirth!18 = !DILocation(line: 4, column: 15, scope: !6) 1903155e307SPaul Kirth!19 = !DILocalVariable(name: "argv", arg: 2, scope: !6, file: !1, line: 4, type: !10) 1913155e307SPaul Kirth!20 = !DILocation(line: 4, column: 27, scope: !6) 1923155e307SPaul Kirth!21 = !DILocation(line: 5, column: 8, scope: !22) 1933155e307SPaul Kirth!22 = distinct !DILexicalBlock(scope: !6, file: !1, line: 5, column: 8) 1943155e307SPaul Kirth!23 = !DILocation(line: 5, column: 13, scope: !22) 1953155e307SPaul Kirth!24 = !DILocation(line: 5, column: 8, scope: !6) 1963155e307SPaul Kirth!25 = !DILocation(line: 6, column: 6, scope: !22) 1973155e307SPaul Kirth!26 = !DILocalVariable(name: "result", scope: !6, file: !1, line: 7, type: !4) 1983155e307SPaul Kirth!27 = !DILocation(line: 7, column: 11, scope: !6) 1993155e307SPaul Kirth!28 = !DILocalVariable(name: "limit", scope: !6, file: !1, line: 8, type: !9) 2003155e307SPaul Kirth!29 = !DILocation(line: 8, column: 8, scope: !6) 2013155e307SPaul Kirth!30 = !DILocation(line: 8, column: 21, scope: !6) 2023155e307SPaul Kirth!31 = !DILocation(line: 8, column: 16, scope: !6) 2033155e307SPaul Kirth!32 = !DILocation(line: 9, column: 8, scope: !33) 2043155e307SPaul Kirth!33 = distinct !DILexicalBlock(scope: !6, file: !1, line: 9, column: 8) 2053155e307SPaul Kirth!34 = !DILocation(line: 9, column: 14, scope: !33) 2063155e307SPaul Kirth!35 = !DILocation(line: 9, column: 8, scope: !6) 2073155e307SPaul Kirth!36 = !DILocalVariable(name: "s", scope: !37, file: !1, line: 10, type: !4) 2083155e307SPaul Kirth!37 = distinct !DILexicalBlock(scope: !33, file: !1, line: 9, column: 21) 2093155e307SPaul Kirth!38 = !DILocation(line: 10, column: 13, scope: !37) 2103155e307SPaul Kirth!39 = !DILocation(line: 10, column: 34, scope: !37) 2113155e307SPaul Kirth!40 = !DILocation(line: 10, column: 29, scope: !37) 2123155e307SPaul Kirth!41 = !DILocation(line: 10, column: 27, scope: !37) 2133155e307SPaul Kirth!42 = !DILocalVariable(name: "u", scope: !43, file: !1, line: 11, type: !9) 2143155e307SPaul Kirth!43 = distinct !DILexicalBlock(scope: !37, file: !1, line: 11, column: 6) 2153155e307SPaul Kirth!44 = !DILocation(line: 11, column: 15, scope: !43) 2163155e307SPaul Kirth!45 = !DILocation(line: 11, column: 11, scope: !43) 2173155e307SPaul Kirth!46 = !DILocation(line: 11, column: 22, scope: !47) 2183155e307SPaul Kirth!47 = distinct !DILexicalBlock(scope: !43, file: !1, line: 11, column: 6) 2193155e307SPaul Kirth!48 = !DILocation(line: 11, column: 26, scope: !47) 2203155e307SPaul Kirth!49 = !DILocation(line: 11, column: 24, scope: !47) 2213155e307SPaul Kirth!50 = !DILocation(line: 11, column: 6, scope: !43) 2223155e307SPaul Kirth!51 = !DILocalVariable(name: "x", scope: !52, file: !1, line: 12, type: !4) 2233155e307SPaul Kirth!52 = distinct !DILexicalBlock(scope: !47, file: !1, line: 11, column: 38) 2243155e307SPaul Kirth!53 = !DILocation(line: 12, column: 15, scope: !52) 2253155e307SPaul Kirth!54 = !DILocation(line: 12, column: 19, scope: !52) 2263155e307SPaul Kirth!55 = !DILocation(line: 13, column: 12, scope: !52) 2273155e307SPaul Kirth!56 = !DILocation(line: 13, column: 14, scope: !52) 2283155e307SPaul Kirth!57 = !DILocation(line: 13, column: 32, scope: !52) 2293155e307SPaul Kirth!58 = !DILocation(line: 13, column: 22, scope: !52) 2303155e307SPaul Kirth!59 = !DILocation(line: 13, column: 10, scope: !52) 2313155e307SPaul Kirth!60 = !DILocation(line: 14, column: 13, scope: !52) 2323155e307SPaul Kirth!61 = !DILocation(line: 14, column: 24, scope: !52) 2333155e307SPaul Kirth!62 = !DILocation(line: 14, column: 22, scope: !52) 2343155e307SPaul Kirth!63 = !DILocation(line: 14, column: 26, scope: !52) 2353155e307SPaul Kirth!64 = !DILocation(line: 14, column: 15, scope: !52) 2363155e307SPaul Kirth!65 = !DILocation(line: 14, column: 10, scope: !52) 2373155e307SPaul Kirth!66 = !DILocation(line: 15, column: 6, scope: !52) 2383155e307SPaul Kirth!67 = !DILocation(line: 11, column: 34, scope: !47) 2393155e307SPaul Kirth!68 = !DILocation(line: 11, column: 6, scope: !47) 2403155e307SPaul Kirth!69 = !DILocation(line: 16, column: 15, scope: !37) 2413155e307SPaul Kirth!70 = !DILocation(line: 16, column: 13, scope: !37) 2423155e307SPaul Kirth!71 = !DILocation(line: 17, column: 4, scope: !37) 2433155e307SPaul Kirth!72 = !DILocation(line: 18, column: 20, scope: !73) 2443155e307SPaul Kirth!73 = distinct !DILexicalBlock(scope: !33, file: !1, line: 17, column: 11) 2453155e307SPaul Kirth!74 = !DILocation(line: 18, column: 15, scope: !73) 2463155e307SPaul Kirth!75 = !DILocation(line: 18, column: 13, scope: !73) 2473155e307SPaul Kirth!76 = !DILocation(line: 20, column: 30, scope: !6) 2483155e307SPaul Kirth!77 = !DILocation(line: 20, column: 4, scope: !6) 2493155e307SPaul Kirth!78 = !DILocation(line: 21, column: 4, scope: !6) 2503155e307SPaul Kirth!79 = !DILocation(line: 22, column: 2, scope: !6) 251