xref: /llvm-project/clang/test/Profile/c-mcdc.c (revision 7ef2bd4e447280015803cff7fc91ec4dd09cd4b3)
1 // RUN: %clang_cc1 -triple %itanium_abi_triple %s -o - -emit-llvm -fprofile-instrument=clang -fcoverage-mapping -fcoverage-mcdc | FileCheck %s -check-prefix=MCDC
2 // RUN: %clang_cc1 -triple %itanium_abi_triple %s -o - -emit-llvm -fprofile-instrument=clang -fcoverage-mapping | FileCheck %s -check-prefix=NOMCDC
3 // RUN: %clang_cc1 -triple %itanium_abi_triple %s -o - -emit-llvm -fprofile-instrument=clang -fcoverage-mapping -fcoverage-mcdc -disable-llvm-passes | FileCheck %s -check-prefix=NOPROFPASS
4 
test(int a,int b,int c,int d,int e,int f)5 int test(int a, int b, int c, int d, int e, int f) {
6   return ((a && b) || ((c && d) || (e && f)));
7 }
8 
9 // NOMCDC-NOT: %mcdc.addr
10 // NOMCDC-NOT: __profbm_test
11 // NOPROFPASS-NOT: __profbm_test
12 
13 // MCDC BOOKKEEPING.
14 // MCDC: @__profbm_test = private global [2 x i8] zeroinitializer
15 // MCDC: @__profc_test = private global [9 x i64] zeroinitializer
16 
17 // ALLOCATE MCDC TEMP AND ZERO IT.
18 // NOPROFPASS-LABEL: @test(
19 // NOPROFPASS: call void @llvm.instrprof.mcdc.parameters(ptr @__profn_test, i64 [[HASH:[0-9]+]], i32 15)
20 // MCDC-LABEL: @test(
21 // MCDC: %mcdc.addr = alloca i32, align 4
22 // MCDC: store i32 0, ptr %mcdc.addr, align 4
23 
24 // SHIFT FIRST CONDITION WITH ID = 0.
25 // MCDC:  %[[LAB1:[0-9]+]] = load i32, ptr %a.addr, align 4
26 // MCDC-DAG:  %[[BOOL:tobool[0-9]*]] = icmp ne i32 %[[LAB1]], 0
27 // MCDC-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
28 // MCDC-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 0
29 // MCDC-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 0
30 // MCDC-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
31 // MCDC-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
32 
33 // SHIFT SECOND CONDITION WITH ID = 2.
34 // NOPROFPASS-LABEL: land.lhs.true:
35 // MCDC:  %[[LAB1:[0-9]+]] = load i32, ptr %b.addr, align 4
36 // MCDC-DAG:  %[[BOOL:tobool[0-9]*]] = icmp ne i32 %[[LAB1]], 0
37 // MCDC-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
38 // MCDC-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 14
39 // MCDC-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 1
40 // MCDC-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
41 // MCDC-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
42 
43 // SHIFT THIRD CONDITION WITH ID = 1.
44 // NOPROFPASS-LABEL: lor.rhs:
45 // MCDC:  %[[LAB1:[0-9]+]] = load i32, ptr %c.addr, align 4
46 // MCDC-DAG:  %[[BOOL:tobool[0-9]*]] = icmp ne i32 %[[LAB1]], 0
47 // MCDC-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
48 // MCDC-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 0
49 // MCDC-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 0
50 // MCDC-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
51 // MCDC-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
52 
53 // SHIFT FOURTH CONDITION WITH ID = 4.
54 // NOPROFPASS-LABEL: land.lhs.true3:
55 // MCDC:  %[[LAB1:[0-9]+]] = load i32, ptr %d.addr, align 4
56 // MCDC-DAG:  %[[BOOL:tobool[0-9]*]] = icmp ne i32 %[[LAB1]], 0
57 // MCDC-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
58 // MCDC-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 12
59 // MCDC-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 2
60 // MCDC-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
61 // MCDC-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
62 
63 // SHIFT FIFTH CONDITION WITH ID = 3.
64 // NOPROFPASS-LABEL: lor.rhs6:
65 // MCDC:  %[[LAB1:[0-9]+]] = load i32, ptr %e.addr, align 4
66 // MCDC-DAG:  %[[BOOL:tobool[0-9]*]] = icmp ne i32 %[[LAB1]], 0
67 // MCDC-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
68 // MCDC-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 0
69 // MCDC-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 0
70 // MCDC-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
71 // MCDC-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
72 
73 // SHIFT SIXTH CONDITION WITH ID = 5.
74 // NOPROFPASS-LABEL: land.rhs:
75 // MCDC:  %[[LAB1:[0-9]+]] = load i32, ptr %f.addr, align 4
76 // MCDC-DAG:  %[[BOOL:tobool[0-9]*]] = icmp ne i32 %[[LAB1]], 0
77 // MCDC-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
78 // MCDC-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 8
79 // MCDC-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 4
80 // MCDC-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
81 // MCDC-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
82 
83 // UPDATE FINAL BITMASK WITH RESULT.
84 // NOPROFPASS-LABEL: lor.end:
85 // NOPROFPASS: call void @llvm.instrprof.mcdc.tvbitmap.update(ptr @__profn_test, i64 [[HASH]], i32 0, ptr %mcdc.addr)
86 // MCDC-DAG:  %[[TEMP0:mcdc.temp[0-9]*]] = load i32, ptr %mcdc.addr, align 4
87 // MCDC:  %[[TEMP:[0-9]+]] = add i32 %[[TEMP0]], 0
88 // MCDC:  %[[LAB1:[0-9]+]] = lshr i32 %[[TEMP]], 3
89 // MCDC:  %[[LAB4:[0-9]+]] = getelementptr inbounds i8, ptr @__profbm_test, i32 %[[LAB1]]
90 // MCDC:  %[[LAB5:[0-9]+]] = and i32 %[[TEMP]], 7
91 // MCDC:  %[[LAB6:[0-9]+]] = trunc i32 %[[LAB5]] to i8
92 // MCDC:  %[[LAB7:[0-9]+]] = shl i8 1, %[[LAB6]]
93 // MCDC:  %[[BITS:.+]] = load i8, ptr %[[LAB4]], align 1
94 // MCDC:  %[[LAB8:[0-9]+]] = or i8 %[[BITS]], %[[LAB7]]
95 // MCDC:  store i8 %[[LAB8]], ptr %[[LAB4]], align 1
96