18b2bdfbcSAlan Phipps // RUN: %clang_cc1 -triple %itanium_abi_triple %s -o - -emit-llvm -fprofile-instrument=clang -fcoverage-mapping -fcoverage-mcdc | FileCheck %s -check-prefix=MCDCCTOR
28b2bdfbcSAlan Phipps // RUN: %clang_cc1 -triple %itanium_abi_triple %s -o - -emit-llvm -fprofile-instrument=clang -fcoverage-mapping -fcoverage-mcdc | FileCheck %s -check-prefix=MCDCDTOR
38b2bdfbcSAlan Phipps
48b2bdfbcSAlan Phipps extern void foo();
58b2bdfbcSAlan Phipps extern void bar();
68b2bdfbcSAlan Phipps class Value {
78b2bdfbcSAlan Phipps public:
88b2bdfbcSAlan Phipps void setValue(int len);
98b2bdfbcSAlan Phipps int getValue(void);
108b2bdfbcSAlan Phipps Value(); // This is the constructor declaration
118b2bdfbcSAlan Phipps ~Value(); // This is the destructor declaration
128b2bdfbcSAlan Phipps
138b2bdfbcSAlan Phipps private:
148b2bdfbcSAlan Phipps int value;
158b2bdfbcSAlan Phipps };
168b2bdfbcSAlan Phipps
178b2bdfbcSAlan Phipps // Member functions definitions including constructor
Value(void)188b2bdfbcSAlan Phipps Value::Value(void) {
198b2bdfbcSAlan Phipps if (value != 2 || value != 6)
208b2bdfbcSAlan Phipps foo();
218b2bdfbcSAlan Phipps }
~Value(void)228b2bdfbcSAlan Phipps Value::~Value(void) {
238b2bdfbcSAlan Phipps if (value != 2 || value != 3)
248b2bdfbcSAlan Phipps bar();
258b2bdfbcSAlan Phipps }
268b2bdfbcSAlan Phipps
278b2bdfbcSAlan Phipps // MCDC BOOKKEEPING.
288b2bdfbcSAlan Phipps // MCDCCTOR: @__profbm__ZN5ValueC2Ev = private global [1 x i8] zeroinitializer
298b2bdfbcSAlan Phipps // MCDCCTOR: @__profc__ZN5ValueC2Ev = private global [4 x i64] zeroinitializer
308b2bdfbcSAlan Phipps
318b2bdfbcSAlan Phipps // ALLOCATE MCDC TEMP AND ZERO IT.
328b2bdfbcSAlan Phipps // MCDCCTOR-LABEL: @_ZN5ValueC2Ev(
338b2bdfbcSAlan Phipps // MCDCCTOR: %mcdc.addr = alloca i32, align 4
348b2bdfbcSAlan Phipps // MCDCCTOR: store i32 0, ptr %mcdc.addr, align 4
358b2bdfbcSAlan Phipps
368b2bdfbcSAlan Phipps // SHIFT FIRST CONDITION WITH ID = 0.
378b2bdfbcSAlan Phipps // MCDCCTOR: %[[LAB1:[0-9]+]] = load i32, ptr %value, align 4
388b2bdfbcSAlan Phipps // MCDCCTOR-DAG: %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 2
3971f8b441SNAKAMURA Takumi // MCDCCTOR-DAG: %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
4071f8b441SNAKAMURA Takumi // MCDCCTOR-DAG: %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 0
4171f8b441SNAKAMURA Takumi // MCDCCTOR-DAG: %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 0
4271f8b441SNAKAMURA Takumi // MCDCCTOR-DAG: %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
438b2bdfbcSAlan Phipps // MCDCCTOR-DAG: store i32 %[[LAB4]], ptr %mcdc.addr, align 4
448b2bdfbcSAlan Phipps
458b2bdfbcSAlan Phipps // SHIFT SECOND CONDITION WITH ID = 1.
468b2bdfbcSAlan Phipps // MCDCCTOR: %[[LAB1:[0-9]+]] = load i32, ptr %value2, align 4
478b2bdfbcSAlan Phipps // MCDCCTOR-DAG: %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 6
4871f8b441SNAKAMURA Takumi // MCDCCTOR-DAG: %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
4971f8b441SNAKAMURA Takumi // MCDCCTOR-DAG: %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 2
5071f8b441SNAKAMURA Takumi // MCDCCTOR-DAG: %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 1
5171f8b441SNAKAMURA Takumi // MCDCCTOR-DAG: %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
528b2bdfbcSAlan Phipps // MCDCCTOR-DAG: store i32 %[[LAB4]], ptr %mcdc.addr, align 4
538b2bdfbcSAlan Phipps
548b2bdfbcSAlan Phipps // UPDATE FINAL BITMASK WITH RESULT.
5571f8b441SNAKAMURA Takumi // MCDCCTOR-DAG: %[[TEMP0:mcdc.temp[0-9]*]] = load i32, ptr %mcdc.addr, align 4
5671f8b441SNAKAMURA Takumi // MCDCCTOR: %[[TEMP:[0-9]+]] = add i32 %[[TEMP0]], 0
578b2bdfbcSAlan Phipps // MCDCCTOR: %[[LAB1:[0-9]+]] = lshr i32 %[[TEMP]], 3
58cc53707aSNAKAMURA Takumi // MCDCCTOR: %[[LAB4:[0-9]+]] = getelementptr inbounds i8, ptr @__profbm__ZN5ValueC2Ev, i32 %[[LAB1]]
598b2bdfbcSAlan Phipps // MCDCCTOR: %[[LAB5:[0-9]+]] = and i32 %[[TEMP]], 7
608b2bdfbcSAlan Phipps // MCDCCTOR: %[[LAB6:[0-9]+]] = trunc i32 %[[LAB5]] to i8
618b2bdfbcSAlan Phipps // MCDCCTOR: %[[LAB7:[0-9]+]] = shl i8 1, %[[LAB6]]
62*7ef2bd4eSNAKAMURA Takumi // MCDCCTOR: %[[BITS:.+]] = load i8, ptr %[[LAB4]], align 1
63*7ef2bd4eSNAKAMURA Takumi // MCDCCTOR: %[[LAB8:[0-9]+]] = or i8 %[[BITS]], %[[LAB7]]
648b2bdfbcSAlan Phipps // MCDCCTOR: store i8 %[[LAB8]], ptr %[[LAB4]], align 1
658b2bdfbcSAlan Phipps
668b2bdfbcSAlan Phipps // MCDCDTOR: @__profbm__ZN5ValueD2Ev = private global [1 x i8] zeroinitializer
678b2bdfbcSAlan Phipps // MCDCDTOR: @__profc__ZN5ValueD2Ev = private global [4 x i64] zeroinitializer
688b2bdfbcSAlan Phipps
698b2bdfbcSAlan Phipps // ALLOCATE MCDC TEMP AND ZERO IT.
708b2bdfbcSAlan Phipps // MCDCDTOR-LABEL: @_ZN5ValueD2Ev(
718b2bdfbcSAlan Phipps // MCDCDTOR: %mcdc.addr = alloca i32, align 4
728b2bdfbcSAlan Phipps // MCDCDTOR: store i32 0, ptr %mcdc.addr, align 4
738b2bdfbcSAlan Phipps
748b2bdfbcSAlan Phipps // SHIFT FIRST CONDITION WITH ID = 0.
758b2bdfbcSAlan Phipps // MCDCDTOR: %[[LAB1:[0-9]+]] = load i32, ptr %value, align 4
768b2bdfbcSAlan Phipps // MCDCDTOR-DAG: %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 2
7771f8b441SNAKAMURA Takumi // MCDCDTOR-DAG: %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
7871f8b441SNAKAMURA Takumi // MCDCDTOR-DAG: %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 0
7971f8b441SNAKAMURA Takumi // MCDCDTOR-DAG: %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 0
8071f8b441SNAKAMURA Takumi // MCDCDTOR-DAG: %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
818b2bdfbcSAlan Phipps // MCDCDTOR-DAG: store i32 %[[LAB4]], ptr %mcdc.addr, align 4
828b2bdfbcSAlan Phipps
838b2bdfbcSAlan Phipps // SHIFT SECOND CONDITION WITH ID = 1.
848b2bdfbcSAlan Phipps // MCDCDTOR: %[[LAB1:[0-9]+]] = load i32, ptr %value2, align 4
858b2bdfbcSAlan Phipps // MCDCDTOR-DAG: %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 3
8671f8b441SNAKAMURA Takumi // MCDCDTOR-DAG: %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
8771f8b441SNAKAMURA Takumi // MCDCDTOR-DAG: %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 2
8871f8b441SNAKAMURA Takumi // MCDCDTOR-DAG: %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 1
8971f8b441SNAKAMURA Takumi // MCDCDTOR-DAG: %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
908b2bdfbcSAlan Phipps // MCDCDTOR-DAG: store i32 %[[LAB4]], ptr %mcdc.addr, align 4
918b2bdfbcSAlan Phipps
928b2bdfbcSAlan Phipps // UPDATE FINAL BITMASK WITH RESULT.
9371f8b441SNAKAMURA Takumi // MCDCDTOR-DAG: %[[TEMP0:mcdc.temp[0-9]*]] = load i32, ptr %mcdc.addr, align 4
9471f8b441SNAKAMURA Takumi // MCDCDTOR: %[[TEMP:[0-9]+]] = add i32 %[[TEMP0]], 0
958b2bdfbcSAlan Phipps // MCDCDTOR: %[[LAB1:[0-9]+]] = lshr i32 %[[TEMP]], 3
96cc53707aSNAKAMURA Takumi // MCDCDTOR: %[[LAB4:[0-9]+]] = getelementptr inbounds i8, ptr @__profbm__ZN5ValueD2Ev, i32 %[[LAB1]]
978b2bdfbcSAlan Phipps // MCDCDTOR: %[[LAB5:[0-9]+]] = and i32 %[[TEMP]], 7
988b2bdfbcSAlan Phipps // MCDCDTOR: %[[LAB6:[0-9]+]] = trunc i32 %[[LAB5]] to i8
998b2bdfbcSAlan Phipps // MCDCDTOR: %[[LAB7:[0-9]+]] = shl i8 1, %[[LAB6]]
100*7ef2bd4eSNAKAMURA Takumi // MCDCDTOR: %[[BITS:.+]] = load i8, ptr %[[LAB4]], align 1
101*7ef2bd4eSNAKAMURA Takumi // MCDCDTOR: %[[LAB8:[0-9]+]] = or i8 %[[BITS]], %[[LAB7]]
1028b2bdfbcSAlan Phipps // MCDCDTOR: store i8 %[[LAB8]], ptr %[[LAB4]], align 1
103