GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 96.6% 1188 / 68 / 1298
Functions: 94.3% 132 / 0 / 140
Branches: 51.2% 2651 / 136 / 5312

src/irgenerator/OpRuleConversionManager.cpp
Line Branch Exec Source
1 // Copyright (c) 2021-2026 ChilliBits. All rights reserved.
2
3 #include "OpRuleConversionManager.h"
4
5 #include <SourceFile.h>
6 #include <ast/ASTNodes.h>
7 #include <driver/Driver.h>
8 #include <global/GlobalResourceManager.h>
9 #include <irgenerator/IRGenerator.h>
10 #include <symboltablebuilder/Scope.h>
11
12 #include <llvm/IR/Module.h>
13
14 namespace spice::compiler {
15
16 2182 OpRuleConversionManager::OpRuleConversionManager(SourceFile *sourceFile, IRGenerator *irGenerator)
17 2182 : builder(sourceFile->builder), irGenerator(irGenerator), stdFunctionManager(irGenerator->stdFunctionManager) {}
18
19 1161 LLVMExprResult OpRuleConversionManager::getPlusEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
20 LLVMExprResult &rhs, QualType rhsSTy) {
21
1/2
✓ Branch 2 → 3 taken 1161 times.
✗ Branch 2 → 156 not taken.
1906 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
22
1/2
✓ Branch 3 → 4 taken 1161 times.
✗ Branch 3 → 157 not taken.
1916 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
23 1577 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
24 1567 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
25
1/2
✓ Branch 6 → 7 taken 1161 times.
✗ Branch 6 → 158 not taken.
1161 lhsSTy = lhsSTy.removeReferenceWrapper();
26
1/2
✓ Branch 7 → 8 taken 1161 times.
✗ Branch 7 → 159 not taken.
1161 rhsSTy = rhsSTy.removeReferenceWrapper();
27
1/2
✓ Branch 8 → 9 taken 1161 times.
✗ Branch 8 → 196 not taken.
1161 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
28
29 // Handle operator overloads
30
3/4
✓ Branch 9 → 10 taken 1161 times.
✗ Branch 9 → 196 not taken.
✓ Branch 10 → 11 taken 416 times.
✓ Branch 10 → 19 taken 745 times.
1161 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
31 416 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
32
33
11/13
✓ Branch 19 → 20 taken 745 times.
✗ Branch 19 → 196 not taken.
✓ Branch 20 → 21 taken 84 times.
✓ Branch 20 → 26 taken 65 times.
✓ Branch 20 → 37 taken 9 times.
✓ Branch 20 → 51 taken 1 time.
✓ Branch 20 → 65 taken 1 time.
✓ Branch 20 → 76 taken 1 time.
✓ Branch 20 → 90 taken 7 times.
✓ Branch 20 → 104 taken 405 times.
✓ Branch 20 → 115 taken 6 times.
✓ Branch 20 → 129 taken 166 times.
✗ Branch 20 → 142 not taken.
745 switch (getTypeCombination(lhsSTy, rhsSTy)) {
34 84 case COMB(TY_DOUBLE, TY_DOUBLE):
35
4/8
✓ Branch 21 → 22 taken 84 times.
✗ Branch 21 → 168 not taken.
✓ Branch 22 → 23 taken 84 times.
✗ Branch 22 → 168 not taken.
✓ Branch 23 → 24 taken 84 times.
✗ Branch 23 → 168 not taken.
✓ Branch 24 → 25 taken 84 times.
✗ Branch 24 → 168 not taken.
84 return {.value = builder.CreateFAdd(lhsV(), rhsV())};
36 65 case COMB(TY_INT, TY_INT):
37
8/16
✓ Branch 26 → 27 taken 65 times.
✗ Branch 26 → 196 not taken.
✓ Branch 27 → 28 taken 65 times.
✗ Branch 27 → 31 not taken.
✓ Branch 28 → 29 taken 65 times.
✗ Branch 28 → 196 not taken.
✓ Branch 29 → 30 taken 65 times.
✗ Branch 29 → 31 not taken.
✓ Branch 32 → 33 taken 65 times.
✗ Branch 32 → 169 not taken.
✓ Branch 33 → 34 taken 65 times.
✗ Branch 33 → 169 not taken.
✓ Branch 34 → 35 taken 65 times.
✗ Branch 34 → 169 not taken.
✓ Branch 35 → 36 taken 65 times.
✗ Branch 35 → 169 not taken.
65 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
38 9 case COMB(TY_INT, TY_SHORT): // fallthrough
39 case COMB(TY_INT, TY_LONG): {
40
5/10
✓ Branch 37 → 38 taken 9 times.
✗ Branch 37 → 170 not taken.
✓ Branch 38 → 39 taken 9 times.
✗ Branch 38 → 170 not taken.
✓ Branch 39 → 40 taken 9 times.
✗ Branch 39 → 170 not taken.
✓ Branch 40 → 41 taken 9 times.
✗ Branch 40 → 170 not taken.
✓ Branch 41 → 42 taken 9 times.
✗ Branch 41 → 196 not taken.
9 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
41
7/14
✓ Branch 41 → 42 taken 9 times.
✗ Branch 41 → 196 not taken.
✓ Branch 42 → 43 taken 9 times.
✗ Branch 42 → 46 not taken.
✓ Branch 43 → 44 taken 9 times.
✗ Branch 43 → 196 not taken.
✓ Branch 44 → 45 taken 9 times.
✗ Branch 44 → 46 not taken.
✓ Branch 47 → 48 taken 9 times.
✗ Branch 47 → 171 not taken.
✓ Branch 48 → 49 taken 9 times.
✗ Branch 48 → 171 not taken.
✓ Branch 49 → 50 taken 9 times.
✗ Branch 49 → 171 not taken.
9 return {.value = builder.CreateAdd(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
42 }
43 1 case COMB(TY_SHORT, TY_INT): {
44
5/10
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 172 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 172 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 172 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 172 not taken.
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 196 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
45
7/14
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 196 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 60 not taken.
✓ Branch 57 → 58 taken 1 time.
✗ Branch 57 → 196 not taken.
✓ Branch 58 → 59 taken 1 time.
✗ Branch 58 → 60 not taken.
✓ Branch 61 → 62 taken 1 time.
✗ Branch 61 → 173 not taken.
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 173 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 173 not taken.
1 return {.value = builder.CreateAdd(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
46 }
47 1 case COMB(TY_SHORT, TY_SHORT):
48
8/16
✓ Branch 65 → 66 taken 1 time.
✗ Branch 65 → 196 not taken.
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 70 not taken.
✓ Branch 67 → 68 taken 1 time.
✗ Branch 67 → 196 not taken.
✓ Branch 68 → 69 taken 1 time.
✗ Branch 68 → 70 not taken.
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 174 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 174 not taken.
✓ Branch 73 → 74 taken 1 time.
✗ Branch 73 → 174 not taken.
✓ Branch 74 → 75 taken 1 time.
✗ Branch 74 → 174 not taken.
1 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
49 1 case COMB(TY_SHORT, TY_LONG): {
50
5/10
✓ Branch 76 → 77 taken 1 time.
✗ Branch 76 → 175 not taken.
✓ Branch 77 → 78 taken 1 time.
✗ Branch 77 → 175 not taken.
✓ Branch 78 → 79 taken 1 time.
✗ Branch 78 → 175 not taken.
✓ Branch 79 → 80 taken 1 time.
✗ Branch 79 → 175 not taken.
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 196 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
51
7/14
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 196 not taken.
✓ Branch 81 → 82 taken 1 time.
✗ Branch 81 → 85 not taken.
✓ Branch 82 → 83 taken 1 time.
✗ Branch 82 → 196 not taken.
✓ Branch 83 → 84 taken 1 time.
✗ Branch 83 → 85 not taken.
✓ Branch 86 → 87 taken 1 time.
✗ Branch 86 → 176 not taken.
✓ Branch 87 → 88 taken 1 time.
✗ Branch 87 → 176 not taken.
✓ Branch 88 → 89 taken 1 time.
✗ Branch 88 → 176 not taken.
1 return {.value = builder.CreateAdd(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
52 }
53 7 case COMB(TY_LONG, TY_INT): // fallthrough
54 case COMB(TY_LONG, TY_SHORT): {
55
5/10
✓ Branch 90 → 91 taken 7 times.
✗ Branch 90 → 177 not taken.
✓ Branch 91 → 92 taken 7 times.
✗ Branch 91 → 177 not taken.
✓ Branch 92 → 93 taken 7 times.
✗ Branch 92 → 177 not taken.
✓ Branch 93 → 94 taken 7 times.
✗ Branch 93 → 177 not taken.
✓ Branch 94 → 95 taken 7 times.
✗ Branch 94 → 196 not taken.
7 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
56
9/14
✓ Branch 94 → 95 taken 7 times.
✗ Branch 94 → 196 not taken.
✓ Branch 95 → 96 taken 3 times.
✓ Branch 95 → 99 taken 4 times.
✓ Branch 96 → 97 taken 3 times.
✗ Branch 96 → 196 not taken.
✓ Branch 97 → 98 taken 2 times.
✓ Branch 97 → 99 taken 1 time.
✓ Branch 100 → 101 taken 7 times.
✗ Branch 100 → 178 not taken.
✓ Branch 101 → 102 taken 7 times.
✗ Branch 101 → 178 not taken.
✓ Branch 102 → 103 taken 7 times.
✗ Branch 102 → 178 not taken.
7 return {.value = builder.CreateAdd(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
57 }
58 405 case COMB(TY_LONG, TY_LONG):
59
9/16
✓ Branch 104 → 105 taken 405 times.
✗ Branch 104 → 196 not taken.
✓ Branch 105 → 106 taken 18 times.
✓ Branch 105 → 109 taken 387 times.
✓ Branch 106 → 107 taken 18 times.
✗ Branch 106 → 196 not taken.
✓ Branch 107 → 108 taken 18 times.
✗ Branch 107 → 109 not taken.
✓ Branch 110 → 111 taken 405 times.
✗ Branch 110 → 179 not taken.
✓ Branch 111 → 112 taken 405 times.
✗ Branch 111 → 179 not taken.
✓ Branch 112 → 113 taken 405 times.
✗ Branch 112 → 179 not taken.
✓ Branch 113 → 114 taken 405 times.
✗ Branch 113 → 179 not taken.
405 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
60 6 case COMB(TY_CHAR, TY_INT): {
61
5/10
✓ Branch 115 → 116 taken 6 times.
✗ Branch 115 → 180 not taken.
✓ Branch 116 → 117 taken 6 times.
✗ Branch 116 → 180 not taken.
✓ Branch 117 → 118 taken 6 times.
✗ Branch 117 → 180 not taken.
✓ Branch 118 → 119 taken 6 times.
✗ Branch 118 → 180 not taken.
✓ Branch 119 → 120 taken 6 times.
✗ Branch 119 → 196 not taken.
6 llvm::Value *rhsChar = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
62
5/14
✓ Branch 119 → 120 taken 6 times.
✗ Branch 119 → 196 not taken.
✗ Branch 120 → 121 not taken.
✓ Branch 120 → 124 taken 6 times.
✗ Branch 121 → 122 not taken.
✗ Branch 121 → 196 not taken.
✗ Branch 122 → 123 not taken.
✗ Branch 122 → 124 not taken.
✓ Branch 125 → 126 taken 6 times.
✗ Branch 125 → 181 not taken.
✓ Branch 126 → 127 taken 6 times.
✗ Branch 126 → 181 not taken.
✓ Branch 127 → 128 taken 6 times.
✗ Branch 127 → 181 not taken.
6 return {.value = builder.CreateAdd(lhsV(), rhsChar, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
63 }
64 166 case COMB(TY_PTR, TY_INT): // fallthrough
65 case COMB(TY_PTR, TY_SHORT): // fallthrough
66 case COMB(TY_PTR, TY_LONG): {
67
2/4
✓ Branch 129 → 130 taken 166 times.
✗ Branch 129 → 182 not taken.
✓ Branch 130 → 131 taken 166 times.
✗ Branch 130 → 182 not taken.
166 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
68
5/10
✓ Branch 131 → 132 taken 166 times.
✗ Branch 131 → 183 not taken.
✓ Branch 132 → 133 taken 166 times.
✗ Branch 132 → 183 not taken.
✓ Branch 133 → 134 taken 166 times.
✗ Branch 133 → 183 not taken.
✓ Branch 134 → 135 taken 166 times.
✗ Branch 134 → 183 not taken.
✓ Branch 135 → 136 taken 166 times.
✗ Branch 135 → 183 not taken.
166 llvm::Value *rhsVExt = builder.CreateIntCast(rhsV(), builder.getInt64Ty(), rhsSTy.isSigned());
69
2/4
✓ Branch 139 → 140 taken 166 times.
✗ Branch 139 → 184 not taken.
✓ Branch 140 → 141 taken 166 times.
✗ Branch 140 → 184 not taken.
332 return {.value = builder.CreateGEP(elementTy, lhsV(), rhsVExt)};
70 }
71 default: // GCOV_EXCL_LINE
72 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: +="); // GCOV_EXCL_LINE
73 }
74
5/14
✓ Branch 11 → 12 taken 416 times.
✗ Branch 11 → 162 not taken.
✓ Branch 12 → 13 taken 416 times.
✗ Branch 12 → 162 not taken.
✓ Branch 13 → 14 taken 416 times.
✗ Branch 13 → 162 not taken.
✓ Branch 14 → 15 taken 416 times.
✗ Branch 14 → 162 not taken.
✓ Branch 15 → 16 taken 416 times.
✗ Branch 15 → 160 not taken.
✗ Branch 162 → 163 not taken.
✗ Branch 162 → 166 not taken.
✗ Branch 164 → 165 not taken.
✗ Branch 164 → 166 not taken.
1577 }
75
76 80 LLVMExprResult OpRuleConversionManager::getMinusEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
77 LLVMExprResult &rhs, QualType rhsSTy) {
78
1/2
✓ Branch 2 → 3 taken 80 times.
✗ Branch 2 → 158 not taken.
153 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
79
1/2
✓ Branch 3 → 4 taken 80 times.
✗ Branch 3 → 159 not taken.
160 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
80 87 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
81 80 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
82
1/2
✓ Branch 6 → 7 taken 80 times.
✗ Branch 6 → 160 not taken.
80 lhsSTy = lhsSTy.removeReferenceWrapper();
83
1/2
✓ Branch 7 → 8 taken 80 times.
✗ Branch 7 → 161 not taken.
80 rhsSTy = rhsSTy.removeReferenceWrapper();
84
1/2
✓ Branch 8 → 9 taken 80 times.
✗ Branch 8 → 199 not taken.
80 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
85
86 // Handle operator overloads
87
3/4
✓ Branch 9 → 10 taken 80 times.
✗ Branch 9 → 199 not taken.
✓ Branch 10 → 11 taken 7 times.
✓ Branch 10 → 19 taken 73 times.
80 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
88 7 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
89
90
11/13
✓ Branch 19 → 20 taken 73 times.
✗ Branch 19 → 199 not taken.
✓ Branch 20 → 21 taken 6 times.
✓ Branch 20 → 26 taken 19 times.
✓ Branch 20 → 37 taken 4 times.
✓ Branch 20 → 51 taken 1 time.
✓ Branch 20 → 65 taken 3 times.
✓ Branch 20 → 76 taken 1 time.
✓ Branch 20 → 90 taken 19 times.
✓ Branch 20 → 104 taken 9 times.
✓ Branch 20 → 115 taken 6 times.
✓ Branch 20 → 129 taken 5 times.
✗ Branch 20 → 144 not taken.
73 switch (getTypeCombination(lhsSTy, rhsSTy)) {
91 6 case COMB(TY_DOUBLE, TY_DOUBLE):
92
4/8
✓ Branch 21 → 22 taken 6 times.
✗ Branch 21 → 170 not taken.
✓ Branch 22 → 23 taken 6 times.
✗ Branch 22 → 170 not taken.
✓ Branch 23 → 24 taken 6 times.
✗ Branch 23 → 170 not taken.
✓ Branch 24 → 25 taken 6 times.
✗ Branch 24 → 170 not taken.
6 return {.value = builder.CreateFSub(lhsV(), rhsV())};
93 19 case COMB(TY_INT, TY_INT):
94
8/16
✓ Branch 26 → 27 taken 19 times.
✗ Branch 26 → 199 not taken.
✓ Branch 27 → 28 taken 19 times.
✗ Branch 27 → 31 not taken.
✓ Branch 28 → 29 taken 19 times.
✗ Branch 28 → 199 not taken.
✓ Branch 29 → 30 taken 19 times.
✗ Branch 29 → 31 not taken.
✓ Branch 32 → 33 taken 19 times.
✗ Branch 32 → 171 not taken.
✓ Branch 33 → 34 taken 19 times.
✗ Branch 33 → 171 not taken.
✓ Branch 34 → 35 taken 19 times.
✗ Branch 34 → 171 not taken.
✓ Branch 35 → 36 taken 19 times.
✗ Branch 35 → 171 not taken.
19 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
95 4 case COMB(TY_INT, TY_SHORT): // fallthrough
96 case COMB(TY_INT, TY_LONG): {
97
5/10
✓ Branch 37 → 38 taken 4 times.
✗ Branch 37 → 172 not taken.
✓ Branch 38 → 39 taken 4 times.
✗ Branch 38 → 172 not taken.
✓ Branch 39 → 40 taken 4 times.
✗ Branch 39 → 172 not taken.
✓ Branch 40 → 41 taken 4 times.
✗ Branch 40 → 172 not taken.
✓ Branch 41 → 42 taken 4 times.
✗ Branch 41 → 199 not taken.
4 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
98
7/14
✓ Branch 41 → 42 taken 4 times.
✗ Branch 41 → 199 not taken.
✓ Branch 42 → 43 taken 4 times.
✗ Branch 42 → 46 not taken.
✓ Branch 43 → 44 taken 4 times.
✗ Branch 43 → 199 not taken.
✓ Branch 44 → 45 taken 4 times.
✗ Branch 44 → 46 not taken.
✓ Branch 47 → 48 taken 4 times.
✗ Branch 47 → 173 not taken.
✓ Branch 48 → 49 taken 4 times.
✗ Branch 48 → 173 not taken.
✓ Branch 49 → 50 taken 4 times.
✗ Branch 49 → 173 not taken.
4 return {.value = builder.CreateSub(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
99 }
100 1 case COMB(TY_SHORT, TY_INT): {
101
5/10
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 174 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 174 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 174 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 174 not taken.
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 199 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
102
7/14
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 199 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 60 not taken.
✓ Branch 57 → 58 taken 1 time.
✗ Branch 57 → 199 not taken.
✓ Branch 58 → 59 taken 1 time.
✗ Branch 58 → 60 not taken.
✓ Branch 61 → 62 taken 1 time.
✗ Branch 61 → 175 not taken.
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 175 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 175 not taken.
1 return {.value = builder.CreateSub(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
103 }
104 3 case COMB(TY_SHORT, TY_SHORT):
105
8/16
✓ Branch 65 → 66 taken 3 times.
✗ Branch 65 → 199 not taken.
✓ Branch 66 → 67 taken 3 times.
✗ Branch 66 → 70 not taken.
✓ Branch 67 → 68 taken 3 times.
✗ Branch 67 → 199 not taken.
✓ Branch 68 → 69 taken 3 times.
✗ Branch 68 → 70 not taken.
✓ Branch 71 → 72 taken 3 times.
✗ Branch 71 → 176 not taken.
✓ Branch 72 → 73 taken 3 times.
✗ Branch 72 → 176 not taken.
✓ Branch 73 → 74 taken 3 times.
✗ Branch 73 → 176 not taken.
✓ Branch 74 → 75 taken 3 times.
✗ Branch 74 → 176 not taken.
3 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
106 1 case COMB(TY_SHORT, TY_LONG): {
107
5/10
✓ Branch 76 → 77 taken 1 time.
✗ Branch 76 → 177 not taken.
✓ Branch 77 → 78 taken 1 time.
✗ Branch 77 → 177 not taken.
✓ Branch 78 → 79 taken 1 time.
✗ Branch 78 → 177 not taken.
✓ Branch 79 → 80 taken 1 time.
✗ Branch 79 → 177 not taken.
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 199 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
108
7/14
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 199 not taken.
✓ Branch 81 → 82 taken 1 time.
✗ Branch 81 → 85 not taken.
✓ Branch 82 → 83 taken 1 time.
✗ Branch 82 → 199 not taken.
✓ Branch 83 → 84 taken 1 time.
✗ Branch 83 → 85 not taken.
✓ Branch 86 → 87 taken 1 time.
✗ Branch 86 → 178 not taken.
✓ Branch 87 → 88 taken 1 time.
✗ Branch 87 → 178 not taken.
✓ Branch 88 → 89 taken 1 time.
✗ Branch 88 → 178 not taken.
1 return {.value = builder.CreateSub(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
109 }
110 19 case COMB(TY_LONG, TY_INT): // fallthrough
111 case COMB(TY_LONG, TY_SHORT): {
112
5/10
✓ Branch 90 → 91 taken 19 times.
✗ Branch 90 → 179 not taken.
✓ Branch 91 → 92 taken 19 times.
✗ Branch 91 → 179 not taken.
✓ Branch 92 → 93 taken 19 times.
✗ Branch 92 → 179 not taken.
✓ Branch 93 → 94 taken 19 times.
✗ Branch 93 → 179 not taken.
✓ Branch 94 → 95 taken 19 times.
✗ Branch 94 → 199 not taken.
19 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
113
8/14
✓ Branch 94 → 95 taken 19 times.
✗ Branch 94 → 199 not taken.
✓ Branch 95 → 96 taken 15 times.
✓ Branch 95 → 99 taken 4 times.
✓ Branch 96 → 97 taken 15 times.
✗ Branch 96 → 199 not taken.
✓ Branch 97 → 98 taken 15 times.
✗ Branch 97 → 99 not taken.
✓ Branch 100 → 101 taken 19 times.
✗ Branch 100 → 180 not taken.
✓ Branch 101 → 102 taken 19 times.
✗ Branch 101 → 180 not taken.
✓ Branch 102 → 103 taken 19 times.
✗ Branch 102 → 180 not taken.
19 return {.value = builder.CreateSub(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
114 }
115 9 case COMB(TY_LONG, TY_LONG):
116
8/16
✓ Branch 104 → 105 taken 9 times.
✗ Branch 104 → 199 not taken.
✓ Branch 105 → 106 taken 9 times.
✗ Branch 105 → 109 not taken.
✓ Branch 106 → 107 taken 9 times.
✗ Branch 106 → 199 not taken.
✓ Branch 107 → 108 taken 9 times.
✗ Branch 107 → 109 not taken.
✓ Branch 110 → 111 taken 9 times.
✗ Branch 110 → 181 not taken.
✓ Branch 111 → 112 taken 9 times.
✗ Branch 111 → 181 not taken.
✓ Branch 112 → 113 taken 9 times.
✗ Branch 112 → 181 not taken.
✓ Branch 113 → 114 taken 9 times.
✗ Branch 113 → 181 not taken.
9 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
117 6 case COMB(TY_CHAR, TY_INT): {
118
5/10
✓ Branch 115 → 116 taken 6 times.
✗ Branch 115 → 182 not taken.
✓ Branch 116 → 117 taken 6 times.
✗ Branch 116 → 182 not taken.
✓ Branch 117 → 118 taken 6 times.
✗ Branch 117 → 182 not taken.
✓ Branch 118 → 119 taken 6 times.
✗ Branch 118 → 182 not taken.
✓ Branch 119 → 120 taken 6 times.
✗ Branch 119 → 199 not taken.
6 llvm::Value *rhsChar = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
119
5/14
✓ Branch 119 → 120 taken 6 times.
✗ Branch 119 → 199 not taken.
✗ Branch 120 → 121 not taken.
✓ Branch 120 → 124 taken 6 times.
✗ Branch 121 → 122 not taken.
✗ Branch 121 → 199 not taken.
✗ Branch 122 → 123 not taken.
✗ Branch 122 → 124 not taken.
✓ Branch 125 → 126 taken 6 times.
✗ Branch 125 → 183 not taken.
✓ Branch 126 → 127 taken 6 times.
✗ Branch 126 → 183 not taken.
✓ Branch 127 → 128 taken 6 times.
✗ Branch 127 → 183 not taken.
6 return {.value = builder.CreateSub(lhsV(), rhsChar, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
120 }
121 5 case COMB(TY_PTR, TY_INT): // fallthrough
122 case COMB(TY_PTR, TY_SHORT): // fallthrough
123 case COMB(TY_PTR, TY_LONG): {
124
2/4
✓ Branch 129 → 130 taken 5 times.
✗ Branch 129 → 184 not taken.
✓ Branch 130 → 131 taken 5 times.
✗ Branch 130 → 184 not taken.
5 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
125
6/12
✓ Branch 131 → 132 taken 5 times.
✗ Branch 131 → 185 not taken.
✓ Branch 132 → 133 taken 5 times.
✗ Branch 132 → 185 not taken.
✓ Branch 133 → 134 taken 5 times.
✗ Branch 133 → 185 not taken.
✓ Branch 134 → 135 taken 5 times.
✗ Branch 134 → 185 not taken.
✓ Branch 135 → 136 taken 5 times.
✗ Branch 135 → 185 not taken.
✓ Branch 136 → 137 taken 5 times.
✗ Branch 136 → 186 not taken.
5 llvm::Value *rhsVExt = builder.CreateIntCast(rhsV(), builder.getInt64Ty(), rhsSTy.isSigned());
126
2/4
✓ Branch 136 → 137 taken 5 times.
✗ Branch 136 → 186 not taken.
✓ Branch 137 → 138 taken 5 times.
✗ Branch 137 → 186 not taken.
5 llvm::Value *rhsVNeg = builder.CreateNeg(rhsVExt);
127
2/4
✓ Branch 141 → 142 taken 5 times.
✗ Branch 141 → 187 not taken.
✓ Branch 142 → 143 taken 5 times.
✗ Branch 142 → 187 not taken.
10 return {.value = builder.CreateGEP(elementTy, lhsV(), rhsVNeg)};
128 }
129 default: // GCOV_EXCL_LINE
130 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: -="); // GCOV_EXCL_LINE
131 }
132
5/14
✓ Branch 11 → 12 taken 7 times.
✗ Branch 11 → 164 not taken.
✓ Branch 12 → 13 taken 7 times.
✗ Branch 12 → 164 not taken.
✓ Branch 13 → 14 taken 7 times.
✗ Branch 13 → 164 not taken.
✓ Branch 14 → 15 taken 7 times.
✗ Branch 14 → 164 not taken.
✓ Branch 15 → 16 taken 7 times.
✗ Branch 15 → 162 not taken.
✗ Branch 164 → 165 not taken.
✗ Branch 164 → 168 not taken.
✗ Branch 166 → 167 not taken.
✗ Branch 166 → 168 not taken.
87 }
133
134 169 LLVMExprResult OpRuleConversionManager::getMulEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
135 LLVMExprResult &rhs, QualType rhsSTy) {
136
1/2
✓ Branch 2 → 3 taken 169 times.
✗ Branch 2 → 129 not taken.
336 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
137
1/2
✓ Branch 3 → 4 taken 169 times.
✗ Branch 3 → 130 not taken.
338 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
138 171 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
139 169 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
140
1/2
✓ Branch 6 → 7 taken 169 times.
✗ Branch 6 → 131 not taken.
169 lhsSTy = lhsSTy.removeReferenceWrapper();
141
1/2
✓ Branch 7 → 8 taken 169 times.
✗ Branch 7 → 132 not taken.
169 rhsSTy = rhsSTy.removeReferenceWrapper();
142
1/2
✓ Branch 8 → 9 taken 169 times.
✗ Branch 8 → 162 not taken.
169 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
143
144 // Handle operator overloads
145
3/4
✓ Branch 9 → 10 taken 169 times.
✗ Branch 9 → 162 not taken.
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 19 taken 167 times.
169 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
146 2 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
147
148
9/11
✓ Branch 19 → 20 taken 167 times.
✗ Branch 19 → 162 not taken.
✓ Branch 20 → 21 taken 85 times.
✓ Branch 20 → 26 taken 2 times.
✓ Branch 20 → 37 taken 4 times.
✓ Branch 20 → 51 taken 1 time.
✓ Branch 20 → 65 taken 1 time.
✓ Branch 20 → 76 taken 1 time.
✓ Branch 20 → 90 taken 2 times.
✓ Branch 20 → 104 taken 71 times.
✗ Branch 20 → 115 not taken.
167 switch (getTypeCombination(lhsSTy, rhsSTy)) {
149 85 case COMB(TY_DOUBLE, TY_DOUBLE):
150
4/8
✓ Branch 21 → 22 taken 85 times.
✗ Branch 21 → 141 not taken.
✓ Branch 22 → 23 taken 85 times.
✗ Branch 22 → 141 not taken.
✓ Branch 23 → 24 taken 85 times.
✗ Branch 23 → 141 not taken.
✓ Branch 24 → 25 taken 85 times.
✗ Branch 24 → 141 not taken.
85 return {.value = builder.CreateFMul(lhsV(), rhsV())};
151 2 case COMB(TY_INT, TY_INT):
152
8/16
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 162 not taken.
✓ Branch 27 → 28 taken 2 times.
✗ Branch 27 → 31 not taken.
✓ Branch 28 → 29 taken 2 times.
✗ Branch 28 → 162 not taken.
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 31 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 142 not taken.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 142 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 142 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 142 not taken.
2 return {.value = builder.CreateMul(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
153 4 case COMB(TY_INT, TY_SHORT): // fallthrough
154 case COMB(TY_INT, TY_LONG): {
155
5/10
✓ Branch 37 → 38 taken 4 times.
✗ Branch 37 → 143 not taken.
✓ Branch 38 → 39 taken 4 times.
✗ Branch 38 → 143 not taken.
✓ Branch 39 → 40 taken 4 times.
✗ Branch 39 → 143 not taken.
✓ Branch 40 → 41 taken 4 times.
✗ Branch 40 → 143 not taken.
✓ Branch 41 → 42 taken 4 times.
✗ Branch 41 → 162 not taken.
4 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
156
7/14
✓ Branch 41 → 42 taken 4 times.
✗ Branch 41 → 162 not taken.
✓ Branch 42 → 43 taken 4 times.
✗ Branch 42 → 46 not taken.
✓ Branch 43 → 44 taken 4 times.
✗ Branch 43 → 162 not taken.
✓ Branch 44 → 45 taken 4 times.
✗ Branch 44 → 46 not taken.
✓ Branch 47 → 48 taken 4 times.
✗ Branch 47 → 144 not taken.
✓ Branch 48 → 49 taken 4 times.
✗ Branch 48 → 144 not taken.
✓ Branch 49 → 50 taken 4 times.
✗ Branch 49 → 144 not taken.
4 return {.value = builder.CreateMul(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
157 }
158 1 case COMB(TY_SHORT, TY_INT): {
159
5/10
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 145 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 145 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 145 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 145 not taken.
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 162 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
160
7/14
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 162 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 60 not taken.
✓ Branch 57 → 58 taken 1 time.
✗ Branch 57 → 162 not taken.
✓ Branch 58 → 59 taken 1 time.
✗ Branch 58 → 60 not taken.
✓ Branch 61 → 62 taken 1 time.
✗ Branch 61 → 146 not taken.
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 146 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 146 not taken.
1 return {.value = builder.CreateMul(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
161 }
162 1 case COMB(TY_SHORT, TY_SHORT):
163
8/16
✓ Branch 65 → 66 taken 1 time.
✗ Branch 65 → 162 not taken.
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 70 not taken.
✓ Branch 67 → 68 taken 1 time.
✗ Branch 67 → 162 not taken.
✓ Branch 68 → 69 taken 1 time.
✗ Branch 68 → 70 not taken.
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 147 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 147 not taken.
✓ Branch 73 → 74 taken 1 time.
✗ Branch 73 → 147 not taken.
✓ Branch 74 → 75 taken 1 time.
✗ Branch 74 → 147 not taken.
1 return {.value = builder.CreateMul(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
164 1 case COMB(TY_SHORT, TY_LONG): {
165
5/10
✓ Branch 76 → 77 taken 1 time.
✗ Branch 76 → 148 not taken.
✓ Branch 77 → 78 taken 1 time.
✗ Branch 77 → 148 not taken.
✓ Branch 78 → 79 taken 1 time.
✗ Branch 78 → 148 not taken.
✓ Branch 79 → 80 taken 1 time.
✗ Branch 79 → 148 not taken.
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 162 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
166
7/14
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 162 not taken.
✓ Branch 81 → 82 taken 1 time.
✗ Branch 81 → 85 not taken.
✓ Branch 82 → 83 taken 1 time.
✗ Branch 82 → 162 not taken.
✓ Branch 83 → 84 taken 1 time.
✗ Branch 83 → 85 not taken.
✓ Branch 86 → 87 taken 1 time.
✗ Branch 86 → 149 not taken.
✓ Branch 87 → 88 taken 1 time.
✗ Branch 87 → 149 not taken.
✓ Branch 88 → 89 taken 1 time.
✗ Branch 88 → 149 not taken.
1 return {.value = builder.CreateMul(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
167 }
168 2 case COMB(TY_LONG, TY_INT): // fallthrough
169 case COMB(TY_LONG, TY_SHORT): {
170
5/10
✓ Branch 90 → 91 taken 2 times.
✗ Branch 90 → 150 not taken.
✓ Branch 91 → 92 taken 2 times.
✗ Branch 91 → 150 not taken.
✓ Branch 92 → 93 taken 2 times.
✗ Branch 92 → 150 not taken.
✓ Branch 93 → 94 taken 2 times.
✗ Branch 93 → 150 not taken.
✓ Branch 94 → 95 taken 2 times.
✗ Branch 94 → 162 not taken.
2 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
171
7/14
✓ Branch 94 → 95 taken 2 times.
✗ Branch 94 → 162 not taken.
✓ Branch 95 → 96 taken 2 times.
✗ Branch 95 → 99 not taken.
✓ Branch 96 → 97 taken 2 times.
✗ Branch 96 → 162 not taken.
✓ Branch 97 → 98 taken 2 times.
✗ Branch 97 → 99 not taken.
✓ Branch 100 → 101 taken 2 times.
✗ Branch 100 → 151 not taken.
✓ Branch 101 → 102 taken 2 times.
✗ Branch 101 → 151 not taken.
✓ Branch 102 → 103 taken 2 times.
✗ Branch 102 → 151 not taken.
2 return {.value = builder.CreateMul(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
172 }
173 71 case COMB(TY_LONG, TY_LONG):
174
9/16
✓ Branch 104 → 105 taken 71 times.
✗ Branch 104 → 162 not taken.
✓ Branch 105 → 106 taken 2 times.
✓ Branch 105 → 109 taken 69 times.
✓ Branch 106 → 107 taken 2 times.
✗ Branch 106 → 162 not taken.
✓ Branch 107 → 108 taken 2 times.
✗ Branch 107 → 109 not taken.
✓ Branch 110 → 111 taken 71 times.
✗ Branch 110 → 152 not taken.
✓ Branch 111 → 112 taken 71 times.
✗ Branch 111 → 152 not taken.
✓ Branch 112 → 113 taken 71 times.
✗ Branch 112 → 152 not taken.
✓ Branch 113 → 114 taken 71 times.
✗ Branch 113 → 152 not taken.
71 return {.value = builder.CreateMul(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
175 default: // GCOV_EXCL_LINE
176 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: *="); // GCOV_EXCL_LINE
177 }
178
5/14
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 135 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 135 not taken.
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 135 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 135 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 133 not taken.
✗ Branch 135 → 136 not taken.
✗ Branch 135 → 139 not taken.
✗ Branch 137 → 138 not taken.
✗ Branch 137 → 139 not taken.
171 }
179
180 103 LLVMExprResult OpRuleConversionManager::getDivEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
181 LLVMExprResult &rhs, QualType rhsSTy) {
182
1/2
✓ Branch 2 → 3 taken 103 times.
✗ Branch 2 → 81 not taken.
144 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
183
1/2
✓ Branch 3 → 4 taken 103 times.
✗ Branch 3 → 82 not taken.
206 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
184 165 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
185 103 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
186
1/2
✓ Branch 6 → 7 taken 103 times.
✗ Branch 6 → 83 not taken.
103 lhsSTy = lhsSTy.removeReferenceWrapper();
187
1/2
✓ Branch 7 → 8 taken 103 times.
✗ Branch 7 → 84 not taken.
103 rhsSTy = rhsSTy.removeReferenceWrapper();
188
1/2
✓ Branch 8 → 9 taken 103 times.
✗ Branch 8 → 108 not taken.
103 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
189
190 // Handle operator overloads
191
3/4
✓ Branch 9 → 10 taken 103 times.
✗ Branch 9 → 108 not taken.
✓ Branch 10 → 11 taken 62 times.
✓ Branch 10 → 19 taken 41 times.
103 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
192 62 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
193
194
9/11
✓ Branch 19 → 20 taken 41 times.
✗ Branch 19 → 108 not taken.
✓ Branch 20 → 21 taken 20 times.
✓ Branch 20 → 26 taken 10 times.
✓ Branch 20 → 30 taken 4 times.
✓ Branch 20 → 37 taken 1 time.
✓ Branch 20 → 44 taken 1 time.
✓ Branch 20 → 49 taken 1 time.
✓ Branch 20 → 56 taken 2 times.
✓ Branch 20 → 63 taken 2 times.
✗ Branch 20 → 67 not taken.
41 switch (getTypeCombination(lhsSTy, rhsSTy)) {
195 20 case COMB(TY_DOUBLE, TY_DOUBLE):
196
4/8
✓ Branch 21 → 22 taken 20 times.
✗ Branch 21 → 93 not taken.
✓ Branch 22 → 23 taken 20 times.
✗ Branch 22 → 93 not taken.
✓ Branch 23 → 24 taken 20 times.
✗ Branch 23 → 93 not taken.
✓ Branch 24 → 25 taken 20 times.
✗ Branch 24 → 93 not taken.
20 return {.value = builder.CreateFDiv(lhsV(), rhsV())};
197 10 case COMB(TY_INT, TY_INT):
198
3/6
✓ Branch 26 → 27 taken 10 times.
✗ Branch 26 → 108 not taken.
✓ Branch 27 → 28 taken 10 times.
✗ Branch 27 → 108 not taken.
✓ Branch 28 → 29 taken 10 times.
✗ Branch 28 → 108 not taken.
10 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsV())};
199 4 case COMB(TY_INT, TY_SHORT): // fallthrough
200 case COMB(TY_INT, TY_LONG): {
201
5/10
✓ Branch 30 → 31 taken 4 times.
✗ Branch 30 → 94 not taken.
✓ Branch 31 → 32 taken 4 times.
✗ Branch 31 → 94 not taken.
✓ Branch 32 → 33 taken 4 times.
✗ Branch 32 → 94 not taken.
✓ Branch 33 → 34 taken 4 times.
✗ Branch 33 → 94 not taken.
✓ Branch 34 → 35 taken 4 times.
✗ Branch 34 → 108 not taken.
4 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
202
2/4
✓ Branch 34 → 35 taken 4 times.
✗ Branch 34 → 108 not taken.
✓ Branch 35 → 36 taken 4 times.
✗ Branch 35 → 108 not taken.
4 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsInt)};
203 }
204 1 case COMB(TY_SHORT, TY_INT): {
205
5/10
✓ Branch 37 → 38 taken 1 time.
✗ Branch 37 → 95 not taken.
✓ Branch 38 → 39 taken 1 time.
✗ Branch 38 → 95 not taken.
✓ Branch 39 → 40 taken 1 time.
✗ Branch 39 → 95 not taken.
✓ Branch 40 → 41 taken 1 time.
✗ Branch 40 → 95 not taken.
✓ Branch 41 → 42 taken 1 time.
✗ Branch 41 → 108 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
206
2/4
✓ Branch 41 → 42 taken 1 time.
✗ Branch 41 → 108 not taken.
✓ Branch 42 → 43 taken 1 time.
✗ Branch 42 → 108 not taken.
1 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsShort)};
207 }
208 1 case COMB(TY_SHORT, TY_SHORT):
209
4/8
✓ Branch 44 → 45 taken 1 time.
✗ Branch 44 → 96 not taken.
✓ Branch 45 → 46 taken 1 time.
✗ Branch 45 → 96 not taken.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 96 not taken.
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 96 not taken.
1 return {.value = builder.CreateSDiv(lhsV(), rhsV())};
210 1 case COMB(TY_SHORT, TY_LONG): {
211
5/10
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 97 not taken.
✓ Branch 50 → 51 taken 1 time.
✗ Branch 50 → 97 not taken.
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 97 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 97 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 108 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
212
2/4
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 108 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 108 not taken.
1 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsShort)};
213 }
214 2 case COMB(TY_LONG, TY_INT): // fallthrough
215 case COMB(TY_LONG, TY_SHORT): {
216
5/10
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 98 not taken.
✓ Branch 57 → 58 taken 2 times.
✗ Branch 57 → 98 not taken.
✓ Branch 58 → 59 taken 2 times.
✗ Branch 58 → 98 not taken.
✓ Branch 59 → 60 taken 2 times.
✗ Branch 59 → 98 not taken.
✓ Branch 60 → 61 taken 2 times.
✗ Branch 60 → 108 not taken.
2 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
217
2/4
✓ Branch 60 → 61 taken 2 times.
✗ Branch 60 → 108 not taken.
✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 108 not taken.
2 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsLong)};
218 }
219 2 case COMB(TY_LONG, TY_LONG):
220
3/6
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 108 not taken.
✓ Branch 64 → 65 taken 2 times.
✗ Branch 64 → 108 not taken.
✓ Branch 65 → 66 taken 2 times.
✗ Branch 65 → 108 not taken.
2 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsV())};
221 default: // GCOV_EXCL_LINE
222 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: /="); // GCOV_EXCL_LINE
223 }
224
5/14
✓ Branch 11 → 12 taken 62 times.
✗ Branch 11 → 87 not taken.
✓ Branch 12 → 13 taken 62 times.
✗ Branch 12 → 87 not taken.
✓ Branch 13 → 14 taken 62 times.
✗ Branch 13 → 87 not taken.
✓ Branch 14 → 15 taken 62 times.
✗ Branch 14 → 87 not taken.
✓ Branch 15 → 16 taken 62 times.
✗ Branch 15 → 85 not taken.
✗ Branch 87 → 88 not taken.
✗ Branch 87 → 91 not taken.
✗ Branch 89 → 90 not taken.
✗ Branch 89 → 91 not taken.
165 }
225
226 40 LLVMExprResult OpRuleConversionManager::getRemEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
227 LLVMExprResult &rhs, QualType rhsSTy) {
228
1/2
✓ Branch 2 → 3 taken 40 times.
✗ Branch 2 → 72 not taken.
80 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
229
1/2
✓ Branch 3 → 4 taken 40 times.
✗ Branch 3 → 73 not taken.
80 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
230
1/2
✓ Branch 4 → 5 taken 40 times.
✗ Branch 4 → 74 not taken.
40 lhsSTy = lhsSTy.removeReferenceWrapper();
231
1/2
✓ Branch 5 → 6 taken 40 times.
✗ Branch 5 → 75 not taken.
40 rhsSTy = rhsSTy.removeReferenceWrapper();
232
1/2
✓ Branch 6 → 7 taken 40 times.
✗ Branch 6 → 93 not taken.
40 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
233
234
9/11
✓ Branch 7 → 8 taken 40 times.
✗ Branch 7 → 93 not taken.
✓ Branch 8 → 9 taken 1 time.
✓ Branch 8 → 17 taken 2 times.
✓ Branch 8 → 22 taken 2 times.
✓ Branch 8 → 30 taken 1 time.
✓ Branch 8 → 37 taken 1 time.
✓ Branch 8 → 42 taken 1 time.
✓ Branch 8 → 49 taken 2 times.
✓ Branch 8 → 56 taken 30 times.
✗ Branch 8 → 60 not taken.
40 switch (getTypeCombination(lhsSTy, rhsSTy)) {
235 1 case COMB(TY_DOUBLE, TY_DOUBLE): {
236 // LLVM generates a call to fmod on Linux systems
237
1/2
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 12 not taken.
1 if (irGenerator->cliOptions.targetTriple.isOSLinux())
238
1/2
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 93 not taken.
1 irGenerator->resourceManager.linker.requestLibMathLinkage();
239
4/8
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 76 not taken.
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 76 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 76 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 76 not taken.
1 return {.value = builder.CreateFRem(lhsV(), rhsV())};
240 }
241 2 case COMB(TY_INT, TY_INT):
242
4/8
✓ Branch 17 → 18 taken 2 times.
✗ Branch 17 → 77 not taken.
✓ Branch 18 → 19 taken 2 times.
✗ Branch 18 → 77 not taken.
✓ Branch 19 → 20 taken 2 times.
✗ Branch 19 → 77 not taken.
✓ Branch 20 → 21 taken 2 times.
✗ Branch 20 → 77 not taken.
2 return {.value = builder.CreateSRem(lhsV(), rhsV())};
243 2 case COMB(TY_INT, TY_SHORT): // fallthrough
244 case COMB(TY_INT, TY_LONG): {
245
5/10
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 78 not taken.
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 78 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 78 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 78 not taken.
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 79 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
246
3/6
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 79 not taken.
✓ Branch 27 → 28 taken 2 times.
✗ Branch 27 → 79 not taken.
✓ Branch 28 → 29 taken 2 times.
✗ Branch 28 → 79 not taken.
2 return {.value = builder.CreateSRem(lhsV(), rhsInt)};
247 }
248 1 case COMB(TY_SHORT, TY_INT): {
249
5/10
✓ Branch 30 → 31 taken 1 time.
✗ Branch 30 → 80 not taken.
✓ Branch 31 → 32 taken 1 time.
✗ Branch 31 → 80 not taken.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 80 not taken.
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 80 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 93 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
250
2/4
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 93 not taken.
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 93 not taken.
1 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsShort)};
251 }
252 1 case COMB(TY_SHORT, TY_SHORT):
253
4/8
✓ Branch 37 → 38 taken 1 time.
✗ Branch 37 → 81 not taken.
✓ Branch 38 → 39 taken 1 time.
✗ Branch 38 → 81 not taken.
✓ Branch 39 → 40 taken 1 time.
✗ Branch 39 → 81 not taken.
✓ Branch 40 → 41 taken 1 time.
✗ Branch 40 → 81 not taken.
1 return {.value = builder.CreateSRem(lhsV(), rhsV())};
254 1 case COMB(TY_SHORT, TY_LONG): {
255
5/10
✓ Branch 42 → 43 taken 1 time.
✗ Branch 42 → 82 not taken.
✓ Branch 43 → 44 taken 1 time.
✗ Branch 43 → 82 not taken.
✓ Branch 44 → 45 taken 1 time.
✗ Branch 44 → 82 not taken.
✓ Branch 45 → 46 taken 1 time.
✗ Branch 45 → 82 not taken.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 93 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
256
2/4
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 93 not taken.
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 93 not taken.
1 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsShort)};
257 }
258 2 case COMB(TY_LONG, TY_INT): // fallthrough
259 case COMB(TY_LONG, TY_SHORT): {
260
5/10
✓ Branch 49 → 50 taken 2 times.
✗ Branch 49 → 83 not taken.
✓ Branch 50 → 51 taken 2 times.
✗ Branch 50 → 83 not taken.
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 83 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 83 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 93 not taken.
2 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
261
2/4
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 93 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 93 not taken.
2 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsLong)};
262 }
263 30 case COMB(TY_LONG, TY_LONG): // fallthrough
264 case COMB(TY_BYTE, TY_BYTE):
265
3/6
✓ Branch 56 → 57 taken 30 times.
✗ Branch 56 → 93 not taken.
✓ Branch 57 → 58 taken 30 times.
✗ Branch 57 → 93 not taken.
✓ Branch 58 → 59 taken 30 times.
✗ Branch 58 → 93 not taken.
30 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsV())};
266 default: // GCOV_EXCL_LINE
267 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: %="); // GCOV_EXCL_LINE
268 }
269 40 }
270
271 11 LLVMExprResult OpRuleConversionManager::getSHLEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
272 LLVMExprResult &rhs, QualType rhsSTy) {
273
1/2
✓ Branch 2 → 3 taken 11 times.
✗ Branch 2 → 52 not taken.
22 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
274
1/2
✓ Branch 3 → 4 taken 11 times.
✗ Branch 3 → 53 not taken.
22 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
275
1/2
✓ Branch 4 → 5 taken 11 times.
✗ Branch 4 → 54 not taken.
11 lhsSTy = lhsSTy.removeReferenceWrapper();
276
1/2
✓ Branch 5 → 6 taken 11 times.
✗ Branch 5 → 55 not taken.
11 rhsSTy = rhsSTy.removeReferenceWrapper();
277
1/2
✓ Branch 6 → 7 taken 11 times.
✗ Branch 6 → 72 not taken.
11 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
278
279
6/8
✓ Branch 7 → 8 taken 11 times.
✗ Branch 7 → 72 not taken.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 14 taken 3 times.
✓ Branch 8 → 22 taken 1 time.
✓ Branch 8 → 27 taken 3 times.
✓ Branch 8 → 35 taken 2 times.
✗ Branch 8 → 40 not taken.
11 switch (getTypeCombination(lhsSTy, rhsSTy)) {
280 2 case COMB(TY_INT, TY_INT):
281
4/8
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 56 not taken.
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 56 not taken.
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 56 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 56 not taken.
2 return {.value = builder.CreateShl(lhsV(), rhsV())};
282 3 case COMB(TY_INT, TY_SHORT): // fallthrough
283 case COMB(TY_INT, TY_LONG): // fallthrough
284 case COMB(TY_SHORT, TY_INT): {
285
5/10
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 57 not taken.
✓ Branch 15 → 16 taken 3 times.
✗ Branch 15 → 57 not taken.
✓ Branch 16 → 17 taken 3 times.
✗ Branch 16 → 57 not taken.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 57 not taken.
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 58 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
286
3/6
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 58 not taken.
✓ Branch 19 → 20 taken 3 times.
✗ Branch 19 → 58 not taken.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 58 not taken.
3 return {.value = builder.CreateShl(lhsV(), rhsInt)};
287 }
288 1 case COMB(TY_SHORT, TY_SHORT):
289
4/8
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 59 not taken.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 59 not taken.
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 59 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 59 not taken.
1 return {.value = builder.CreateShl(lhsV(), rhsV())};
290 3 case COMB(TY_SHORT, TY_LONG): // fallthrough
291 case COMB(TY_LONG, TY_INT): // fallthrough
292 case COMB(TY_LONG, TY_SHORT): {
293
5/10
✓ Branch 27 → 28 taken 3 times.
✗ Branch 27 → 60 not taken.
✓ Branch 28 → 29 taken 3 times.
✗ Branch 28 → 60 not taken.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 60 not taken.
✓ Branch 30 → 31 taken 3 times.
✗ Branch 30 → 60 not taken.
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 61 not taken.
3 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
294
3/6
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 61 not taken.
✓ Branch 32 → 33 taken 3 times.
✗ Branch 32 → 61 not taken.
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 61 not taken.
3 return {.value = builder.CreateShl(lhsV(), rhsLong)};
295 }
296 2 case COMB(TY_LONG, TY_LONG): // fallthrough
297 case COMB(TY_BYTE, TY_BYTE):
298
4/8
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 62 not taken.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 62 not taken.
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 62 not taken.
✓ Branch 38 → 39 taken 2 times.
✗ Branch 38 → 62 not taken.
2 return {.value = builder.CreateShl(lhsV(), rhsV())};
299 default: // GCOV_EXCL_LINE
300 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: <<="); // GCOV_EXCL_LINE
301 }
302 11 }
303
304 12 LLVMExprResult OpRuleConversionManager::getSHREqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
305 LLVMExprResult &rhs, QualType rhsSTy) {
306
1/2
✓ Branch 2 → 3 taken 12 times.
✗ Branch 2 → 48 not taken.
24 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
307
1/2
✓ Branch 3 → 4 taken 12 times.
✗ Branch 3 → 49 not taken.
24 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
308
1/2
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 50 not taken.
12 lhsSTy = lhsSTy.removeReferenceWrapper();
309
1/2
✓ Branch 5 → 6 taken 12 times.
✗ Branch 5 → 51 not taken.
12 rhsSTy = rhsSTy.removeReferenceWrapper();
310
1/2
✓ Branch 6 → 7 taken 12 times.
✗ Branch 6 → 64 not taken.
12 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
311
312
6/8
✓ Branch 7 → 8 taken 12 times.
✗ Branch 7 → 64 not taken.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 13 taken 3 times.
✓ Branch 8 → 20 taken 1 time.
✓ Branch 8 → 25 taken 4 times.
✓ Branch 8 → 32 taken 2 times.
✗ Branch 8 → 36 not taken.
12 switch (getTypeCombination(lhsSTy, rhsSTy)) {
313 2 case COMB(TY_INT, TY_INT):
314
3/6
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 64 not taken.
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 64 not taken.
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 64 not taken.
2 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
315 3 case COMB(TY_INT, TY_SHORT): // fallthrough
316 case COMB(TY_INT, TY_LONG): // fallthrough
317 case COMB(TY_SHORT, TY_INT): {
318
5/10
✓ Branch 13 → 14 taken 3 times.
✗ Branch 13 → 52 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 52 not taken.
✓ Branch 15 → 16 taken 3 times.
✗ Branch 15 → 52 not taken.
✓ Branch 16 → 17 taken 3 times.
✗ Branch 16 → 52 not taken.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 64 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
319
2/4
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 64 not taken.
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 64 not taken.
3 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsInt)};
320 }
321 1 case COMB(TY_SHORT, TY_SHORT):
322
4/8
✓ Branch 20 → 21 taken 1 time.
✗ Branch 20 → 53 not taken.
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 53 not taken.
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 53 not taken.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 53 not taken.
1 return {.value = builder.CreateLShr(lhsV(), rhsV())};
323 4 case COMB(TY_SHORT, TY_LONG): // fallthrough
324 case COMB(TY_LONG, TY_INT): // fallthrough
325 case COMB(TY_LONG, TY_SHORT): {
326
5/10
✓ Branch 25 → 26 taken 4 times.
✗ Branch 25 → 54 not taken.
✓ Branch 26 → 27 taken 4 times.
✗ Branch 26 → 54 not taken.
✓ Branch 27 → 28 taken 4 times.
✗ Branch 27 → 54 not taken.
✓ Branch 28 → 29 taken 4 times.
✗ Branch 28 → 54 not taken.
✓ Branch 29 → 30 taken 4 times.
✗ Branch 29 → 64 not taken.
4 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
327
2/4
✓ Branch 29 → 30 taken 4 times.
✗ Branch 29 → 64 not taken.
✓ Branch 30 → 31 taken 4 times.
✗ Branch 30 → 64 not taken.
4 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsLong)};
328 }
329 2 case COMB(TY_LONG, TY_LONG): // fallthrough
330 case COMB(TY_BYTE, TY_BYTE):
331
3/6
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 64 not taken.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 64 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 64 not taken.
2 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
332 default: // GCOV_EXCL_LINE
333 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: >>="); // GCOV_EXCL_LINE
334 }
335 12 }
336
337 17 LLVMExprResult OpRuleConversionManager::getAndEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
338 LLVMExprResult &rhs, QualType rhsSTy) {
339
1/2
✓ Branch 2 → 3 taken 17 times.
✗ Branch 2 → 52 not taken.
34 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
340
1/2
✓ Branch 3 → 4 taken 17 times.
✗ Branch 3 → 53 not taken.
34 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
341
1/2
✓ Branch 4 → 5 taken 17 times.
✗ Branch 4 → 54 not taken.
17 lhsSTy = lhsSTy.removeReferenceWrapper();
342
1/2
✓ Branch 5 → 6 taken 17 times.
✗ Branch 5 → 55 not taken.
17 rhsSTy = rhsSTy.removeReferenceWrapper();
343
1/2
✓ Branch 6 → 7 taken 17 times.
✗ Branch 6 → 72 not taken.
17 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
344
345
6/8
✓ Branch 7 → 8 taken 17 times.
✗ Branch 7 → 72 not taken.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 14 taken 3 times.
✓ Branch 8 → 22 taken 1 time.
✓ Branch 8 → 27 taken 3 times.
✓ Branch 8 → 35 taken 8 times.
✗ Branch 8 → 40 not taken.
17 switch (getTypeCombination(lhsSTy, rhsSTy)) {
346 2 case COMB(TY_INT, TY_INT):
347
4/8
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 56 not taken.
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 56 not taken.
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 56 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 56 not taken.
2 return {.value = builder.CreateAnd(lhsV(), rhsV())};
348 3 case COMB(TY_INT, TY_SHORT): // fallthrough
349 case COMB(TY_INT, TY_LONG): // fallthrough
350 case COMB(TY_SHORT, TY_INT): {
351
5/10
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 57 not taken.
✓ Branch 15 → 16 taken 3 times.
✗ Branch 15 → 57 not taken.
✓ Branch 16 → 17 taken 3 times.
✗ Branch 16 → 57 not taken.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 57 not taken.
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 58 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
352
3/6
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 58 not taken.
✓ Branch 19 → 20 taken 3 times.
✗ Branch 19 → 58 not taken.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 58 not taken.
3 return {.value = builder.CreateAnd(lhsV(), rhsInt)};
353 }
354 1 case COMB(TY_SHORT, TY_SHORT):
355
4/8
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 59 not taken.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 59 not taken.
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 59 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 59 not taken.
1 return {.value = builder.CreateAnd(lhsV(), rhsV())};
356 3 case COMB(TY_SHORT, TY_LONG): // fallthrough
357 case COMB(TY_LONG, TY_INT): // fallthrough
358 case COMB(TY_LONG, TY_SHORT): {
359
5/10
✓ Branch 27 → 28 taken 3 times.
✗ Branch 27 → 60 not taken.
✓ Branch 28 → 29 taken 3 times.
✗ Branch 28 → 60 not taken.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 60 not taken.
✓ Branch 30 → 31 taken 3 times.
✗ Branch 30 → 60 not taken.
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 61 not taken.
3 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
360
3/6
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 61 not taken.
✓ Branch 32 → 33 taken 3 times.
✗ Branch 32 → 61 not taken.
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 61 not taken.
3 return {.value = builder.CreateAnd(lhsV(), rhsLong)};
361 }
362 8 case COMB(TY_LONG, TY_LONG): // fallthrough
363 case COMB(TY_BYTE, TY_BYTE):
364
4/8
✓ Branch 35 → 36 taken 8 times.
✗ Branch 35 → 62 not taken.
✓ Branch 36 → 37 taken 8 times.
✗ Branch 36 → 62 not taken.
✓ Branch 37 → 38 taken 8 times.
✗ Branch 37 → 62 not taken.
✓ Branch 38 → 39 taken 8 times.
✗ Branch 38 → 62 not taken.
8 return {.value = builder.CreateAnd(lhsV(), rhsV())};
365 default: // GCOV_EXCL_LINE
366 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: &="); // GCOV_EXCL_LINE
367 }
368 17 }
369
370 13 LLVMExprResult OpRuleConversionManager::getOrEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
371 LLVMExprResult &rhs, QualType rhsSTy) {
372
1/2
✓ Branch 2 → 3 taken 13 times.
✗ Branch 2 → 52 not taken.
26 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
373
1/2
✓ Branch 3 → 4 taken 13 times.
✗ Branch 3 → 53 not taken.
26 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
374
1/2
✓ Branch 4 → 5 taken 13 times.
✗ Branch 4 → 54 not taken.
13 lhsSTy = lhsSTy.removeReferenceWrapper();
375
1/2
✓ Branch 5 → 6 taken 13 times.
✗ Branch 5 → 55 not taken.
13 rhsSTy = rhsSTy.removeReferenceWrapper();
376
1/2
✓ Branch 6 → 7 taken 13 times.
✗ Branch 6 → 72 not taken.
13 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
377
378
6/8
✓ Branch 7 → 8 taken 13 times.
✗ Branch 7 → 72 not taken.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 14 taken 3 times.
✓ Branch 8 → 22 taken 1 time.
✓ Branch 8 → 27 taken 3 times.
✓ Branch 8 → 35 taken 4 times.
✗ Branch 8 → 40 not taken.
13 switch (getTypeCombination(lhsSTy, rhsSTy)) {
379 2 case COMB(TY_INT, TY_INT):
380
4/8
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 56 not taken.
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 56 not taken.
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 56 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 56 not taken.
2 return {.value = builder.CreateOr(lhsV(), rhsV())};
381 3 case COMB(TY_INT, TY_SHORT): // fallthrough
382 case COMB(TY_INT, TY_LONG): // fallthrough
383 case COMB(TY_SHORT, TY_INT): {
384
5/10
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 57 not taken.
✓ Branch 15 → 16 taken 3 times.
✗ Branch 15 → 57 not taken.
✓ Branch 16 → 17 taken 3 times.
✗ Branch 16 → 57 not taken.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 57 not taken.
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 58 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
385
3/6
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 58 not taken.
✓ Branch 19 → 20 taken 3 times.
✗ Branch 19 → 58 not taken.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 58 not taken.
3 return {.value = builder.CreateOr(lhsV(), rhsInt)};
386 }
387 1 case COMB(TY_SHORT, TY_SHORT):
388
4/8
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 59 not taken.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 59 not taken.
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 59 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 59 not taken.
1 return {.value = builder.CreateOr(lhsV(), rhsV())};
389 3 case COMB(TY_SHORT, TY_LONG): // fallthrough
390 case COMB(TY_LONG, TY_INT): // fallthrough
391 case COMB(TY_LONG, TY_SHORT): {
392
5/10
✓ Branch 27 → 28 taken 3 times.
✗ Branch 27 → 60 not taken.
✓ Branch 28 → 29 taken 3 times.
✗ Branch 28 → 60 not taken.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 60 not taken.
✓ Branch 30 → 31 taken 3 times.
✗ Branch 30 → 60 not taken.
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 61 not taken.
3 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
393
3/6
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 61 not taken.
✓ Branch 32 → 33 taken 3 times.
✗ Branch 32 → 61 not taken.
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 61 not taken.
3 return {.value = builder.CreateOr(lhsV(), rhsLong)};
394 }
395 4 case COMB(TY_LONG, TY_LONG): // fallthrough
396 case COMB(TY_BYTE, TY_BYTE):
397
4/8
✓ Branch 35 → 36 taken 4 times.
✗ Branch 35 → 62 not taken.
✓ Branch 36 → 37 taken 4 times.
✗ Branch 36 → 62 not taken.
✓ Branch 37 → 38 taken 4 times.
✗ Branch 37 → 62 not taken.
✓ Branch 38 → 39 taken 4 times.
✗ Branch 38 → 62 not taken.
4 return {.value = builder.CreateOr(lhsV(), rhsV())};
398 default: // GCOV_EXCL_LINE
399 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: |="); // GCOV_EXCL_LINE
400 }
401 13 }
402
403 662 LLVMExprResult OpRuleConversionManager::getXorEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
404 LLVMExprResult &rhs, QualType rhsSTy) {
405
1/2
✓ Branch 2 → 3 taken 662 times.
✗ Branch 2 → 52 not taken.
1324 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
406
1/2
✓ Branch 3 → 4 taken 662 times.
✗ Branch 3 → 53 not taken.
1324 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
407
1/2
✓ Branch 4 → 5 taken 662 times.
✗ Branch 4 → 54 not taken.
662 lhsSTy = lhsSTy.removeReferenceWrapper();
408
1/2
✓ Branch 5 → 6 taken 662 times.
✗ Branch 5 → 55 not taken.
662 rhsSTy = rhsSTy.removeReferenceWrapper();
409
1/2
✓ Branch 6 → 7 taken 662 times.
✗ Branch 6 → 72 not taken.
662 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
410
411
6/8
✓ Branch 7 → 8 taken 662 times.
✗ Branch 7 → 72 not taken.
✓ Branch 8 → 9 taken 1 time.
✓ Branch 8 → 14 taken 3 times.
✓ Branch 8 → 22 taken 1 time.
✓ Branch 8 → 27 taken 3 times.
✓ Branch 8 → 35 taken 654 times.
✗ Branch 8 → 40 not taken.
662 switch (getTypeCombination(lhsSTy, rhsSTy)) {
412 1 case COMB(TY_INT, TY_INT):
413
4/8
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 56 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 56 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 56 not taken.
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 56 not taken.
1 return {.value = builder.CreateXor(lhsV(), rhsV())};
414 3 case COMB(TY_INT, TY_SHORT): // fallthrough
415 case COMB(TY_INT, TY_LONG): // fallthrough
416 case COMB(TY_SHORT, TY_INT): {
417
5/10
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 57 not taken.
✓ Branch 15 → 16 taken 3 times.
✗ Branch 15 → 57 not taken.
✓ Branch 16 → 17 taken 3 times.
✗ Branch 16 → 57 not taken.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 57 not taken.
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 58 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
418
3/6
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 58 not taken.
✓ Branch 19 → 20 taken 3 times.
✗ Branch 19 → 58 not taken.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 58 not taken.
3 return {.value = builder.CreateXor(lhsV(), rhsInt)};
419 }
420 1 case COMB(TY_SHORT, TY_SHORT):
421
4/8
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 59 not taken.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 59 not taken.
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 59 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 59 not taken.
1 return {.value = builder.CreateXor(lhsV(), rhsV())};
422 3 case COMB(TY_SHORT, TY_LONG): // fallthrough
423 case COMB(TY_LONG, TY_INT): // fallthrough
424 case COMB(TY_LONG, TY_SHORT): {
425
5/10
✓ Branch 27 → 28 taken 3 times.
✗ Branch 27 → 60 not taken.
✓ Branch 28 → 29 taken 3 times.
✗ Branch 28 → 60 not taken.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 60 not taken.
✓ Branch 30 → 31 taken 3 times.
✗ Branch 30 → 60 not taken.
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 61 not taken.
3 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
426
3/6
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 61 not taken.
✓ Branch 32 → 33 taken 3 times.
✗ Branch 32 → 61 not taken.
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 61 not taken.
3 return {.value = builder.CreateXor(lhsV(), rhsLong)};
427 }
428 654 case COMB(TY_LONG, TY_LONG): // fallthrough
429 case COMB(TY_BYTE, TY_BYTE): // fallthrough
430 case COMB(TY_CHAR, TY_CHAR):
431
4/8
✓ Branch 35 → 36 taken 654 times.
✗ Branch 35 → 62 not taken.
✓ Branch 36 → 37 taken 654 times.
✗ Branch 36 → 62 not taken.
✓ Branch 37 → 38 taken 654 times.
✗ Branch 37 → 62 not taken.
✓ Branch 38 → 39 taken 654 times.
✗ Branch 38 → 62 not taken.
654 return {.value = builder.CreateXor(lhsV(), rhsV())};
432 default: // GCOV_EXCL_LINE
433 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: ^="); // GCOV_EXCL_LINE
434 }
435 662 }
436
437 275 LLVMExprResult OpRuleConversionManager::getBitwiseOrInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
438 LLVMExprResult &rhs, QualType rhsSTy, size_t opIdx) {
439
1/2
✓ Branch 2 → 3 taken 275 times.
✗ Branch 2 → 39 not taken.
548 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
440
1/2
✓ Branch 3 → 4 taken 275 times.
✗ Branch 3 → 40 not taken.
548 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
441 277 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
442 277 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
443
1/2
✓ Branch 6 → 7 taken 275 times.
✗ Branch 6 → 41 not taken.
275 lhsSTy = lhsSTy.removeReferenceWrapper();
444
1/2
✓ Branch 7 → 8 taken 275 times.
✗ Branch 7 → 42 not taken.
275 rhsSTy = rhsSTy.removeReferenceWrapper();
445
446 // Handle operator overloads
447
3/4
✓ Branch 8 → 9 taken 275 times.
✗ Branch 8 → 61 not taken.
✓ Branch 9 → 10 taken 4 times.
✓ Branch 9 → 18 taken 271 times.
275 if (callsOverloadedOpFct(node, opIdx))
448 4 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
449
450
2/4
✓ Branch 18 → 19 taken 271 times.
✗ Branch 18 → 61 not taken.
✓ Branch 19 → 20 taken 271 times.
✗ Branch 19 → 25 not taken.
271 switch (getTypeCombination(lhsSTy, rhsSTy)) {
451 271 case COMB(TY_INT, TY_INT): // fallthrough
452 case COMB(TY_SHORT, TY_SHORT): // fallthrough
453 case COMB(TY_LONG, TY_LONG): // fallthrough
454 case COMB(TY_BYTE, TY_BYTE): // fallthrough
455 case COMB(TY_BOOL, TY_BOOL):
456
4/8
✓ Branch 20 → 21 taken 271 times.
✗ Branch 20 → 51 not taken.
✓ Branch 21 → 22 taken 271 times.
✗ Branch 21 → 51 not taken.
✓ Branch 22 → 23 taken 271 times.
✗ Branch 22 → 51 not taken.
✓ Branch 23 → 24 taken 271 times.
✗ Branch 23 → 51 not taken.
271 return {.value = builder.CreateOr(lhsV(), rhsV())};
457 default: // GCOV_EXCL_LINE
458 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: |"); // GCOV_EXCL_LINE
459 }
460
5/14
✓ Branch 10 → 11 taken 4 times.
✗ Branch 10 → 45 not taken.
✓ Branch 11 → 12 taken 4 times.
✗ Branch 11 → 45 not taken.
✓ Branch 12 → 13 taken 4 times.
✗ Branch 12 → 45 not taken.
✓ Branch 13 → 14 taken 4 times.
✗ Branch 13 → 45 not taken.
✓ Branch 14 → 15 taken 4 times.
✗ Branch 14 → 43 not taken.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 49 not taken.
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 49 not taken.
279 }
461
462 37 LLVMExprResult OpRuleConversionManager::getBitwiseXorInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
463 LLVMExprResult &rhs, QualType rhsSTy, size_t opIdx) {
464
1/2
✓ Branch 2 → 3 taken 37 times.
✗ Branch 2 → 39 not taken.
72 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
465
1/2
✓ Branch 3 → 4 taken 37 times.
✗ Branch 3 → 40 not taken.
72 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
466 39 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
467 39 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
468
1/2
✓ Branch 6 → 7 taken 37 times.
✗ Branch 6 → 41 not taken.
37 lhsSTy = lhsSTy.removeReferenceWrapper();
469
1/2
✓ Branch 7 → 8 taken 37 times.
✗ Branch 7 → 42 not taken.
37 rhsSTy = rhsSTy.removeReferenceWrapper();
470
471 // Handle operator overloads
472
3/4
✓ Branch 8 → 9 taken 37 times.
✗ Branch 8 → 61 not taken.
✓ Branch 9 → 10 taken 3 times.
✓ Branch 9 → 18 taken 34 times.
37 if (callsOverloadedOpFct(node, opIdx))
473 3 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
474
475
2/4
✓ Branch 18 → 19 taken 34 times.
✗ Branch 18 → 61 not taken.
✓ Branch 19 → 20 taken 34 times.
✗ Branch 19 → 25 not taken.
34 switch (getTypeCombination(lhsSTy, rhsSTy)) {
476 34 case COMB(TY_INT, TY_INT): // fallthrough
477 case COMB(TY_SHORT, TY_SHORT): // fallthrough
478 case COMB(TY_LONG, TY_LONG): // fallthrough
479 case COMB(TY_BYTE, TY_BYTE): // fallthrough
480 case COMB(TY_BOOL, TY_BOOL):
481
4/8
✓ Branch 20 → 21 taken 34 times.
✗ Branch 20 → 51 not taken.
✓ Branch 21 → 22 taken 34 times.
✗ Branch 21 → 51 not taken.
✓ Branch 22 → 23 taken 34 times.
✗ Branch 22 → 51 not taken.
✓ Branch 23 → 24 taken 34 times.
✗ Branch 23 → 51 not taken.
34 return {.value = builder.CreateXor(lhsV(), rhsV())};
482 default: // GCOV_EXCL_LINE
483 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: ^"); // GCOV_EXCL_LINE
484 }
485
5/14
✓ Branch 10 → 11 taken 3 times.
✗ Branch 10 → 45 not taken.
✓ Branch 11 → 12 taken 3 times.
✗ Branch 11 → 45 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 45 not taken.
✓ Branch 13 → 14 taken 3 times.
✗ Branch 13 → 45 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 43 not taken.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 49 not taken.
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 49 not taken.
40 }
486
487 69 LLVMExprResult OpRuleConversionManager::getBitwiseAndInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
488 LLVMExprResult &rhs, QualType rhsSTy, size_t opIdx) {
489
1/2
✓ Branch 2 → 3 taken 69 times.
✗ Branch 2 → 39 not taken.
136 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
490
1/2
✓ Branch 3 → 4 taken 69 times.
✗ Branch 3 → 40 not taken.
136 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
491 71 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
492 71 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
493
1/2
✓ Branch 6 → 7 taken 69 times.
✗ Branch 6 → 41 not taken.
69 lhsSTy = lhsSTy.removeReferenceWrapper();
494
1/2
✓ Branch 7 → 8 taken 69 times.
✗ Branch 7 → 42 not taken.
69 rhsSTy = rhsSTy.removeReferenceWrapper();
495
496 // Handle operator overloads
497
3/4
✓ Branch 8 → 9 taken 69 times.
✗ Branch 8 → 61 not taken.
✓ Branch 9 → 10 taken 4 times.
✓ Branch 9 → 18 taken 65 times.
69 if (callsOverloadedOpFct(node, opIdx))
498 4 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
499
500
2/4
✓ Branch 18 → 19 taken 65 times.
✗ Branch 18 → 61 not taken.
✓ Branch 19 → 20 taken 65 times.
✗ Branch 19 → 25 not taken.
65 switch (getTypeCombination(lhsSTy, rhsSTy)) {
501 65 case COMB(TY_INT, TY_INT): // fallthrough
502 case COMB(TY_SHORT, TY_SHORT): // fallthrough
503 case COMB(TY_LONG, TY_LONG): // fallthrough
504 case COMB(TY_BYTE, TY_BYTE): // fallthrough
505 case COMB(TY_BOOL, TY_BOOL):
506
4/8
✓ Branch 20 → 21 taken 65 times.
✗ Branch 20 → 51 not taken.
✓ Branch 21 → 22 taken 65 times.
✗ Branch 21 → 51 not taken.
✓ Branch 22 → 23 taken 65 times.
✗ Branch 22 → 51 not taken.
✓ Branch 23 → 24 taken 65 times.
✗ Branch 23 → 51 not taken.
65 return {.value = builder.CreateAnd(lhsV(), rhsV())};
507 default: // GCOV_EXCL_LINE
508 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: &"); // GCOV_EXCL_LINE
509 }
510
5/14
✓ Branch 10 → 11 taken 4 times.
✗ Branch 10 → 45 not taken.
✓ Branch 11 → 12 taken 4 times.
✗ Branch 11 → 45 not taken.
✓ Branch 12 → 13 taken 4 times.
✗ Branch 12 → 45 not taken.
✓ Branch 13 → 14 taken 4 times.
✗ Branch 13 → 45 not taken.
✓ Branch 14 → 15 taken 4 times.
✗ Branch 14 → 43 not taken.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 49 not taken.
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 49 not taken.
73 }
511
512 13274 LLVMExprResult OpRuleConversionManager::getEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
513 LLVMExprResult &rhs, QualType rhsSTy) {
514
1/2
✓ Branch 2 → 3 taken 13274 times.
✗ Branch 2 → 223 not taken.
25191 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
515
1/2
✓ Branch 3 → 4 taken 13274 times.
✗ Branch 3 → 224 not taken.
25575 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
516 14631 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
517 14247 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
518
1/2
✓ Branch 6 → 7 taken 13274 times.
✗ Branch 6 → 225 not taken.
13274 lhsSTy = lhsSTy.removeReferenceWrapper();
519
1/2
✓ Branch 7 → 8 taken 13274 times.
✗ Branch 7 → 226 not taken.
13274 rhsSTy = rhsSTy.removeReferenceWrapper();
520
1/2
✓ Branch 8 → 9 taken 13274 times.
✗ Branch 8 → 289 not taken.
13274 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
521
1/2
✓ Branch 9 → 10 taken 13274 times.
✗ Branch 9 → 289 not taken.
13274 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
522
523 // Handle operator overloads
524
3/4
✓ Branch 10 → 11 taken 13274 times.
✗ Branch 10 → 289 not taken.
✓ Branch 11 → 12 taken 1262 times.
✓ Branch 11 → 20 taken 12012 times.
13274 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
525 1262 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
526
527 // Check if lhs is of type pointer and rhs is of type long
528
7/8
✓ Branch 21 → 22 taken 2821 times.
✓ Branch 21 → 25 taken 9191 times.
✓ Branch 22 → 23 taken 2821 times.
✗ Branch 22 → 289 not taken.
✓ Branch 23 → 24 taken 1 time.
✓ Branch 23 → 25 taken 2820 times.
✓ Branch 26 → 27 taken 1 time.
✓ Branch 26 → 34 taken 12011 times.
12012 if (lhsT->isPointerTy() && rhsT->isIntegerTy(64)) {
529
4/8
✓ Branch 27 → 28 taken 1 time.
✗ Branch 27 → 235 not taken.
✓ Branch 28 → 29 taken 1 time.
✗ Branch 28 → 235 not taken.
✓ Branch 29 → 30 taken 1 time.
✗ Branch 29 → 235 not taken.
✓ Branch 30 → 31 taken 1 time.
✗ Branch 30 → 236 not taken.
1 llvm::Value *lhsInt = builder.CreatePtrToInt(lhsV(), rhsT);
530
3/6
✓ Branch 30 → 31 taken 1 time.
✗ Branch 30 → 236 not taken.
✓ Branch 31 → 32 taken 1 time.
✗ Branch 31 → 236 not taken.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 236 not taken.
1 return {.value = builder.CreateICmpEQ(lhsInt, rhsV())};
531 }
532
533 // Check if one value is a string and the other one is a char*
534
11/18
✓ Branch 34 → 35 taken 12011 times.
✗ Branch 34 → 289 not taken.
✓ Branch 35 → 36 taken 339 times.
✓ Branch 35 → 38 taken 11672 times.
✓ Branch 36 → 37 taken 339 times.
✗ Branch 36 → 289 not taken.
✓ Branch 37 → 38 taken 339 times.
✗ Branch 37 → 42 not taken.
✓ Branch 38 → 39 taken 12011 times.
✗ Branch 38 → 289 not taken.
✓ Branch 39 → 40 taken 1314 times.
✓ Branch 39 → 43 taken 10697 times.
✓ Branch 40 → 41 taken 1314 times.
✗ Branch 40 → 289 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 1314 times.
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 53 taken 12011 times.
12011 if ((lhsSTy.is(TY_STRING) && rhsSTy.isPtrTo(TY_CHAR)) || (lhsSTy.isPtrTo(TY_CHAR) && rhsSTy.is(TY_STRING))) {
535 // Generate call to the function isRawEqual(string, string) of the string std
536 llvm::Function *opFct = stdFunctionManager.getStringIsRawEqualStringStringFct();
537 llvm::Value *result = builder.CreateCall(opFct, {lhsV(), rhsV()});
538 return {.value = result};
539 }
540
541 // Check for primitive type combinations
542
23/25
✓ Branch 53 → 54 taken 12011 times.
✗ Branch 53 → 289 not taken.
✓ Branch 54 → 55 taken 126 times.
✓ Branch 54 → 60 taken 3 times.
✓ Branch 54 → 66 taken 19 times.
✓ Branch 54 → 72 taken 1573 times.
✓ Branch 54 → 77 taken 1 time.
✓ Branch 54 → 85 taken 1 time.
✓ Branch 54 → 93 taken 1 time.
✓ Branch 54 → 101 taken 1 time.
✓ Branch 54 → 107 taken 8 times.
✓ Branch 54 → 115 taken 109 times.
✓ Branch 54 → 120 taken 1 time.
✓ Branch 54 → 128 taken 1 time.
✓ Branch 54 → 136 taken 1 time.
✓ Branch 54 → 142 taken 472 times.
✓ Branch 54 → 150 taken 5179 times.
✓ Branch 54 → 155 taken 1 time.
✓ Branch 54 → 163 taken 78 times.
✓ Branch 54 → 168 taken 33 times.
✓ Branch 54 → 176 taken 1342 times.
✓ Branch 54 → 181 taken 339 times.
✓ Branch 54 → 189 taken 241 times.
✓ Branch 54 → 204 taken 2481 times.
✗ Branch 54 → 209 not taken.
12011 switch (getTypeCombination(lhsSTy, rhsSTy)) {
543 126 case COMB(TY_DOUBLE, TY_DOUBLE):
544
4/8
✓ Branch 55 → 56 taken 126 times.
✗ Branch 55 → 241 not taken.
✓ Branch 56 → 57 taken 126 times.
✗ Branch 56 → 241 not taken.
✓ Branch 57 → 58 taken 126 times.
✗ Branch 57 → 241 not taken.
✓ Branch 58 → 59 taken 126 times.
✗ Branch 58 → 241 not taken.
126 return {.value = builder.CreateFCmpOEQ(lhsV(), rhsV())};
545 3 case COMB(TY_DOUBLE, TY_INT): // fallthrough
546 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
547 case COMB(TY_DOUBLE, TY_LONG): {
548
2/4
✓ Branch 60 → 61 taken 3 times.
✗ Branch 60 → 289 not taken.
✓ Branch 61 → 62 taken 3 times.
✗ Branch 61 → 289 not taken.
3 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
549
3/6
✓ Branch 62 → 63 taken 3 times.
✗ Branch 62 → 242 not taken.
✓ Branch 63 → 64 taken 3 times.
✗ Branch 63 → 242 not taken.
✓ Branch 64 → 65 taken 3 times.
✗ Branch 64 → 242 not taken.
3 return {.value = builder.CreateFCmpOEQ(lhsV(), rhsFP)};
550 }
551 19 case COMB(TY_INT, TY_DOUBLE): {
552
2/4
✓ Branch 66 → 67 taken 19 times.
✗ Branch 66 → 289 not taken.
✓ Branch 67 → 68 taken 19 times.
✗ Branch 67 → 289 not taken.
19 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
553
3/6
✓ Branch 68 → 69 taken 19 times.
✗ Branch 68 → 243 not taken.
✓ Branch 69 → 70 taken 19 times.
✗ Branch 69 → 243 not taken.
✓ Branch 70 → 71 taken 19 times.
✗ Branch 70 → 243 not taken.
19 return {.value = builder.CreateFCmpOEQ(lhsFP, rhsV())};
554 }
555 1573 case COMB(TY_INT, TY_INT):
556
4/8
✓ Branch 72 → 73 taken 1573 times.
✗ Branch 72 → 244 not taken.
✓ Branch 73 → 74 taken 1573 times.
✗ Branch 73 → 244 not taken.
✓ Branch 74 → 75 taken 1573 times.
✗ Branch 74 → 244 not taken.
✓ Branch 75 → 76 taken 1573 times.
✗ Branch 75 → 244 not taken.
1573 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
557 1 case COMB(TY_INT, TY_SHORT): {
558
5/10
✓ Branch 77 → 78 taken 1 time.
✗ Branch 77 → 245 not taken.
✓ Branch 78 → 79 taken 1 time.
✗ Branch 78 → 245 not taken.
✓ Branch 79 → 80 taken 1 time.
✗ Branch 79 → 245 not taken.
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 245 not taken.
✓ Branch 81 → 82 taken 1 time.
✗ Branch 81 → 246 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
559
3/6
✓ Branch 81 → 82 taken 1 time.
✗ Branch 81 → 246 not taken.
✓ Branch 82 → 83 taken 1 time.
✗ Branch 82 → 246 not taken.
✓ Branch 83 → 84 taken 1 time.
✗ Branch 83 → 246 not taken.
1 return {.value = builder.CreateICmpEQ(lhsV(), rhsInt)};
560 }
561 1 case COMB(TY_INT, TY_LONG): {
562
5/10
✓ Branch 85 → 86 taken 1 time.
✗ Branch 85 → 247 not taken.
✓ Branch 86 → 87 taken 1 time.
✗ Branch 86 → 247 not taken.
✓ Branch 87 → 88 taken 1 time.
✗ Branch 87 → 247 not taken.
✓ Branch 88 → 89 taken 1 time.
✗ Branch 88 → 247 not taken.
✓ Branch 89 → 90 taken 1 time.
✗ Branch 89 → 248 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
563
3/6
✓ Branch 89 → 90 taken 1 time.
✗ Branch 89 → 248 not taken.
✓ Branch 90 → 91 taken 1 time.
✗ Branch 90 → 248 not taken.
✓ Branch 91 → 92 taken 1 time.
✗ Branch 91 → 248 not taken.
1 return {.value = builder.CreateICmpEQ(lhsLong, rhsV())};
564 }
565 1 case COMB(TY_INT, TY_CHAR): {
566
5/10
✓ Branch 93 → 94 taken 1 time.
✗ Branch 93 → 249 not taken.
✓ Branch 94 → 95 taken 1 time.
✗ Branch 94 → 249 not taken.
✓ Branch 95 → 96 taken 1 time.
✗ Branch 95 → 249 not taken.
✓ Branch 96 → 97 taken 1 time.
✗ Branch 96 → 249 not taken.
✓ Branch 97 → 98 taken 1 time.
✗ Branch 97 → 250 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
567
3/6
✓ Branch 97 → 98 taken 1 time.
✗ Branch 97 → 250 not taken.
✓ Branch 98 → 99 taken 1 time.
✗ Branch 98 → 250 not taken.
✓ Branch 99 → 100 taken 1 time.
✗ Branch 99 → 250 not taken.
1 return {.value = builder.CreateICmpEQ(lhsV(), rhsInt)};
568 }
569 1 case COMB(TY_SHORT, TY_DOUBLE): {
570
2/4
✓ Branch 101 → 102 taken 1 time.
✗ Branch 101 → 289 not taken.
✓ Branch 102 → 103 taken 1 time.
✗ Branch 102 → 289 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
571
3/6
✓ Branch 103 → 104 taken 1 time.
✗ Branch 103 → 251 not taken.
✓ Branch 104 → 105 taken 1 time.
✗ Branch 104 → 251 not taken.
✓ Branch 105 → 106 taken 1 time.
✗ Branch 105 → 251 not taken.
1 return {.value = builder.CreateFCmpOEQ(lhsFP, rhsV())};
572 }
573 8 case COMB(TY_SHORT, TY_INT): {
574
5/10
✓ Branch 107 → 108 taken 8 times.
✗ Branch 107 → 252 not taken.
✓ Branch 108 → 109 taken 8 times.
✗ Branch 108 → 252 not taken.
✓ Branch 109 → 110 taken 8 times.
✗ Branch 109 → 252 not taken.
✓ Branch 110 → 111 taken 8 times.
✗ Branch 110 → 252 not taken.
✓ Branch 111 → 112 taken 8 times.
✗ Branch 111 → 253 not taken.
8 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
575
3/6
✓ Branch 111 → 112 taken 8 times.
✗ Branch 111 → 253 not taken.
✓ Branch 112 → 113 taken 8 times.
✗ Branch 112 → 253 not taken.
✓ Branch 113 → 114 taken 8 times.
✗ Branch 113 → 253 not taken.
8 return {.value = builder.CreateICmpEQ(lhsInt, rhsV())};
576 }
577 109 case COMB(TY_SHORT, TY_SHORT):
578
4/8
✓ Branch 115 → 116 taken 109 times.
✗ Branch 115 → 254 not taken.
✓ Branch 116 → 117 taken 109 times.
✗ Branch 116 → 254 not taken.
✓ Branch 117 → 118 taken 109 times.
✗ Branch 117 → 254 not taken.
✓ Branch 118 → 119 taken 109 times.
✗ Branch 118 → 254 not taken.
109 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
579 1 case COMB(TY_SHORT, TY_LONG): {
580
5/10
✓ Branch 120 → 121 taken 1 time.
✗ Branch 120 → 255 not taken.
✓ Branch 121 → 122 taken 1 time.
✗ Branch 121 → 255 not taken.
✓ Branch 122 → 123 taken 1 time.
✗ Branch 122 → 255 not taken.
✓ Branch 123 → 124 taken 1 time.
✗ Branch 123 → 255 not taken.
✓ Branch 124 → 125 taken 1 time.
✗ Branch 124 → 256 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
581
3/6
✓ Branch 124 → 125 taken 1 time.
✗ Branch 124 → 256 not taken.
✓ Branch 125 → 126 taken 1 time.
✗ Branch 125 → 256 not taken.
✓ Branch 126 → 127 taken 1 time.
✗ Branch 126 → 256 not taken.
1 return {.value = builder.CreateICmpEQ(lhsLong, rhsV())};
582 }
583 1 case COMB(TY_SHORT, TY_CHAR): {
584
5/10
✓ Branch 128 → 129 taken 1 time.
✗ Branch 128 → 257 not taken.
✓ Branch 129 → 130 taken 1 time.
✗ Branch 129 → 257 not taken.
✓ Branch 130 → 131 taken 1 time.
✗ Branch 130 → 257 not taken.
✓ Branch 131 → 132 taken 1 time.
✗ Branch 131 → 257 not taken.
✓ Branch 132 → 133 taken 1 time.
✗ Branch 132 → 258 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
585
3/6
✓ Branch 132 → 133 taken 1 time.
✗ Branch 132 → 258 not taken.
✓ Branch 133 → 134 taken 1 time.
✗ Branch 133 → 258 not taken.
✓ Branch 134 → 135 taken 1 time.
✗ Branch 134 → 258 not taken.
1 return {.value = builder.CreateICmpEQ(lhsV(), rhsShort)};
586 }
587 1 case COMB(TY_LONG, TY_DOUBLE): {
588
2/4
✓ Branch 136 → 137 taken 1 time.
✗ Branch 136 → 289 not taken.
✓ Branch 137 → 138 taken 1 time.
✗ Branch 137 → 289 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
589
3/6
✓ Branch 138 → 139 taken 1 time.
✗ Branch 138 → 259 not taken.
✓ Branch 139 → 140 taken 1 time.
✗ Branch 139 → 259 not taken.
✓ Branch 140 → 141 taken 1 time.
✗ Branch 140 → 259 not taken.
1 return {.value = builder.CreateFCmpOEQ(lhsFP, rhsV())};
590 }
591 472 case COMB(TY_LONG, TY_INT): // fallthrough
592 case COMB(TY_LONG, TY_SHORT): {
593
5/10
✓ Branch 142 → 143 taken 472 times.
✗ Branch 142 → 260 not taken.
✓ Branch 143 → 144 taken 472 times.
✗ Branch 143 → 260 not taken.
✓ Branch 144 → 145 taken 472 times.
✗ Branch 144 → 260 not taken.
✓ Branch 145 → 146 taken 472 times.
✗ Branch 145 → 260 not taken.
✓ Branch 146 → 147 taken 472 times.
✗ Branch 146 → 261 not taken.
472 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
594
3/6
✓ Branch 146 → 147 taken 472 times.
✗ Branch 146 → 261 not taken.
✓ Branch 147 → 148 taken 472 times.
✗ Branch 147 → 261 not taken.
✓ Branch 148 → 149 taken 472 times.
✗ Branch 148 → 261 not taken.
472 return {.value = builder.CreateICmpEQ(lhsV(), rhsLong)};
595 }
596 5179 case COMB(TY_LONG, TY_LONG):
597
4/8
✓ Branch 150 → 151 taken 5179 times.
✗ Branch 150 → 262 not taken.
✓ Branch 151 → 152 taken 5179 times.
✗ Branch 151 → 262 not taken.
✓ Branch 152 → 153 taken 5179 times.
✗ Branch 152 → 262 not taken.
✓ Branch 153 → 154 taken 5179 times.
✗ Branch 153 → 262 not taken.
5179 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
598 1 case COMB(TY_LONG, TY_CHAR): {
599
5/10
✓ Branch 155 → 156 taken 1 time.
✗ Branch 155 → 263 not taken.
✓ Branch 156 → 157 taken 1 time.
✗ Branch 156 → 263 not taken.
✓ Branch 157 → 158 taken 1 time.
✗ Branch 157 → 263 not taken.
✓ Branch 158 → 159 taken 1 time.
✗ Branch 158 → 263 not taken.
✓ Branch 159 → 160 taken 1 time.
✗ Branch 159 → 264 not taken.
1 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
600
3/6
✓ Branch 159 → 160 taken 1 time.
✗ Branch 159 → 264 not taken.
✓ Branch 160 → 161 taken 1 time.
✗ Branch 160 → 264 not taken.
✓ Branch 161 → 162 taken 1 time.
✗ Branch 161 → 264 not taken.
1 return {.value = builder.CreateICmpEQ(lhsV(), rhsLong)};
601 }
602 78 case COMB(TY_BYTE, TY_BYTE):
603
4/8
✓ Branch 163 → 164 taken 78 times.
✗ Branch 163 → 265 not taken.
✓ Branch 164 → 165 taken 78 times.
✗ Branch 164 → 265 not taken.
✓ Branch 165 → 166 taken 78 times.
✗ Branch 165 → 265 not taken.
✓ Branch 166 → 167 taken 78 times.
✗ Branch 166 → 265 not taken.
78 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
604 33 case COMB(TY_CHAR, TY_INT): // fallthrough
605 case COMB(TY_CHAR, TY_SHORT): // fallthrough
606 case COMB(TY_CHAR, TY_LONG): {
607
5/10
✓ Branch 168 → 169 taken 33 times.
✗ Branch 168 → 266 not taken.
✓ Branch 169 → 170 taken 33 times.
✗ Branch 169 → 266 not taken.
✓ Branch 170 → 171 taken 33 times.
✗ Branch 170 → 266 not taken.
✓ Branch 171 → 172 taken 33 times.
✗ Branch 171 → 266 not taken.
✓ Branch 172 → 173 taken 33 times.
✗ Branch 172 → 267 not taken.
33 llvm::Value *lhsCasted = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
608
3/6
✓ Branch 172 → 173 taken 33 times.
✗ Branch 172 → 267 not taken.
✓ Branch 173 → 174 taken 33 times.
✗ Branch 173 → 267 not taken.
✓ Branch 174 → 175 taken 33 times.
✗ Branch 174 → 267 not taken.
33 return {.value = builder.CreateICmpEQ(lhsCasted, rhsV())};
609 }
610 1342 case COMB(TY_CHAR, TY_CHAR):
611
4/8
✓ Branch 176 → 177 taken 1342 times.
✗ Branch 176 → 268 not taken.
✓ Branch 177 → 178 taken 1342 times.
✗ Branch 177 → 268 not taken.
✓ Branch 178 → 179 taken 1342 times.
✗ Branch 178 → 268 not taken.
✓ Branch 179 → 180 taken 1342 times.
✗ Branch 179 → 268 not taken.
1342 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
612 339 case COMB(TY_STRING, TY_STRING): {
613 // Generate call to the function isRawEqual(string, string) of the string std
614
1/2
✓ Branch 181 → 182 taken 339 times.
✗ Branch 181 → 289 not taken.
339 llvm::Function *opFct = stdFunctionManager.getStringIsRawEqualStringStringFct();
615
5/10
✓ Branch 182 → 183 taken 339 times.
✗ Branch 182 → 272 not taken.
✓ Branch 183 → 184 taken 339 times.
✗ Branch 183 → 270 not taken.
✓ Branch 184 → 185 taken 339 times.
✗ Branch 184 → 270 not taken.
✓ Branch 186 → 187 taken 339 times.
✗ Branch 186 → 269 not taken.
✓ Branch 187 → 188 taken 339 times.
✗ Branch 187 → 269 not taken.
339 llvm::Value *result = builder.CreateCall(opFct, {lhsV(), rhsV()});
616 339 return {.value = result};
617 }
618 241 case COMB(TY_BOOL, TY_BOOL): // fallthrough
619 case COMB(TY_FUNCTION, TY_FUNCTION): // fallthrough
620 case COMB(TY_PROCEDURE, TY_PROCEDURE): {
621
2/4
✓ Branch 190 → 191 taken 241 times.
✗ Branch 190 → 273 not taken.
✓ Branch 191 → 192 taken 241 times.
✗ Branch 191 → 273 not taken.
241 const uint64_t typeSize = irGenerator->module->getDataLayout().getTypeSizeInBits(lhsT) / 8;
622
1/2
✓ Branch 192 → 193 taken 241 times.
✗ Branch 192 → 289 not taken.
241 llvm::Function *memcmpFct = stdFunctionManager.getMemcmpFct();
623
7/14
✓ Branch 193 → 194 taken 241 times.
✗ Branch 193 → 277 not taken.
✓ Branch 194 → 195 taken 241 times.
✗ Branch 194 → 275 not taken.
✓ Branch 195 → 196 taken 241 times.
✗ Branch 195 → 275 not taken.
✓ Branch 196 → 197 taken 241 times.
✗ Branch 196 → 275 not taken.
✓ Branch 198 → 199 taken 241 times.
✗ Branch 198 → 274 not taken.
✓ Branch 199 → 200 taken 241 times.
✗ Branch 199 → 274 not taken.
✓ Branch 200 → 201 taken 241 times.
✗ Branch 200 → 278 not taken.
241 llvm::Value *memcmpResult = builder.CreateCall(memcmpFct, {lhsP(), rhsP(), builder.getInt64(typeSize)});
624
3/6
✓ Branch 200 → 201 taken 241 times.
✗ Branch 200 → 278 not taken.
✓ Branch 201 → 202 taken 241 times.
✗ Branch 201 → 278 not taken.
✓ Branch 202 → 203 taken 241 times.
✗ Branch 202 → 278 not taken.
241 return {.value = builder.CreateICmpEQ(memcmpResult, builder.getInt32(0))};
625 }
626 2481 case COMB(TY_PTR, TY_PTR):
627
4/8
✓ Branch 204 → 205 taken 2481 times.
✗ Branch 204 → 279 not taken.
✓ Branch 205 → 206 taken 2481 times.
✗ Branch 205 → 279 not taken.
✓ Branch 206 → 207 taken 2481 times.
✗ Branch 206 → 279 not taken.
✓ Branch 207 → 208 taken 2481 times.
✗ Branch 207 → 279 not taken.
2481 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
628 default: // GCOV_EXCL_LINE
629 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: =="); // GCOV_EXCL_LINE
630 }
631
5/14
✓ Branch 12 → 13 taken 1262 times.
✗ Branch 12 → 229 not taken.
✓ Branch 13 → 14 taken 1262 times.
✗ Branch 13 → 229 not taken.
✓ Branch 14 → 15 taken 1262 times.
✗ Branch 14 → 229 not taken.
✓ Branch 15 → 16 taken 1262 times.
✗ Branch 15 → 229 not taken.
✓ Branch 16 → 17 taken 1262 times.
✗ Branch 16 → 227 not taken.
✗ Branch 229 → 230 not taken.
✗ Branch 229 → 233 not taken.
✗ Branch 231 → 232 not taken.
✗ Branch 231 → 233 not taken.
14536 }
632
633 3457 LLVMExprResult OpRuleConversionManager::getNotEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
634 LLVMExprResult &rhs, QualType rhsSTy) {
635
1/2
✓ Branch 2 → 3 taken 3457 times.
✗ Branch 2 → 227 not taken.
6791 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
636
1/2
✓ Branch 3 → 4 taken 3457 times.
✗ Branch 3 → 228 not taken.
6791 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
637 3580 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
638 3580 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
639
1/2
✓ Branch 6 → 7 taken 3457 times.
✗ Branch 6 → 229 not taken.
3457 lhsSTy = lhsSTy.removeReferenceWrapper();
640
1/2
✓ Branch 7 → 8 taken 3457 times.
✗ Branch 7 → 230 not taken.
3457 rhsSTy = rhsSTy.removeReferenceWrapper();
641
1/2
✓ Branch 8 → 9 taken 3457 times.
✗ Branch 8 → 295 not taken.
3457 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
642
1/2
✓ Branch 9 → 10 taken 3457 times.
✗ Branch 9 → 295 not taken.
3457 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
643
644 // Handle operator overloads
645
3/4
✓ Branch 10 → 11 taken 3457 times.
✗ Branch 10 → 295 not taken.
✓ Branch 11 → 12 taken 71 times.
✓ Branch 11 → 20 taken 3386 times.
3457 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
646 71 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
647
648 // Check if lhs is of type pointer and rhs is of type long
649
7/8
✓ Branch 21 → 22 taken 749 times.
✓ Branch 21 → 25 taken 2637 times.
✓ Branch 22 → 23 taken 749 times.
✗ Branch 22 → 295 not taken.
✓ Branch 23 → 24 taken 1 time.
✓ Branch 23 → 25 taken 748 times.
✓ Branch 26 → 27 taken 1 time.
✓ Branch 26 → 34 taken 3385 times.
3386 if (lhsT->isPointerTy() && rhsT->isIntegerTy(64)) {
650
4/8
✓ Branch 27 → 28 taken 1 time.
✗ Branch 27 → 239 not taken.
✓ Branch 28 → 29 taken 1 time.
✗ Branch 28 → 239 not taken.
✓ Branch 29 → 30 taken 1 time.
✗ Branch 29 → 239 not taken.
✓ Branch 30 → 31 taken 1 time.
✗ Branch 30 → 240 not taken.
1 llvm::Value *lhsInt = builder.CreatePtrToInt(lhsV(), rhsT);
651
3/6
✓ Branch 30 → 31 taken 1 time.
✗ Branch 30 → 240 not taken.
✓ Branch 31 → 32 taken 1 time.
✗ Branch 31 → 240 not taken.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 240 not taken.
1 return {.value = builder.CreateICmpNE(lhsInt, rhsV())};
652 }
653
654 // Check if one value is a string and the other one is a char*
655
13/18
✓ Branch 34 → 35 taken 3385 times.
✗ Branch 34 → 295 not taken.
✓ Branch 35 → 36 taken 16 times.
✓ Branch 35 → 38 taken 3369 times.
✓ Branch 36 → 37 taken 16 times.
✗ Branch 36 → 295 not taken.
✓ Branch 37 → 38 taken 16 times.
✗ Branch 37 → 42 not taken.
✓ Branch 38 → 39 taken 3385 times.
✗ Branch 38 → 295 not taken.
✓ Branch 39 → 40 taken 169 times.
✓ Branch 39 → 43 taken 3216 times.
✓ Branch 40 → 41 taken 169 times.
✗ Branch 40 → 295 not taken.
✓ Branch 41 → 42 taken 23 times.
✓ Branch 41 → 43 taken 146 times.
✓ Branch 44 → 45 taken 23 times.
✓ Branch 44 → 55 taken 3362 times.
3385 if ((lhsSTy.is(TY_STRING) && rhsSTy.isPtrTo(TY_CHAR)) || (lhsSTy.isPtrTo(TY_CHAR) && rhsSTy.is(TY_STRING))) {
656 // Generate call to the function isRawEqual(string, string) of the string std
657
1/2
✓ Branch 45 → 46 taken 23 times.
✗ Branch 45 → 295 not taken.
23 llvm::Function *opFct = stdFunctionManager.getStringIsRawEqualStringStringFct();
658
6/12
✓ Branch 46 → 47 taken 23 times.
✗ Branch 46 → 244 not taken.
✓ Branch 47 → 48 taken 23 times.
✗ Branch 47 → 242 not taken.
✓ Branch 48 → 49 taken 23 times.
✗ Branch 48 → 242 not taken.
✓ Branch 50 → 51 taken 23 times.
✗ Branch 50 → 241 not taken.
✓ Branch 51 → 52 taken 23 times.
✗ Branch 51 → 241 not taken.
✓ Branch 52 → 53 taken 23 times.
✗ Branch 52 → 245 not taken.
23 llvm::Value *result = builder.CreateCall(opFct, {lhsV(), rhsV()});
659 // Negate the result
660
2/4
✓ Branch 52 → 53 taken 23 times.
✗ Branch 52 → 245 not taken.
✓ Branch 53 → 54 taken 23 times.
✗ Branch 53 → 245 not taken.
23 return {.value = builder.CreateNot(result)};
661 }
662
663
23/25
✓ Branch 55 → 56 taken 3362 times.
✗ Branch 55 → 295 not taken.
✓ Branch 56 → 57 taken 56 times.
✓ Branch 56 → 62 taken 3 times.
✓ Branch 56 → 68 taken 1 time.
✓ Branch 56 → 74 taken 357 times.
✓ Branch 56 → 79 taken 1 time.
✓ Branch 56 → 87 taken 9 times.
✓ Branch 56 → 95 taken 1 time.
✓ Branch 56 → 103 taken 1 time.
✓ Branch 56 → 109 taken 1 time.
✓ Branch 56 → 117 taken 2 times.
✓ Branch 56 → 122 taken 1 time.
✓ Branch 56 → 130 taken 1 time.
✓ Branch 56 → 138 taken 1 time.
✓ Branch 56 → 144 taken 9 times.
✓ Branch 56 → 152 taken 1021 times.
✓ Branch 56 → 157 taken 1 time.
✓ Branch 56 → 165 taken 1 time.
✓ Branch 56 → 170 taken 18 times.
✓ Branch 56 → 178 taken 1100 times.
✓ Branch 56 → 183 taken 16 times.
✓ Branch 56 → 193 taken 52 times.
✓ Branch 56 → 208 taken 709 times.
✗ Branch 56 → 213 not taken.
3362 switch (getTypeCombination(lhsSTy, rhsSTy)) {
664 56 case COMB(TY_DOUBLE, TY_DOUBLE):
665
4/8
✓ Branch 57 → 58 taken 56 times.
✗ Branch 57 → 246 not taken.
✓ Branch 58 → 59 taken 56 times.
✗ Branch 58 → 246 not taken.
✓ Branch 59 → 60 taken 56 times.
✗ Branch 59 → 246 not taken.
✓ Branch 60 → 61 taken 56 times.
✗ Branch 60 → 246 not taken.
56 return {.value = builder.CreateFCmpONE(lhsV(), rhsV())};
666 3 case COMB(TY_DOUBLE, TY_INT): // fallthrough
667 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
668 case COMB(TY_DOUBLE, TY_LONG): {
669
2/4
✓ Branch 62 → 63 taken 3 times.
✗ Branch 62 → 295 not taken.
✓ Branch 63 → 64 taken 3 times.
✗ Branch 63 → 295 not taken.
3 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
670
3/6
✓ Branch 64 → 65 taken 3 times.
✗ Branch 64 → 247 not taken.
✓ Branch 65 → 66 taken 3 times.
✗ Branch 65 → 247 not taken.
✓ Branch 66 → 67 taken 3 times.
✗ Branch 66 → 247 not taken.
3 return {.value = builder.CreateFCmpONE(lhsV(), rhsFP)};
671 }
672 1 case COMB(TY_INT, TY_DOUBLE): {
673
2/4
✓ Branch 68 → 69 taken 1 time.
✗ Branch 68 → 295 not taken.
✓ Branch 69 → 70 taken 1 time.
✗ Branch 69 → 295 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
674
3/6
✓ Branch 70 → 71 taken 1 time.
✗ Branch 70 → 248 not taken.
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 248 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 248 not taken.
1 return {.value = builder.CreateFCmpONE(lhsFP, rhsV())};
675 }
676 357 case COMB(TY_INT, TY_INT):
677
4/8
✓ Branch 74 → 75 taken 357 times.
✗ Branch 74 → 249 not taken.
✓ Branch 75 → 76 taken 357 times.
✗ Branch 75 → 249 not taken.
✓ Branch 76 → 77 taken 357 times.
✗ Branch 76 → 249 not taken.
✓ Branch 77 → 78 taken 357 times.
✗ Branch 77 → 249 not taken.
357 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
678 1 case COMB(TY_INT, TY_SHORT): {
679
5/10
✓ Branch 79 → 80 taken 1 time.
✗ Branch 79 → 250 not taken.
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 250 not taken.
✓ Branch 81 → 82 taken 1 time.
✗ Branch 81 → 250 not taken.
✓ Branch 82 → 83 taken 1 time.
✗ Branch 82 → 250 not taken.
✓ Branch 83 → 84 taken 1 time.
✗ Branch 83 → 251 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
680
3/6
✓ Branch 83 → 84 taken 1 time.
✗ Branch 83 → 251 not taken.
✓ Branch 84 → 85 taken 1 time.
✗ Branch 84 → 251 not taken.
✓ Branch 85 → 86 taken 1 time.
✗ Branch 85 → 251 not taken.
1 return {.value = builder.CreateICmpNE(lhsV(), rhsInt)};
681 }
682 9 case COMB(TY_INT, TY_LONG): {
683
5/10
✓ Branch 87 → 88 taken 9 times.
✗ Branch 87 → 252 not taken.
✓ Branch 88 → 89 taken 9 times.
✗ Branch 88 → 252 not taken.
✓ Branch 89 → 90 taken 9 times.
✗ Branch 89 → 252 not taken.
✓ Branch 90 → 91 taken 9 times.
✗ Branch 90 → 252 not taken.
✓ Branch 91 → 92 taken 9 times.
✗ Branch 91 → 253 not taken.
9 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
684
3/6
✓ Branch 91 → 92 taken 9 times.
✗ Branch 91 → 253 not taken.
✓ Branch 92 → 93 taken 9 times.
✗ Branch 92 → 253 not taken.
✓ Branch 93 → 94 taken 9 times.
✗ Branch 93 → 253 not taken.
9 return {.value = builder.CreateICmpNE(lhsLong, rhsV())};
685 }
686 1 case COMB(TY_INT, TY_CHAR): {
687
5/10
✓ Branch 95 → 96 taken 1 time.
✗ Branch 95 → 254 not taken.
✓ Branch 96 → 97 taken 1 time.
✗ Branch 96 → 254 not taken.
✓ Branch 97 → 98 taken 1 time.
✗ Branch 97 → 254 not taken.
✓ Branch 98 → 99 taken 1 time.
✗ Branch 98 → 254 not taken.
✓ Branch 99 → 100 taken 1 time.
✗ Branch 99 → 255 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
688
3/6
✓ Branch 99 → 100 taken 1 time.
✗ Branch 99 → 255 not taken.
✓ Branch 100 → 101 taken 1 time.
✗ Branch 100 → 255 not taken.
✓ Branch 101 → 102 taken 1 time.
✗ Branch 101 → 255 not taken.
1 return {.value = builder.CreateICmpNE(lhsV(), rhsInt)};
689 }
690 1 case COMB(TY_SHORT, TY_DOUBLE): {
691
2/4
✓ Branch 103 → 104 taken 1 time.
✗ Branch 103 → 295 not taken.
✓ Branch 104 → 105 taken 1 time.
✗ Branch 104 → 295 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
692
3/6
✓ Branch 105 → 106 taken 1 time.
✗ Branch 105 → 256 not taken.
✓ Branch 106 → 107 taken 1 time.
✗ Branch 106 → 256 not taken.
✓ Branch 107 → 108 taken 1 time.
✗ Branch 107 → 256 not taken.
1 return {.value = builder.CreateFCmpONE(lhsFP, rhsV())};
693 }
694 1 case COMB(TY_SHORT, TY_INT): {
695
5/10
✓ Branch 109 → 110 taken 1 time.
✗ Branch 109 → 257 not taken.
✓ Branch 110 → 111 taken 1 time.
✗ Branch 110 → 257 not taken.
✓ Branch 111 → 112 taken 1 time.
✗ Branch 111 → 257 not taken.
✓ Branch 112 → 113 taken 1 time.
✗ Branch 112 → 257 not taken.
✓ Branch 113 → 114 taken 1 time.
✗ Branch 113 → 258 not taken.
1 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
696
3/6
✓ Branch 113 → 114 taken 1 time.
✗ Branch 113 → 258 not taken.
✓ Branch 114 → 115 taken 1 time.
✗ Branch 114 → 258 not taken.
✓ Branch 115 → 116 taken 1 time.
✗ Branch 115 → 258 not taken.
1 return {.value = builder.CreateICmpNE(lhsInt, rhsV())};
697 }
698 2 case COMB(TY_SHORT, TY_SHORT):
699
4/8
✓ Branch 117 → 118 taken 2 times.
✗ Branch 117 → 259 not taken.
✓ Branch 118 → 119 taken 2 times.
✗ Branch 118 → 259 not taken.
✓ Branch 119 → 120 taken 2 times.
✗ Branch 119 → 259 not taken.
✓ Branch 120 → 121 taken 2 times.
✗ Branch 120 → 259 not taken.
2 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
700 1 case COMB(TY_SHORT, TY_LONG): {
701
5/10
✓ Branch 122 → 123 taken 1 time.
✗ Branch 122 → 260 not taken.
✓ Branch 123 → 124 taken 1 time.
✗ Branch 123 → 260 not taken.
✓ Branch 124 → 125 taken 1 time.
✗ Branch 124 → 260 not taken.
✓ Branch 125 → 126 taken 1 time.
✗ Branch 125 → 260 not taken.
✓ Branch 126 → 127 taken 1 time.
✗ Branch 126 → 261 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
702
3/6
✓ Branch 126 → 127 taken 1 time.
✗ Branch 126 → 261 not taken.
✓ Branch 127 → 128 taken 1 time.
✗ Branch 127 → 261 not taken.
✓ Branch 128 → 129 taken 1 time.
✗ Branch 128 → 261 not taken.
1 return {.value = builder.CreateICmpNE(lhsLong, rhsV())};
703 }
704 1 case COMB(TY_SHORT, TY_CHAR): {
705
5/10
✓ Branch 130 → 131 taken 1 time.
✗ Branch 130 → 262 not taken.
✓ Branch 131 → 132 taken 1 time.
✗ Branch 131 → 262 not taken.
✓ Branch 132 → 133 taken 1 time.
✗ Branch 132 → 262 not taken.
✓ Branch 133 → 134 taken 1 time.
✗ Branch 133 → 262 not taken.
✓ Branch 134 → 135 taken 1 time.
✗ Branch 134 → 263 not taken.
1 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
706
3/6
✓ Branch 134 → 135 taken 1 time.
✗ Branch 134 → 263 not taken.
✓ Branch 135 → 136 taken 1 time.
✗ Branch 135 → 263 not taken.
✓ Branch 136 → 137 taken 1 time.
✗ Branch 136 → 263 not taken.
1 return {.value = builder.CreateICmpNE(lhsV(), rhsShort)};
707 }
708 1 case COMB(TY_LONG, TY_DOUBLE): {
709
2/4
✓ Branch 138 → 139 taken 1 time.
✗ Branch 138 → 295 not taken.
✓ Branch 139 → 140 taken 1 time.
✗ Branch 139 → 295 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
710
3/6
✓ Branch 140 → 141 taken 1 time.
✗ Branch 140 → 264 not taken.
✓ Branch 141 → 142 taken 1 time.
✗ Branch 141 → 264 not taken.
✓ Branch 142 → 143 taken 1 time.
✗ Branch 142 → 264 not taken.
1 return {.value = builder.CreateFCmpONE(lhsFP, rhsV())};
711 }
712 9 case COMB(TY_LONG, TY_INT): // fallthrough
713 case COMB(TY_LONG, TY_SHORT): {
714
5/10
✓ Branch 144 → 145 taken 9 times.
✗ Branch 144 → 265 not taken.
✓ Branch 145 → 146 taken 9 times.
✗ Branch 145 → 265 not taken.
✓ Branch 146 → 147 taken 9 times.
✗ Branch 146 → 265 not taken.
✓ Branch 147 → 148 taken 9 times.
✗ Branch 147 → 265 not taken.
✓ Branch 148 → 149 taken 9 times.
✗ Branch 148 → 266 not taken.
9 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
715
3/6
✓ Branch 148 → 149 taken 9 times.
✗ Branch 148 → 266 not taken.
✓ Branch 149 → 150 taken 9 times.
✗ Branch 149 → 266 not taken.
✓ Branch 150 → 151 taken 9 times.
✗ Branch 150 → 266 not taken.
9 return {.value = builder.CreateICmpNE(lhsV(), rhsLong)};
716 }
717 1021 case COMB(TY_LONG, TY_LONG):
718
4/8
✓ Branch 152 → 153 taken 1021 times.
✗ Branch 152 → 267 not taken.
✓ Branch 153 → 154 taken 1021 times.
✗ Branch 153 → 267 not taken.
✓ Branch 154 → 155 taken 1021 times.
✗ Branch 154 → 267 not taken.
✓ Branch 155 → 156 taken 1021 times.
✗ Branch 155 → 267 not taken.
1021 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
719 1 case COMB(TY_LONG, TY_CHAR): {
720
5/10
✓ Branch 157 → 158 taken 1 time.
✗ Branch 157 → 268 not taken.
✓ Branch 158 → 159 taken 1 time.
✗ Branch 158 → 268 not taken.
✓ Branch 159 → 160 taken 1 time.
✗ Branch 159 → 268 not taken.
✓ Branch 160 → 161 taken 1 time.
✗ Branch 160 → 268 not taken.
✓ Branch 161 → 162 taken 1 time.
✗ Branch 161 → 269 not taken.
1 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
721
3/6
✓ Branch 161 → 162 taken 1 time.
✗ Branch 161 → 269 not taken.
✓ Branch 162 → 163 taken 1 time.
✗ Branch 162 → 269 not taken.
✓ Branch 163 → 164 taken 1 time.
✗ Branch 163 → 269 not taken.
1 return {.value = builder.CreateICmpNE(lhsV(), rhsLong)};
722 }
723 1 case COMB(TY_BYTE, TY_BYTE):
724
4/8
✓ Branch 165 → 166 taken 1 time.
✗ Branch 165 → 270 not taken.
✓ Branch 166 → 167 taken 1 time.
✗ Branch 166 → 270 not taken.
✓ Branch 167 → 168 taken 1 time.
✗ Branch 167 → 270 not taken.
✓ Branch 168 → 169 taken 1 time.
✗ Branch 168 → 270 not taken.
1 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
725 18 case COMB(TY_CHAR, TY_INT): // fallthrough
726 case COMB(TY_CHAR, TY_SHORT): // fallthrough
727 case COMB(TY_CHAR, TY_LONG): {
728
5/10
✓ Branch 170 → 171 taken 18 times.
✗ Branch 170 → 271 not taken.
✓ Branch 171 → 172 taken 18 times.
✗ Branch 171 → 271 not taken.
✓ Branch 172 → 173 taken 18 times.
✗ Branch 172 → 271 not taken.
✓ Branch 173 → 174 taken 18 times.
✗ Branch 173 → 271 not taken.
✓ Branch 174 → 175 taken 18 times.
✗ Branch 174 → 272 not taken.
18 llvm::Value *lhsCasted = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
729
3/6
✓ Branch 174 → 175 taken 18 times.
✗ Branch 174 → 272 not taken.
✓ Branch 175 → 176 taken 18 times.
✗ Branch 175 → 272 not taken.
✓ Branch 176 → 177 taken 18 times.
✗ Branch 176 → 272 not taken.
18 return {.value = builder.CreateICmpNE(lhsCasted, rhsV())};
730 }
731 1100 case COMB(TY_CHAR, TY_CHAR):
732
4/8
✓ Branch 178 → 179 taken 1100 times.
✗ Branch 178 → 273 not taken.
✓ Branch 179 → 180 taken 1100 times.
✗ Branch 179 → 273 not taken.
✓ Branch 180 → 181 taken 1100 times.
✗ Branch 180 → 273 not taken.
✓ Branch 181 → 182 taken 1100 times.
✗ Branch 181 → 273 not taken.
1100 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
733 16 case COMB(TY_STRING, TY_STRING): {
734 // Generate call to the function isRawEqual(string, string) of the string std
735
1/2
✓ Branch 183 → 184 taken 16 times.
✗ Branch 183 → 295 not taken.
16 llvm::Function *opFct = stdFunctionManager.getStringIsRawEqualStringStringFct();
736
6/12
✓ Branch 184 → 185 taken 16 times.
✗ Branch 184 → 277 not taken.
✓ Branch 185 → 186 taken 16 times.
✗ Branch 185 → 275 not taken.
✓ Branch 186 → 187 taken 16 times.
✗ Branch 186 → 275 not taken.
✓ Branch 188 → 189 taken 16 times.
✗ Branch 188 → 274 not taken.
✓ Branch 189 → 190 taken 16 times.
✗ Branch 189 → 274 not taken.
✓ Branch 190 → 191 taken 16 times.
✗ Branch 190 → 278 not taken.
16 llvm::Value *result = builder.CreateCall(opFct, {lhsV(), rhsV()});
737 // Negate the result
738
2/4
✓ Branch 190 → 191 taken 16 times.
✗ Branch 190 → 278 not taken.
✓ Branch 191 → 192 taken 16 times.
✗ Branch 191 → 278 not taken.
16 return {.value = builder.CreateNot(result)};
739 }
740 52 case COMB(TY_BOOL, TY_BOOL): // fallthrough
741 case COMB(TY_FUNCTION, TY_FUNCTION): // fallthrough
742 case COMB(TY_PROCEDURE, TY_PROCEDURE): {
743
2/4
✓ Branch 194 → 195 taken 52 times.
✗ Branch 194 → 279 not taken.
✓ Branch 195 → 196 taken 52 times.
✗ Branch 195 → 279 not taken.
52 const uint64_t typeSize = irGenerator->module->getDataLayout().getTypeSizeInBits(lhsT) / 8;
744
1/2
✓ Branch 196 → 197 taken 52 times.
✗ Branch 196 → 295 not taken.
52 llvm::Function *memcmpFct = stdFunctionManager.getMemcmpFct();
745
7/14
✓ Branch 197 → 198 taken 52 times.
✗ Branch 197 → 283 not taken.
✓ Branch 198 → 199 taken 52 times.
✗ Branch 198 → 281 not taken.
✓ Branch 199 → 200 taken 52 times.
✗ Branch 199 → 281 not taken.
✓ Branch 200 → 201 taken 52 times.
✗ Branch 200 → 281 not taken.
✓ Branch 202 → 203 taken 52 times.
✗ Branch 202 → 280 not taken.
✓ Branch 203 → 204 taken 52 times.
✗ Branch 203 → 280 not taken.
✓ Branch 204 → 205 taken 52 times.
✗ Branch 204 → 284 not taken.
52 llvm::Value *memcmpResult = builder.CreateCall(memcmpFct, {lhsP(), rhsP(), builder.getInt64(typeSize)});
746
3/6
✓ Branch 204 → 205 taken 52 times.
✗ Branch 204 → 284 not taken.
✓ Branch 205 → 206 taken 52 times.
✗ Branch 205 → 284 not taken.
✓ Branch 206 → 207 taken 52 times.
✗ Branch 206 → 284 not taken.
52 return {.value = builder.CreateICmpNE(memcmpResult, builder.getInt32(0))};
747 }
748 709 case COMB(TY_PTR, TY_PTR):
749
4/8
✓ Branch 208 → 209 taken 709 times.
✗ Branch 208 → 285 not taken.
✓ Branch 209 → 210 taken 709 times.
✗ Branch 209 → 285 not taken.
✓ Branch 210 → 211 taken 709 times.
✗ Branch 210 → 285 not taken.
✓ Branch 211 → 212 taken 709 times.
✗ Branch 211 → 285 not taken.
709 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
750 default: // GCOV_EXCL_LINE
751 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: !="); // GCOV_EXCL_LINE
752 }
753
5/14
✓ Branch 12 → 13 taken 71 times.
✗ Branch 12 → 233 not taken.
✓ Branch 13 → 14 taken 71 times.
✗ Branch 13 → 233 not taken.
✓ Branch 14 → 15 taken 71 times.
✗ Branch 14 → 233 not taken.
✓ Branch 15 → 16 taken 71 times.
✗ Branch 15 → 233 not taken.
✓ Branch 16 → 17 taken 71 times.
✗ Branch 16 → 231 not taken.
✗ Branch 233 → 234 not taken.
✗ Branch 233 → 237 not taken.
✗ Branch 235 → 236 not taken.
✗ Branch 235 → 237 not taken.
3528 }
754
755 4150 LLVMExprResult OpRuleConversionManager::getLessInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
756 LLVMExprResult &rhs, QualType rhsSTy) {
757
1/2
✓ Branch 2 → 3 taken 4150 times.
✗ Branch 2 → 103 not taken.
8300 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
758
1/2
✓ Branch 3 → 4 taken 4150 times.
✗ Branch 3 → 104 not taken.
8300 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
759
1/2
✓ Branch 4 → 5 taken 4150 times.
✗ Branch 4 → 105 not taken.
4150 lhsSTy = lhsSTy.removeReferenceWrapper();
760
1/2
✓ Branch 5 → 6 taken 4150 times.
✗ Branch 5 → 106 not taken.
4150 rhsSTy = rhsSTy.removeReferenceWrapper();
761
1/2
✓ Branch 6 → 7 taken 4150 times.
✗ Branch 6 → 127 not taken.
4150 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
762
1/2
✓ Branch 7 → 8 taken 4150 times.
✗ Branch 7 → 127 not taken.
4150 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
763
764
15/17
✓ Branch 8 → 9 taken 4150 times.
✗ Branch 8 → 127 not taken.
✓ Branch 9 → 10 taken 60 times.
✓ Branch 9 → 15 taken 22 times.
✓ Branch 9 → 21 taken 1 time.
✓ Branch 9 → 27 taken 300 times.
✓ Branch 9 → 31 taken 1 time.
✓ Branch 9 → 38 taken 25 times.
✓ Branch 9 → 45 taken 1 time.
✓ Branch 9 → 51 taken 4 times.
✓ Branch 9 → 58 taken 20 times.
✓ Branch 9 → 62 taken 1 time.
✓ Branch 9 → 69 taken 1 time.
✓ Branch 9 → 75 taken 31 times.
✓ Branch 9 → 82 taken 3679 times.
✓ Branch 9 → 86 taken 4 times.
✗ Branch 9 → 91 not taken.
4150 switch (getTypeCombination(lhsSTy, rhsSTy)) {
765 60 case COMB(TY_DOUBLE, TY_DOUBLE):
766
4/8
✓ Branch 10 → 11 taken 60 times.
✗ Branch 10 → 107 not taken.
✓ Branch 11 → 12 taken 60 times.
✗ Branch 11 → 107 not taken.
✓ Branch 12 → 13 taken 60 times.
✗ Branch 12 → 107 not taken.
✓ Branch 13 → 14 taken 60 times.
✗ Branch 13 → 107 not taken.
60 return {.value = builder.CreateFCmpOLT(lhsV(), rhsV())};
767 22 case COMB(TY_DOUBLE, TY_INT): // fallthrough
768 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
769 case COMB(TY_DOUBLE, TY_LONG): {
770
2/4
✓ Branch 15 → 16 taken 22 times.
✗ Branch 15 → 127 not taken.
✓ Branch 16 → 17 taken 22 times.
✗ Branch 16 → 127 not taken.
22 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
771
3/6
✓ Branch 17 → 18 taken 22 times.
✗ Branch 17 → 108 not taken.
✓ Branch 18 → 19 taken 22 times.
✗ Branch 18 → 108 not taken.
✓ Branch 19 → 20 taken 22 times.
✗ Branch 19 → 108 not taken.
22 return {.value = builder.CreateFCmpOLT(lhsV(), rhsFP)};
772 }
773 1 case COMB(TY_INT, TY_DOUBLE): {
774
2/4
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 127 not taken.
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
775
3/6
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 109 not taken.
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 109 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 109 not taken.
1 return {.value = builder.CreateFCmpOLT(lhsFP, rhsV())};
776 }
777 300 case COMB(TY_INT, TY_INT):
778
3/6
✓ Branch 27 → 28 taken 300 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 300 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 300 times.
✗ Branch 29 → 127 not taken.
300 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsV())};
779 1 case COMB(TY_INT, TY_SHORT): {
780
5/10
✓ Branch 31 → 32 taken 1 time.
✗ Branch 31 → 110 not taken.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 110 not taken.
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 110 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 110 not taken.
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 127 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
781
2/4
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 127 not taken.
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 127 not taken.
1 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsInt)};
782 }
783 25 case COMB(TY_INT, TY_LONG): {
784
5/10
✓ Branch 38 → 39 taken 25 times.
✗ Branch 38 → 111 not taken.
✓ Branch 39 → 40 taken 25 times.
✗ Branch 39 → 111 not taken.
✓ Branch 40 → 41 taken 25 times.
✗ Branch 40 → 111 not taken.
✓ Branch 41 → 42 taken 25 times.
✗ Branch 41 → 111 not taken.
✓ Branch 42 → 43 taken 25 times.
✗ Branch 42 → 127 not taken.
25 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
785
2/4
✓ Branch 42 → 43 taken 25 times.
✗ Branch 42 → 127 not taken.
✓ Branch 43 → 44 taken 25 times.
✗ Branch 43 → 127 not taken.
25 return {.value = generateLT(lhsSTy, rhsSTy, lhsLong, rhsV())};
786 }
787 1 case COMB(TY_SHORT, TY_DOUBLE): {
788
2/4
✓ Branch 45 → 46 taken 1 time.
✗ Branch 45 → 127 not taken.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
789
3/6
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 112 not taken.
✓ Branch 48 → 49 taken 1 time.
✗ Branch 48 → 112 not taken.
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 112 not taken.
1 return {.value = builder.CreateFCmpOLT(lhsFP, rhsV())};
790 }
791 4 case COMB(TY_SHORT, TY_INT): {
792
5/10
✓ Branch 51 → 52 taken 4 times.
✗ Branch 51 → 113 not taken.
✓ Branch 52 → 53 taken 4 times.
✗ Branch 52 → 113 not taken.
✓ Branch 53 → 54 taken 4 times.
✗ Branch 53 → 113 not taken.
✓ Branch 54 → 55 taken 4 times.
✗ Branch 54 → 113 not taken.
✓ Branch 55 → 56 taken 4 times.
✗ Branch 55 → 127 not taken.
4 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
793
2/4
✓ Branch 55 → 56 taken 4 times.
✗ Branch 55 → 127 not taken.
✓ Branch 56 → 57 taken 4 times.
✗ Branch 56 → 127 not taken.
4 return {.value = generateLT(lhsSTy, rhsSTy, lhsInt, rhsV())};
794 }
795 20 case COMB(TY_SHORT, TY_SHORT):
796
3/6
✓ Branch 58 → 59 taken 20 times.
✗ Branch 58 → 127 not taken.
✓ Branch 59 → 60 taken 20 times.
✗ Branch 59 → 127 not taken.
✓ Branch 60 → 61 taken 20 times.
✗ Branch 60 → 127 not taken.
20 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsV())};
797 1 case COMB(TY_SHORT, TY_LONG): {
798
5/10
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 114 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 114 not taken.
✓ Branch 64 → 65 taken 1 time.
✗ Branch 64 → 114 not taken.
✓ Branch 65 → 66 taken 1 time.
✗ Branch 65 → 114 not taken.
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 127 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
799
2/4
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 127 not taken.
✓ Branch 67 → 68 taken 1 time.
✗ Branch 67 → 127 not taken.
1 return {.value = generateLT(lhsSTy, rhsSTy, lhsLong, rhsV())};
800 }
801 1 case COMB(TY_LONG, TY_DOUBLE): {
802
2/4
✓ Branch 69 → 70 taken 1 time.
✗ Branch 69 → 127 not taken.
✓ Branch 70 → 71 taken 1 time.
✗ Branch 70 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
803
3/6
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 115 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 115 not taken.
✓ Branch 73 → 74 taken 1 time.
✗ Branch 73 → 115 not taken.
1 return {.value = builder.CreateFCmpOLT(lhsFP, rhsV())};
804 }
805 31 case COMB(TY_LONG, TY_INT): // fallthrough
806 case COMB(TY_LONG, TY_SHORT): {
807
5/10
✓ Branch 75 → 76 taken 31 times.
✗ Branch 75 → 116 not taken.
✓ Branch 76 → 77 taken 31 times.
✗ Branch 76 → 116 not taken.
✓ Branch 77 → 78 taken 31 times.
✗ Branch 77 → 116 not taken.
✓ Branch 78 → 79 taken 31 times.
✗ Branch 78 → 116 not taken.
✓ Branch 79 → 80 taken 31 times.
✗ Branch 79 → 127 not taken.
31 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
808
2/4
✓ Branch 79 → 80 taken 31 times.
✗ Branch 79 → 127 not taken.
✓ Branch 80 → 81 taken 31 times.
✗ Branch 80 → 127 not taken.
31 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsLong)};
809 }
810 3679 case COMB(TY_LONG, TY_LONG): // fallthrough
811 case COMB(TY_BYTE, TY_BYTE): // fallthrough
812 case COMB(TY_CHAR, TY_CHAR):
813
3/6
✓ Branch 82 → 83 taken 3679 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 3679 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 3679 times.
✗ Branch 84 → 127 not taken.
3679 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsV())};
814 4 case COMB(TY_PTR, TY_PTR):
815
4/8
✓ Branch 86 → 87 taken 4 times.
✗ Branch 86 → 117 not taken.
✓ Branch 87 → 88 taken 4 times.
✗ Branch 87 → 117 not taken.
✓ Branch 88 → 89 taken 4 times.
✗ Branch 88 → 117 not taken.
✓ Branch 89 → 90 taken 4 times.
✗ Branch 89 → 117 not taken.
4 return {.value = builder.CreateICmpULT(lhsV(), rhsV())};
816 default: // GCOV_EXCL_LINE
817 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: <"); // GCOV_EXCL_LINE
818 }
819 4150 }
820
821 1671 LLVMExprResult OpRuleConversionManager::getGreaterInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
822 LLVMExprResult &rhs, QualType rhsSTy) {
823
1/2
✓ Branch 2 → 3 taken 1671 times.
✗ Branch 2 → 103 not taken.
3342 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
824
1/2
✓ Branch 3 → 4 taken 1671 times.
✗ Branch 3 → 104 not taken.
3342 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
825
1/2
✓ Branch 4 → 5 taken 1671 times.
✗ Branch 4 → 105 not taken.
1671 lhsSTy = lhsSTy.removeReferenceWrapper();
826
1/2
✓ Branch 5 → 6 taken 1671 times.
✗ Branch 5 → 106 not taken.
1671 rhsSTy = rhsSTy.removeReferenceWrapper();
827
1/2
✓ Branch 6 → 7 taken 1671 times.
✗ Branch 6 → 127 not taken.
1671 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
828
1/2
✓ Branch 7 → 8 taken 1671 times.
✗ Branch 7 → 127 not taken.
1671 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
829
830
15/17
✓ Branch 8 → 9 taken 1671 times.
✗ Branch 8 → 127 not taken.
✓ Branch 9 → 10 taken 58 times.
✓ Branch 9 → 15 taken 8 times.
✓ Branch 9 → 21 taken 1 time.
✓ Branch 9 → 27 taken 50 times.
✓ Branch 9 → 31 taken 1 time.
✓ Branch 9 → 38 taken 49 times.
✓ Branch 9 → 45 taken 1 time.
✓ Branch 9 → 51 taken 7 times.
✓ Branch 9 → 58 taken 4 times.
✓ Branch 9 → 62 taken 1 time.
✓ Branch 9 → 69 taken 1 time.
✓ Branch 9 → 75 taken 91 times.
✓ Branch 9 → 82 taken 1395 times.
✓ Branch 9 → 86 taken 4 times.
✗ Branch 9 → 91 not taken.
1671 switch (getTypeCombination(lhsSTy, rhsSTy)) {
831 58 case COMB(TY_DOUBLE, TY_DOUBLE):
832
4/8
✓ Branch 10 → 11 taken 58 times.
✗ Branch 10 → 107 not taken.
✓ Branch 11 → 12 taken 58 times.
✗ Branch 11 → 107 not taken.
✓ Branch 12 → 13 taken 58 times.
✗ Branch 12 → 107 not taken.
✓ Branch 13 → 14 taken 58 times.
✗ Branch 13 → 107 not taken.
58 return {.value = builder.CreateFCmpOGT(lhsV(), rhsV())};
833 8 case COMB(TY_DOUBLE, TY_INT): // fallthrough
834 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
835 case COMB(TY_DOUBLE, TY_LONG): {
836
2/4
✓ Branch 15 → 16 taken 8 times.
✗ Branch 15 → 127 not taken.
✓ Branch 16 → 17 taken 8 times.
✗ Branch 16 → 127 not taken.
8 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
837
3/6
✓ Branch 17 → 18 taken 8 times.
✗ Branch 17 → 108 not taken.
✓ Branch 18 → 19 taken 8 times.
✗ Branch 18 → 108 not taken.
✓ Branch 19 → 20 taken 8 times.
✗ Branch 19 → 108 not taken.
8 return {.value = builder.CreateFCmpOGT(lhsV(), rhsFP)};
838 }
839 1 case COMB(TY_INT, TY_DOUBLE): {
840
2/4
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 127 not taken.
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
841
3/6
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 109 not taken.
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 109 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 109 not taken.
1 return {.value = builder.CreateFCmpOGT(lhsFP, rhsV())};
842 }
843 50 case COMB(TY_INT, TY_INT):
844
3/6
✓ Branch 27 → 28 taken 50 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 50 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 50 times.
✗ Branch 29 → 127 not taken.
50 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsV())};
845 1 case COMB(TY_INT, TY_SHORT): {
846
5/10
✓ Branch 31 → 32 taken 1 time.
✗ Branch 31 → 110 not taken.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 110 not taken.
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 110 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 110 not taken.
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 127 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
847
2/4
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 127 not taken.
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 127 not taken.
1 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsInt)};
848 }
849 49 case COMB(TY_INT, TY_LONG): {
850
5/10
✓ Branch 38 → 39 taken 49 times.
✗ Branch 38 → 111 not taken.
✓ Branch 39 → 40 taken 49 times.
✗ Branch 39 → 111 not taken.
✓ Branch 40 → 41 taken 49 times.
✗ Branch 40 → 111 not taken.
✓ Branch 41 → 42 taken 49 times.
✗ Branch 41 → 111 not taken.
✓ Branch 42 → 43 taken 49 times.
✗ Branch 42 → 127 not taken.
49 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
851
2/4
✓ Branch 42 → 43 taken 49 times.
✗ Branch 42 → 127 not taken.
✓ Branch 43 → 44 taken 49 times.
✗ Branch 43 → 127 not taken.
49 return {.value = generateGT(lhsSTy, rhsSTy, lhsLong, rhsV())};
852 }
853 1 case COMB(TY_SHORT, TY_DOUBLE): {
854
2/4
✓ Branch 45 → 46 taken 1 time.
✗ Branch 45 → 127 not taken.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
855
3/6
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 112 not taken.
✓ Branch 48 → 49 taken 1 time.
✗ Branch 48 → 112 not taken.
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 112 not taken.
1 return {.value = builder.CreateFCmpOGT(lhsFP, rhsV())};
856 }
857 7 case COMB(TY_SHORT, TY_INT): {
858
5/10
✓ Branch 51 → 52 taken 7 times.
✗ Branch 51 → 113 not taken.
✓ Branch 52 → 53 taken 7 times.
✗ Branch 52 → 113 not taken.
✓ Branch 53 → 54 taken 7 times.
✗ Branch 53 → 113 not taken.
✓ Branch 54 → 55 taken 7 times.
✗ Branch 54 → 113 not taken.
✓ Branch 55 → 56 taken 7 times.
✗ Branch 55 → 127 not taken.
7 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
859
2/4
✓ Branch 55 → 56 taken 7 times.
✗ Branch 55 → 127 not taken.
✓ Branch 56 → 57 taken 7 times.
✗ Branch 56 → 127 not taken.
7 return {.value = generateGT(lhsSTy, rhsSTy, lhsInt, rhsV())};
860 }
861 4 case COMB(TY_SHORT, TY_SHORT):
862
3/6
✓ Branch 58 → 59 taken 4 times.
✗ Branch 58 → 127 not taken.
✓ Branch 59 → 60 taken 4 times.
✗ Branch 59 → 127 not taken.
✓ Branch 60 → 61 taken 4 times.
✗ Branch 60 → 127 not taken.
4 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsV())};
863 1 case COMB(TY_SHORT, TY_LONG): {
864
5/10
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 114 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 114 not taken.
✓ Branch 64 → 65 taken 1 time.
✗ Branch 64 → 114 not taken.
✓ Branch 65 → 66 taken 1 time.
✗ Branch 65 → 114 not taken.
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 127 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
865
2/4
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 127 not taken.
✓ Branch 67 → 68 taken 1 time.
✗ Branch 67 → 127 not taken.
1 return {.value = generateGT(lhsSTy, rhsSTy, lhsLong, rhsV())};
866 }
867 1 case COMB(TY_LONG, TY_DOUBLE): {
868
2/4
✓ Branch 69 → 70 taken 1 time.
✗ Branch 69 → 127 not taken.
✓ Branch 70 → 71 taken 1 time.
✗ Branch 70 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
869
3/6
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 115 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 115 not taken.
✓ Branch 73 → 74 taken 1 time.
✗ Branch 73 → 115 not taken.
1 return {.value = builder.CreateFCmpOGT(lhsFP, rhsV())};
870 }
871 91 case COMB(TY_LONG, TY_INT): // fallthrough
872 case COMB(TY_LONG, TY_SHORT): {
873
5/10
✓ Branch 75 → 76 taken 91 times.
✗ Branch 75 → 116 not taken.
✓ Branch 76 → 77 taken 91 times.
✗ Branch 76 → 116 not taken.
✓ Branch 77 → 78 taken 91 times.
✗ Branch 77 → 116 not taken.
✓ Branch 78 → 79 taken 91 times.
✗ Branch 78 → 116 not taken.
✓ Branch 79 → 80 taken 91 times.
✗ Branch 79 → 127 not taken.
91 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
874
2/4
✓ Branch 79 → 80 taken 91 times.
✗ Branch 79 → 127 not taken.
✓ Branch 80 → 81 taken 91 times.
✗ Branch 80 → 127 not taken.
91 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsLong)};
875 }
876 1395 case COMB(TY_LONG, TY_LONG): // fallthrough
877 case COMB(TY_BYTE, TY_BYTE): // fallthrough
878 case COMB(TY_CHAR, TY_CHAR):
879
3/6
✓ Branch 82 → 83 taken 1395 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 1395 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 1395 times.
✗ Branch 84 → 127 not taken.
1395 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsV())};
880 4 case COMB(TY_PTR, TY_PTR):
881
4/8
✓ Branch 86 → 87 taken 4 times.
✗ Branch 86 → 117 not taken.
✓ Branch 87 → 88 taken 4 times.
✗ Branch 87 → 117 not taken.
✓ Branch 88 → 89 taken 4 times.
✗ Branch 88 → 117 not taken.
✓ Branch 89 → 90 taken 4 times.
✗ Branch 89 → 117 not taken.
4 return {.value = builder.CreateICmpUGT(lhsV(), rhsV())};
882 default: // GCOV_EXCL_LINE
883 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: >"); // GCOV_EXCL_LINE
884 }
885 1671 }
886
887 1179 LLVMExprResult OpRuleConversionManager::getLessEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
888 LLVMExprResult &rhs, QualType rhsSTy) {
889
1/2
✓ Branch 2 → 3 taken 1179 times.
✗ Branch 2 → 103 not taken.
2358 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
890
1/2
✓ Branch 3 → 4 taken 1179 times.
✗ Branch 3 → 104 not taken.
2358 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
891
1/2
✓ Branch 4 → 5 taken 1179 times.
✗ Branch 4 → 105 not taken.
1179 lhsSTy = lhsSTy.removeReferenceWrapper();
892
1/2
✓ Branch 5 → 6 taken 1179 times.
✗ Branch 5 → 106 not taken.
1179 rhsSTy = rhsSTy.removeReferenceWrapper();
893
1/2
✓ Branch 6 → 7 taken 1179 times.
✗ Branch 6 → 127 not taken.
1179 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
894
1/2
✓ Branch 7 → 8 taken 1179 times.
✗ Branch 7 → 127 not taken.
1179 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
895
896
15/17
✓ Branch 8 → 9 taken 1179 times.
✗ Branch 8 → 127 not taken.
✓ Branch 9 → 10 taken 55 times.
✓ Branch 9 → 15 taken 3 times.
✓ Branch 9 → 21 taken 1 time.
✓ Branch 9 → 27 taken 24 times.
✓ Branch 9 → 31 taken 1 time.
✓ Branch 9 → 38 taken 1 time.
✓ Branch 9 → 45 taken 1 time.
✓ Branch 9 → 51 taken 1 time.
✓ Branch 9 → 58 taken 3 times.
✓ Branch 9 → 62 taken 1 time.
✓ Branch 9 → 69 taken 1 time.
✓ Branch 9 → 75 taken 3 times.
✓ Branch 9 → 82 taken 1080 times.
✓ Branch 9 → 86 taken 4 times.
✗ Branch 9 → 91 not taken.
1179 switch (getTypeCombination(lhsSTy, rhsSTy)) {
897 55 case COMB(TY_DOUBLE, TY_DOUBLE):
898
4/8
✓ Branch 10 → 11 taken 55 times.
✗ Branch 10 → 107 not taken.
✓ Branch 11 → 12 taken 55 times.
✗ Branch 11 → 107 not taken.
✓ Branch 12 → 13 taken 55 times.
✗ Branch 12 → 107 not taken.
✓ Branch 13 → 14 taken 55 times.
✗ Branch 13 → 107 not taken.
55 return {.value = builder.CreateFCmpOLE(lhsV(), rhsV())};
899 3 case COMB(TY_DOUBLE, TY_INT): // fallthrough
900 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
901 case COMB(TY_DOUBLE, TY_LONG): {
902
2/4
✓ Branch 15 → 16 taken 3 times.
✗ Branch 15 → 127 not taken.
✓ Branch 16 → 17 taken 3 times.
✗ Branch 16 → 127 not taken.
3 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
903
3/6
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 108 not taken.
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 108 not taken.
✓ Branch 19 → 20 taken 3 times.
✗ Branch 19 → 108 not taken.
3 return {.value = builder.CreateFCmpOLE(lhsV(), rhsFP)};
904 }
905 1 case COMB(TY_INT, TY_DOUBLE): {
906
2/4
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 127 not taken.
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
907
3/6
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 109 not taken.
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 109 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 109 not taken.
1 return {.value = builder.CreateFCmpOLE(lhsFP, rhsV())};
908 }
909 24 case COMB(TY_INT, TY_INT):
910
3/6
✓ Branch 27 → 28 taken 24 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 24 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 24 times.
✗ Branch 29 → 127 not taken.
24 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsV())};
911 1 case COMB(TY_INT, TY_SHORT): {
912
5/10
✓ Branch 31 → 32 taken 1 time.
✗ Branch 31 → 110 not taken.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 110 not taken.
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 110 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 110 not taken.
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 127 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
913
2/4
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 127 not taken.
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 127 not taken.
1 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsInt)};
914 }
915 1 case COMB(TY_INT, TY_LONG): {
916
5/10
✓ Branch 38 → 39 taken 1 time.
✗ Branch 38 → 111 not taken.
✓ Branch 39 → 40 taken 1 time.
✗ Branch 39 → 111 not taken.
✓ Branch 40 → 41 taken 1 time.
✗ Branch 40 → 111 not taken.
✓ Branch 41 → 42 taken 1 time.
✗ Branch 41 → 111 not taken.
✓ Branch 42 → 43 taken 1 time.
✗ Branch 42 → 127 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
917
2/4
✓ Branch 42 → 43 taken 1 time.
✗ Branch 42 → 127 not taken.
✓ Branch 43 → 44 taken 1 time.
✗ Branch 43 → 127 not taken.
1 return {.value = generateLE(lhsSTy, rhsSTy, lhsLong, rhsV())};
918 }
919 1 case COMB(TY_SHORT, TY_DOUBLE): {
920
2/4
✓ Branch 45 → 46 taken 1 time.
✗ Branch 45 → 127 not taken.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
921
3/6
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 112 not taken.
✓ Branch 48 → 49 taken 1 time.
✗ Branch 48 → 112 not taken.
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 112 not taken.
1 return {.value = builder.CreateFCmpOLE(lhsFP, rhsV())};
922 }
923 1 case COMB(TY_SHORT, TY_INT): {
924
5/10
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 113 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 113 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 113 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 113 not taken.
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 127 not taken.
1 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
925
2/4
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 127 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 127 not taken.
1 return {.value = generateLE(lhsSTy, rhsSTy, lhsInt, rhsV())};
926 }
927 3 case COMB(TY_SHORT, TY_SHORT):
928
3/6
✓ Branch 58 → 59 taken 3 times.
✗ Branch 58 → 127 not taken.
✓ Branch 59 → 60 taken 3 times.
✗ Branch 59 → 127 not taken.
✓ Branch 60 → 61 taken 3 times.
✗ Branch 60 → 127 not taken.
3 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsV())};
929 1 case COMB(TY_SHORT, TY_LONG): {
930
5/10
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 114 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 114 not taken.
✓ Branch 64 → 65 taken 1 time.
✗ Branch 64 → 114 not taken.
✓ Branch 65 → 66 taken 1 time.
✗ Branch 65 → 114 not taken.
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 127 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
931
2/4
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 127 not taken.
✓ Branch 67 → 68 taken 1 time.
✗ Branch 67 → 127 not taken.
1 return {.value = generateLE(lhsSTy, rhsSTy, lhsLong, rhsV())};
932 }
933 1 case COMB(TY_LONG, TY_DOUBLE): {
934
2/4
✓ Branch 69 → 70 taken 1 time.
✗ Branch 69 → 127 not taken.
✓ Branch 70 → 71 taken 1 time.
✗ Branch 70 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
935
3/6
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 115 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 115 not taken.
✓ Branch 73 → 74 taken 1 time.
✗ Branch 73 → 115 not taken.
1 return {.value = builder.CreateFCmpOLE(lhsFP, rhsV())};
936 }
937 3 case COMB(TY_LONG, TY_INT): // fallthrough
938 case COMB(TY_LONG, TY_SHORT): {
939
5/10
✓ Branch 75 → 76 taken 3 times.
✗ Branch 75 → 116 not taken.
✓ Branch 76 → 77 taken 3 times.
✗ Branch 76 → 116 not taken.
✓ Branch 77 → 78 taken 3 times.
✗ Branch 77 → 116 not taken.
✓ Branch 78 → 79 taken 3 times.
✗ Branch 78 → 116 not taken.
✓ Branch 79 → 80 taken 3 times.
✗ Branch 79 → 127 not taken.
3 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
940
2/4
✓ Branch 79 → 80 taken 3 times.
✗ Branch 79 → 127 not taken.
✓ Branch 80 → 81 taken 3 times.
✗ Branch 80 → 127 not taken.
3 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsLong)};
941 }
942 1080 case COMB(TY_LONG, TY_LONG): // fallthrough
943 case COMB(TY_BYTE, TY_BYTE): // fallthrough
944 case COMB(TY_CHAR, TY_CHAR):
945
3/6
✓ Branch 82 → 83 taken 1080 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 1080 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 1080 times.
✗ Branch 84 → 127 not taken.
1080 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsV())};
946 4 case COMB(TY_PTR, TY_PTR):
947
4/8
✓ Branch 86 → 87 taken 4 times.
✗ Branch 86 → 117 not taken.
✓ Branch 87 → 88 taken 4 times.
✗ Branch 87 → 117 not taken.
✓ Branch 88 → 89 taken 4 times.
✗ Branch 88 → 117 not taken.
✓ Branch 89 → 90 taken 4 times.
✗ Branch 89 → 117 not taken.
4 return {.value = builder.CreateICmpULE(lhsV(), rhsV())};
948 default: // GCOV_EXCL_LINE
949 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: <="); // GCOV_EXCL_LINE
950 }
951 1179 }
952
953 1974 LLVMExprResult OpRuleConversionManager::getGreaterEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
954 LLVMExprResult &rhs, QualType rhsSTy) {
955
1/2
✓ Branch 2 → 3 taken 1974 times.
✗ Branch 2 → 103 not taken.
3948 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
956
1/2
✓ Branch 3 → 4 taken 1974 times.
✗ Branch 3 → 104 not taken.
3948 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
957
1/2
✓ Branch 4 → 5 taken 1974 times.
✗ Branch 4 → 105 not taken.
1974 lhsSTy = lhsSTy.removeReferenceWrapper();
958
1/2
✓ Branch 5 → 6 taken 1974 times.
✗ Branch 5 → 106 not taken.
1974 rhsSTy = rhsSTy.removeReferenceWrapper();
959
1/2
✓ Branch 6 → 7 taken 1974 times.
✗ Branch 6 → 127 not taken.
1974 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
960
1/2
✓ Branch 7 → 8 taken 1974 times.
✗ Branch 7 → 127 not taken.
1974 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
961
962
15/17
✓ Branch 8 → 9 taken 1974 times.
✗ Branch 8 → 127 not taken.
✓ Branch 9 → 10 taken 93 times.
✓ Branch 9 → 15 taken 13 times.
✓ Branch 9 → 21 taken 1 time.
✓ Branch 9 → 27 taken 94 times.
✓ Branch 9 → 31 taken 1 time.
✓ Branch 9 → 38 taken 15 times.
✓ Branch 9 → 45 taken 1 time.
✓ Branch 9 → 51 taken 46 times.
✓ Branch 9 → 58 taken 1 time.
✓ Branch 9 → 62 taken 1 time.
✓ Branch 9 → 69 taken 1 time.
✓ Branch 9 → 75 taken 57 times.
✓ Branch 9 → 82 taken 1646 times.
✓ Branch 9 → 86 taken 4 times.
✗ Branch 9 → 91 not taken.
1974 switch (getTypeCombination(lhsSTy, rhsSTy)) {
963 93 case COMB(TY_DOUBLE, TY_DOUBLE):
964
4/8
✓ Branch 10 → 11 taken 93 times.
✗ Branch 10 → 107 not taken.
✓ Branch 11 → 12 taken 93 times.
✗ Branch 11 → 107 not taken.
✓ Branch 12 → 13 taken 93 times.
✗ Branch 12 → 107 not taken.
✓ Branch 13 → 14 taken 93 times.
✗ Branch 13 → 107 not taken.
93 return {.value = builder.CreateFCmpOGE(lhsV(), rhsV())};
965 13 case COMB(TY_DOUBLE, TY_INT): // fallthrough
966 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
967 case COMB(TY_DOUBLE, TY_LONG): {
968
2/4
✓ Branch 15 → 16 taken 13 times.
✗ Branch 15 → 127 not taken.
✓ Branch 16 → 17 taken 13 times.
✗ Branch 16 → 127 not taken.
13 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
969
3/6
✓ Branch 17 → 18 taken 13 times.
✗ Branch 17 → 108 not taken.
✓ Branch 18 → 19 taken 13 times.
✗ Branch 18 → 108 not taken.
✓ Branch 19 → 20 taken 13 times.
✗ Branch 19 → 108 not taken.
13 return {.value = builder.CreateFCmpOGE(lhsV(), rhsFP)};
970 }
971 1 case COMB(TY_INT, TY_DOUBLE): {
972
2/4
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 127 not taken.
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
973
3/6
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 109 not taken.
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 109 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 109 not taken.
1 return {.value = builder.CreateFCmpOGE(lhsFP, rhsV())};
974 }
975 94 case COMB(TY_INT, TY_INT):
976
3/6
✓ Branch 27 → 28 taken 94 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 94 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 94 times.
✗ Branch 29 → 127 not taken.
94 return {.value = generateGE(lhsSTy, rhsSTy, lhsV(), rhsV())};
977 1 case COMB(TY_INT, TY_SHORT): {
978
5/10
✓ Branch 31 → 32 taken 1 time.
✗ Branch 31 → 110 not taken.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 110 not taken.
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 110 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 110 not taken.
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 127 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
979
2/4
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 127 not taken.
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 127 not taken.
1 return {.value = generateGE(lhsSTy, rhsSTy, lhsV(), rhsInt)};
980 }
981 15 case COMB(TY_INT, TY_LONG): {
982
5/10
✓ Branch 38 → 39 taken 15 times.
✗ Branch 38 → 111 not taken.
✓ Branch 39 → 40 taken 15 times.
✗ Branch 39 → 111 not taken.
✓ Branch 40 → 41 taken 15 times.
✗ Branch 40 → 111 not taken.
✓ Branch 41 → 42 taken 15 times.
✗ Branch 41 → 111 not taken.
✓ Branch 42 → 43 taken 15 times.
✗ Branch 42 → 127 not taken.
15 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
983
2/4
✓ Branch 42 → 43 taken 15 times.
✗ Branch 42 → 127 not taken.
✓ Branch 43 → 44 taken 15 times.
✗ Branch 43 → 127 not taken.
15 return {.value = generateGE(lhsSTy, rhsSTy, lhsLong, rhsV())};
984 }
985 1 case COMB(TY_SHORT, TY_DOUBLE): {
986
2/4
✓ Branch 45 → 46 taken 1 time.
✗ Branch 45 → 127 not taken.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
987
3/6
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 112 not taken.
✓ Branch 48 → 49 taken 1 time.
✗ Branch 48 → 112 not taken.
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 112 not taken.
1 return {.value = builder.CreateFCmpOGE(lhsFP, rhsV())};
988 }
989 46 case COMB(TY_SHORT, TY_INT): {
990
5/10
✓ Branch 51 → 52 taken 46 times.
✗ Branch 51 → 113 not taken.
✓ Branch 52 → 53 taken 46 times.
✗ Branch 52 → 113 not taken.
✓ Branch 53 → 54 taken 46 times.
✗ Branch 53 → 113 not taken.
✓ Branch 54 → 55 taken 46 times.
✗ Branch 54 → 113 not taken.
✓ Branch 55 → 56 taken 46 times.
✗ Branch 55 → 127 not taken.
46 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
991
2/4
✓ Branch 55 → 56 taken 46 times.
✗ Branch 55 → 127 not taken.
✓ Branch 56 → 57 taken 46 times.
✗ Branch 56 → 127 not taken.
46 return {.value = generateGE(lhsSTy, rhsSTy, lhsInt, rhsV())};
992 }
993 1 case COMB(TY_SHORT, TY_SHORT):
994
3/6
✓ Branch 58 → 59 taken 1 time.
✗ Branch 58 → 127 not taken.
✓ Branch 59 → 60 taken 1 time.
✗ Branch 59 → 127 not taken.
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 127 not taken.
1 return {.value = generateGE(lhsSTy, rhsSTy, lhsV(), rhsV())};
995 1 case COMB(TY_SHORT, TY_LONG): {
996
5/10
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 114 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 114 not taken.
✓ Branch 64 → 65 taken 1 time.
✗ Branch 64 → 114 not taken.
✓ Branch 65 → 66 taken 1 time.
✗ Branch 65 → 114 not taken.
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 127 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
997
2/4
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 127 not taken.
✓ Branch 67 → 68 taken 1 time.
✗ Branch 67 → 127 not taken.
1 return {.value = generateGE(lhsSTy, rhsSTy, lhsLong, rhsV())};
998 }
999 1 case COMB(TY_LONG, TY_DOUBLE): {
1000
2/4
✓ Branch 69 → 70 taken 1 time.
✗ Branch 69 → 127 not taken.
✓ Branch 70 → 71 taken 1 time.
✗ Branch 70 → 127 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1001
3/6
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 115 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 115 not taken.
✓ Branch 73 → 74 taken 1 time.
✗ Branch 73 → 115 not taken.
1 return {.value = builder.CreateFCmpOGE(lhsFP, rhsV())};
1002 }
1003 57 case COMB(TY_LONG, TY_INT): // fallthrough
1004 case COMB(TY_LONG, TY_SHORT): {
1005
5/10
✓ Branch 75 → 76 taken 57 times.
✗ Branch 75 → 116 not taken.
✓ Branch 76 → 77 taken 57 times.
✗ Branch 76 → 116 not taken.
✓ Branch 77 → 78 taken 57 times.
✗ Branch 77 → 116 not taken.
✓ Branch 78 → 79 taken 57 times.
✗ Branch 78 → 116 not taken.
✓ Branch 79 → 80 taken 57 times.
✗ Branch 79 → 127 not taken.
57 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1006
2/4
✓ Branch 79 → 80 taken 57 times.
✗ Branch 79 → 127 not taken.
✓ Branch 80 → 81 taken 57 times.
✗ Branch 80 → 127 not taken.
57 return {.value = generateGE(lhsSTy, rhsSTy, lhsV(), rhsLong)};
1007 }
1008 1646 case COMB(TY_LONG, TY_LONG): // fallthrough
1009 case COMB(TY_BYTE, TY_BYTE): // fallthrough
1010 case COMB(TY_CHAR, TY_CHAR):
1011
3/6
✓ Branch 82 → 83 taken 1646 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 1646 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 1646 times.
✗ Branch 84 → 127 not taken.
1646 return {.value = generateGE(lhsSTy, rhsSTy, lhsV(), rhsV())};
1012 4 case COMB(TY_PTR, TY_PTR):
1013
4/8
✓ Branch 86 → 87 taken 4 times.
✗ Branch 86 → 117 not taken.
✓ Branch 87 → 88 taken 4 times.
✗ Branch 87 → 117 not taken.
✓ Branch 88 → 89 taken 4 times.
✗ Branch 88 → 117 not taken.
✓ Branch 89 → 90 taken 4 times.
✗ Branch 89 → 117 not taken.
4 return {.value = builder.CreateICmpUGE(lhsV(), rhsV())};
1014 default: // GCOV_EXCL_LINE
1015 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: >="); // GCOV_EXCL_LINE
1016 }
1017 1974 }
1018
1019 2098 LLVMExprResult OpRuleConversionManager::getShiftLeftInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
1020 LLVMExprResult &rhs, QualType rhsSTy, size_t opIdx) {
1021
1/2
✓ Branch 2 → 3 taken 2098 times.
✗ Branch 2 → 79 not taken.
2149 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1022
1/2
✓ Branch 3 → 4 taken 2098 times.
✗ Branch 3 → 80 not taken.
3710 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1023 4145 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1024 2584 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1025
1/2
✓ Branch 6 → 7 taken 2098 times.
✗ Branch 6 → 81 not taken.
2098 lhsSTy = lhsSTy.removeReferenceWrapper();
1026
1/2
✓ Branch 7 → 8 taken 2098 times.
✗ Branch 7 → 82 not taken.
2098 rhsSTy = rhsSTy.removeReferenceWrapper();
1027
1/2
✓ Branch 8 → 9 taken 2098 times.
✗ Branch 8 → 110 not taken.
2098 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1028
1029 // Handle operator overloads
1030
3/4
✓ Branch 9 → 10 taken 2098 times.
✗ Branch 9 → 110 not taken.
✓ Branch 10 → 11 taken 2048 times.
✓ Branch 10 → 19 taken 50 times.
2098 if (callsOverloadedOpFct(node, opIdx))
1031 2048 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1032
1033
8/10
✓ Branch 19 → 20 taken 50 times.
✗ Branch 19 → 110 not taken.
✓ Branch 20 → 21 taken 4 times.
✓ Branch 20 → 26 taken 3 times.
✓ Branch 20 → 34 taken 1 time.
✓ Branch 20 → 39 taken 4 times.
✓ Branch 20 → 47 taken 34 times.
✓ Branch 20 → 52 taken 3 times.
✓ Branch 20 → 60 taken 1 time.
✗ Branch 20 → 65 not taken.
50 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1034 4 case COMB(TY_INT, TY_INT):
1035
4/8
✓ Branch 21 → 22 taken 4 times.
✗ Branch 21 → 91 not taken.
✓ Branch 22 → 23 taken 4 times.
✗ Branch 22 → 91 not taken.
✓ Branch 23 → 24 taken 4 times.
✗ Branch 23 → 91 not taken.
✓ Branch 24 → 25 taken 4 times.
✗ Branch 24 → 91 not taken.
4 return {.value = builder.CreateShl(lhsV(), rhsV())};
1036 3 case COMB(TY_INT, TY_SHORT): // fallthrough
1037 case COMB(TY_INT, TY_LONG): // fallthrough
1038 case COMB(TY_SHORT, TY_INT): {
1039
5/10
✓ Branch 26 → 27 taken 3 times.
✗ Branch 26 → 92 not taken.
✓ Branch 27 → 28 taken 3 times.
✗ Branch 27 → 92 not taken.
✓ Branch 28 → 29 taken 3 times.
✗ Branch 28 → 92 not taken.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 92 not taken.
✓ Branch 30 → 31 taken 3 times.
✗ Branch 30 → 93 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1040
3/6
✓ Branch 30 → 31 taken 3 times.
✗ Branch 30 → 93 not taken.
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 93 not taken.
✓ Branch 32 → 33 taken 3 times.
✗ Branch 32 → 93 not taken.
3 return {.value = builder.CreateShl(lhsV(), rhsInt)};
1041 }
1042 1 case COMB(TY_SHORT, TY_SHORT):
1043
4/8
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 94 not taken.
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 94 not taken.
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 94 not taken.
✓ Branch 37 → 38 taken 1 time.
✗ Branch 37 → 94 not taken.
1 return {.value = builder.CreateShl(lhsV(), rhsV())};
1044 4 case COMB(TY_SHORT, TY_LONG): // fallthrough
1045 case COMB(TY_LONG, TY_INT): // fallthrough
1046 case COMB(TY_LONG, TY_SHORT): {
1047
5/10
✓ Branch 39 → 40 taken 4 times.
✗ Branch 39 → 95 not taken.
✓ Branch 40 → 41 taken 4 times.
✗ Branch 40 → 95 not taken.
✓ Branch 41 → 42 taken 4 times.
✗ Branch 41 → 95 not taken.
✓ Branch 42 → 43 taken 4 times.
✗ Branch 42 → 95 not taken.
✓ Branch 43 → 44 taken 4 times.
✗ Branch 43 → 96 not taken.
4 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1048
3/6
✓ Branch 43 → 44 taken 4 times.
✗ Branch 43 → 96 not taken.
✓ Branch 44 → 45 taken 4 times.
✗ Branch 44 → 96 not taken.
✓ Branch 45 → 46 taken 4 times.
✗ Branch 45 → 96 not taken.
4 return {.value = builder.CreateShl(lhsV(), rhsInt)};
1049 }
1050 34 case COMB(TY_LONG, TY_LONG):
1051
4/8
✓ Branch 47 → 48 taken 34 times.
✗ Branch 47 → 97 not taken.
✓ Branch 48 → 49 taken 34 times.
✗ Branch 48 → 97 not taken.
✓ Branch 49 → 50 taken 34 times.
✗ Branch 49 → 97 not taken.
✓ Branch 50 → 51 taken 34 times.
✗ Branch 50 → 97 not taken.
34 return {.value = builder.CreateShl(lhsV(), rhsV())};
1052 3 case COMB(TY_BYTE, TY_INT): // fallthrough
1053 case COMB(TY_BYTE, TY_SHORT): // fallthrough
1054 case COMB(TY_BYTE, TY_LONG): {
1055
5/10
✓ Branch 52 → 53 taken 3 times.
✗ Branch 52 → 98 not taken.
✓ Branch 53 → 54 taken 3 times.
✗ Branch 53 → 98 not taken.
✓ Branch 54 → 55 taken 3 times.
✗ Branch 54 → 98 not taken.
✓ Branch 55 → 56 taken 3 times.
✗ Branch 55 → 98 not taken.
✓ Branch 56 → 57 taken 3 times.
✗ Branch 56 → 99 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1056
3/6
✓ Branch 56 → 57 taken 3 times.
✗ Branch 56 → 99 not taken.
✓ Branch 57 → 58 taken 3 times.
✗ Branch 57 → 99 not taken.
✓ Branch 58 → 59 taken 3 times.
✗ Branch 58 → 99 not taken.
3 return {.value = builder.CreateShl(lhsV(), rhsInt)};
1057 }
1058 1 case COMB(TY_BYTE, TY_BYTE):
1059
4/8
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 100 not taken.
✓ Branch 61 → 62 taken 1 time.
✗ Branch 61 → 100 not taken.
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 100 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 100 not taken.
1 return {.value = builder.CreateShl(lhsV(), rhsV())};
1060 default: // GCOV_EXCL_LINE
1061 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: <<"); // GCOV_EXCL_LINE
1062 }
1063
5/14
✓ Branch 11 → 12 taken 2048 times.
✗ Branch 11 → 85 not taken.
✓ Branch 12 → 13 taken 2048 times.
✗ Branch 12 → 85 not taken.
✓ Branch 13 → 14 taken 2048 times.
✗ Branch 13 → 85 not taken.
✓ Branch 14 → 15 taken 2048 times.
✗ Branch 14 → 85 not taken.
✓ Branch 15 → 16 taken 2048 times.
✗ Branch 15 → 83 not taken.
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 89 not taken.
✗ Branch 87 → 88 not taken.
✗ Branch 87 → 89 not taken.
4146 }
1064
1065 187 LLVMExprResult OpRuleConversionManager::getShiftRightInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
1066 LLVMExprResult &rhs, QualType rhsSTy, size_t opIdx) {
1067
1/2
✓ Branch 2 → 3 taken 187 times.
✗ Branch 2 → 72 not taken.
374 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1068
1/2
✓ Branch 3 → 4 taken 187 times.
✗ Branch 3 → 73 not taken.
374 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1069 187 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1070 187 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1071
1/2
✓ Branch 6 → 7 taken 187 times.
✗ Branch 6 → 74 not taken.
187 lhsSTy = lhsSTy.removeReferenceWrapper();
1072
1/2
✓ Branch 7 → 8 taken 187 times.
✗ Branch 7 → 75 not taken.
187 rhsSTy = rhsSTy.removeReferenceWrapper();
1073
1/2
✓ Branch 8 → 9 taken 187 times.
✗ Branch 8 → 96 not taken.
187 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1074
1075 // Handle operator overloads
1076
3/4
✓ Branch 9 → 10 taken 187 times.
✗ Branch 9 → 96 not taken.
✓ Branch 10 → 11 taken 1 time.
✓ Branch 10 → 19 taken 186 times.
187 if (callsOverloadedOpFct(node, opIdx))
1077 1 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1078
1079
8/10
✓ Branch 19 → 20 taken 186 times.
✗ Branch 19 → 96 not taken.
✓ Branch 20 → 21 taken 6 times.
✓ Branch 20 → 25 taken 3 times.
✓ Branch 20 → 32 taken 1 time.
✓ Branch 20 → 36 taken 3 times.
✓ Branch 20 → 43 taken 169 times.
✓ Branch 20 → 47 taken 3 times.
✓ Branch 20 → 54 taken 1 time.
✗ Branch 20 → 58 not taken.
186 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1080 6 case COMB(TY_INT, TY_INT):
1081
3/6
✓ Branch 21 → 22 taken 6 times.
✗ Branch 21 → 96 not taken.
✓ Branch 22 → 23 taken 6 times.
✗ Branch 22 → 96 not taken.
✓ Branch 23 → 24 taken 6 times.
✗ Branch 23 → 96 not taken.
6 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
1082 3 case COMB(TY_INT, TY_SHORT): // fallthrough
1083 case COMB(TY_INT, TY_LONG): // fallthrough
1084 case COMB(TY_SHORT, TY_INT): {
1085
5/10
✓ Branch 25 → 26 taken 3 times.
✗ Branch 25 → 84 not taken.
✓ Branch 26 → 27 taken 3 times.
✗ Branch 26 → 84 not taken.
✓ Branch 27 → 28 taken 3 times.
✗ Branch 27 → 84 not taken.
✓ Branch 28 → 29 taken 3 times.
✗ Branch 28 → 84 not taken.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 96 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1086
2/4
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 96 not taken.
✓ Branch 30 → 31 taken 3 times.
✗ Branch 30 → 96 not taken.
3 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsInt)};
1087 }
1088 1 case COMB(TY_SHORT, TY_SHORT):
1089
3/6
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 96 not taken.
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 96 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 96 not taken.
1 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
1090 3 case COMB(TY_SHORT, TY_LONG): // fallthrough
1091 case COMB(TY_LONG, TY_INT): // fallthrough
1092 case COMB(TY_LONG, TY_SHORT): {
1093
5/10
✓ Branch 36 → 37 taken 3 times.
✗ Branch 36 → 85 not taken.
✓ Branch 37 → 38 taken 3 times.
✗ Branch 37 → 85 not taken.
✓ Branch 38 → 39 taken 3 times.
✗ Branch 38 → 85 not taken.
✓ Branch 39 → 40 taken 3 times.
✗ Branch 39 → 85 not taken.
✓ Branch 40 → 41 taken 3 times.
✗ Branch 40 → 96 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1094
2/4
✓ Branch 40 → 41 taken 3 times.
✗ Branch 40 → 96 not taken.
✓ Branch 41 → 42 taken 3 times.
✗ Branch 41 → 96 not taken.
3 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsInt)};
1095 }
1096 169 case COMB(TY_LONG, TY_LONG):
1097
3/6
✓ Branch 43 → 44 taken 169 times.
✗ Branch 43 → 96 not taken.
✓ Branch 44 → 45 taken 169 times.
✗ Branch 44 → 96 not taken.
✓ Branch 45 → 46 taken 169 times.
✗ Branch 45 → 96 not taken.
169 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
1098 3 case COMB(TY_BYTE, TY_INT): // fallthrough
1099 case COMB(TY_BYTE, TY_SHORT): // fallthrough
1100 case COMB(TY_BYTE, TY_LONG): {
1101
5/10
✓ Branch 47 → 48 taken 3 times.
✗ Branch 47 → 86 not taken.
✓ Branch 48 → 49 taken 3 times.
✗ Branch 48 → 86 not taken.
✓ Branch 49 → 50 taken 3 times.
✗ Branch 49 → 86 not taken.
✓ Branch 50 → 51 taken 3 times.
✗ Branch 50 → 86 not taken.
✓ Branch 51 → 52 taken 3 times.
✗ Branch 51 → 96 not taken.
3 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1102
2/4
✓ Branch 51 → 52 taken 3 times.
✗ Branch 51 → 96 not taken.
✓ Branch 52 → 53 taken 3 times.
✗ Branch 52 → 96 not taken.
3 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsInt)};
1103 }
1104 1 case COMB(TY_BYTE, TY_BYTE):
1105
3/6
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 96 not taken.
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 96 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 96 not taken.
1 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
1106 default: // GCOV_EXCL_LINE
1107 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: >>"); // GCOV_EXCL_LINE
1108 }
1109
5/14
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 78 not taken.
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 78 not taken.
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 78 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 78 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 76 not taken.
✗ Branch 78 → 79 not taken.
✗ Branch 78 → 82 not taken.
✗ Branch 80 → 81 not taken.
✗ Branch 80 → 82 not taken.
188 }
1110
1111 6546 LLVMExprResult OpRuleConversionManager::getPlusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
1112 LLVMExprResult &rhs, QualType rhsSTy, size_t opIdx) {
1113
1/2
✓ Branch 2 → 3 taken 6546 times.
✗ Branch 2 → 231 not taken.
12500 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1114
1/2
✓ Branch 3 → 4 taken 6546 times.
✗ Branch 3 → 232 not taken.
12500 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1115 7138 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1116 7138 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1117
1/2
✓ Branch 6 → 7 taken 6546 times.
✗ Branch 6 → 233 not taken.
6546 lhsSTy = lhsSTy.removeReferenceWrapper();
1118
1/2
✓ Branch 7 → 8 taken 6546 times.
✗ Branch 7 → 234 not taken.
6546 rhsSTy = rhsSTy.removeReferenceWrapper();
1119
1/2
✓ Branch 8 → 9 taken 6546 times.
✗ Branch 8 → 291 not taken.
6546 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1120
1/2
✓ Branch 9 → 10 taken 6546 times.
✗ Branch 9 → 291 not taken.
6546 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1121
1122 // Handle operator overloads
1123
3/4
✓ Branch 10 → 11 taken 6546 times.
✗ Branch 10 → 291 not taken.
✓ Branch 11 → 12 taken 593 times.
✓ Branch 11 → 20 taken 5953 times.
6546 if (callsOverloadedOpFct(node, opIdx))
1124 593 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1125
1126
16/21
✓ Branch 20 → 21 taken 5953 times.
✗ Branch 20 → 291 not taken.
✓ Branch 21 → 22 taken 160 times.
✓ Branch 21 → 27 taken 236 times.
✓ Branch 21 → 33 taken 2 times.
✓ Branch 21 → 39 taken 91 times.
✓ Branch 21 → 50 taken 1 time.
✓ Branch 21 → 64 taken 266 times.
✗ Branch 21 → 78 not taken.
✓ Branch 21 → 91 taken 1 time.
✓ Branch 21 → 97 taken 1 time.
✓ Branch 21 → 111 taken 2 times.
✓ Branch 21 → 122 taken 1 time.
✗ Branch 21 → 136 not taken.
✓ Branch 21 → 149 taken 2 times.
✓ Branch 21 → 155 taken 342 times.
✓ Branch 21 → 169 taken 3968 times.
✗ Branch 21 → 180 not taken.
✓ Branch 21 → 193 taken 1 time.
✓ Branch 21 → 204 taken 879 times.
✗ Branch 21 → 217 not taken.
5953 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1127 160 case COMB(TY_DOUBLE, TY_DOUBLE):
1128
4/8
✓ Branch 22 → 23 taken 160 times.
✗ Branch 22 → 243 not taken.
✓ Branch 23 → 24 taken 160 times.
✗ Branch 23 → 243 not taken.
✓ Branch 24 → 25 taken 160 times.
✗ Branch 24 → 243 not taken.
✓ Branch 25 → 26 taken 160 times.
✗ Branch 25 → 243 not taken.
160 return {.value = builder.CreateFAdd(lhsV(), rhsV())};
1129 236 case COMB(TY_DOUBLE, TY_INT): // fallthrough
1130 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
1131 case COMB(TY_DOUBLE, TY_LONG): {
1132
2/4
✓ Branch 27 → 28 taken 236 times.
✗ Branch 27 → 291 not taken.
✓ Branch 28 → 29 taken 236 times.
✗ Branch 28 → 291 not taken.
236 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
1133
3/6
✓ Branch 29 → 30 taken 236 times.
✗ Branch 29 → 244 not taken.
✓ Branch 30 → 31 taken 236 times.
✗ Branch 30 → 244 not taken.
✓ Branch 31 → 32 taken 236 times.
✗ Branch 31 → 244 not taken.
236 return {.value = builder.CreateFAdd(lhsV(), rhsFP)};
1134 }
1135 2 case COMB(TY_INT, TY_DOUBLE): {
1136
2/4
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 291 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 291 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1137
3/6
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 245 not taken.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 245 not taken.
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 245 not taken.
2 return {.value = builder.CreateFAdd(lhsFP, rhsV())};
1138 }
1139 91 case COMB(TY_INT, TY_INT):
1140
9/16
✓ Branch 39 → 40 taken 91 times.
✗ Branch 39 → 291 not taken.
✓ Branch 40 → 41 taken 89 times.
✓ Branch 40 → 44 taken 2 times.
✓ Branch 41 → 42 taken 89 times.
✗ Branch 41 → 291 not taken.
✓ Branch 42 → 43 taken 89 times.
✗ Branch 42 → 44 not taken.
✓ Branch 45 → 46 taken 91 times.
✗ Branch 45 → 246 not taken.
✓ Branch 46 → 47 taken 91 times.
✗ Branch 46 → 246 not taken.
✓ Branch 47 → 48 taken 91 times.
✗ Branch 47 → 246 not taken.
✓ Branch 48 → 49 taken 91 times.
✗ Branch 48 → 246 not taken.
91 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1141 1 case COMB(TY_INT, TY_SHORT): {
1142
5/10
✓ Branch 50 → 51 taken 1 time.
✗ Branch 50 → 247 not taken.
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 247 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 247 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 247 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 291 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1143
7/14
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 291 not taken.
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 59 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 291 not taken.
✓ Branch 57 → 58 taken 1 time.
✗ Branch 57 → 59 not taken.
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 248 not taken.
✓ Branch 61 → 62 taken 1 time.
✗ Branch 61 → 248 not taken.
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 248 not taken.
1 return {.value = builder.CreateAdd(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1144 }
1145 266 case COMB(TY_INT, TY_LONG): {
1146
5/10
✓ Branch 64 → 65 taken 266 times.
✗ Branch 64 → 249 not taken.
✓ Branch 65 → 66 taken 266 times.
✗ Branch 65 → 249 not taken.
✓ Branch 66 → 67 taken 266 times.
✗ Branch 66 → 249 not taken.
✓ Branch 67 → 68 taken 266 times.
✗ Branch 67 → 249 not taken.
✓ Branch 68 → 69 taken 266 times.
✗ Branch 68 → 291 not taken.
266 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1147
8/14
✓ Branch 68 → 69 taken 266 times.
✗ Branch 68 → 291 not taken.
✓ Branch 69 → 70 taken 237 times.
✓ Branch 69 → 73 taken 29 times.
✓ Branch 70 → 71 taken 237 times.
✗ Branch 70 → 291 not taken.
✓ Branch 71 → 72 taken 237 times.
✗ Branch 71 → 73 not taken.
✓ Branch 74 → 75 taken 266 times.
✗ Branch 74 → 250 not taken.
✓ Branch 75 → 76 taken 266 times.
✗ Branch 75 → 250 not taken.
✓ Branch 76 → 77 taken 266 times.
✗ Branch 76 → 250 not taken.
266 return {.value = builder.CreateAdd(lhsLong, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1148 }
1149 case COMB(TY_INT, TY_PTR): {
1150 llvm::Value *lhsExt = builder.CreateIntCast(lhsV(), builder.getInt64Ty(), lhsSTy.isSigned());
1151 return {.value = builder.CreateGEP(rhsSTy.getContained().toLLVMType(irGenerator->sourceFile), rhsV(), lhsExt)};
1152 }
1153 1 case COMB(TY_SHORT, TY_DOUBLE): {
1154
2/4
✓ Branch 91 → 92 taken 1 time.
✗ Branch 91 → 291 not taken.
✓ Branch 92 → 93 taken 1 time.
✗ Branch 92 → 291 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1155
3/6
✓ Branch 93 → 94 taken 1 time.
✗ Branch 93 → 256 not taken.
✓ Branch 94 → 95 taken 1 time.
✗ Branch 94 → 256 not taken.
✓ Branch 95 → 96 taken 1 time.
✗ Branch 95 → 256 not taken.
1 return {.value = builder.CreateFAdd(lhsFP, rhsV())};
1156 }
1157 1 case COMB(TY_SHORT, TY_INT): {
1158
5/10
✓ Branch 97 → 98 taken 1 time.
✗ Branch 97 → 257 not taken.
✓ Branch 98 → 99 taken 1 time.
✗ Branch 98 → 257 not taken.
✓ Branch 99 → 100 taken 1 time.
✗ Branch 99 → 257 not taken.
✓ Branch 100 → 101 taken 1 time.
✗ Branch 100 → 257 not taken.
✓ Branch 101 → 102 taken 1 time.
✗ Branch 101 → 291 not taken.
1 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1159
7/14
✓ Branch 101 → 102 taken 1 time.
✗ Branch 101 → 291 not taken.
✓ Branch 102 → 103 taken 1 time.
✗ Branch 102 → 106 not taken.
✓ Branch 103 → 104 taken 1 time.
✗ Branch 103 → 291 not taken.
✓ Branch 104 → 105 taken 1 time.
✗ Branch 104 → 106 not taken.
✓ Branch 107 → 108 taken 1 time.
✗ Branch 107 → 258 not taken.
✓ Branch 108 → 109 taken 1 time.
✗ Branch 108 → 258 not taken.
✓ Branch 109 → 110 taken 1 time.
✗ Branch 109 → 258 not taken.
1 return {.value = builder.CreateAdd(lhsInt, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1160 }
1161 2 case COMB(TY_SHORT, TY_SHORT):
1162
8/16
✓ Branch 111 → 112 taken 2 times.
✗ Branch 111 → 291 not taken.
✓ Branch 112 → 113 taken 2 times.
✗ Branch 112 → 116 not taken.
✓ Branch 113 → 114 taken 2 times.
✗ Branch 113 → 291 not taken.
✓ Branch 114 → 115 taken 2 times.
✗ Branch 114 → 116 not taken.
✓ Branch 117 → 118 taken 2 times.
✗ Branch 117 → 259 not taken.
✓ Branch 118 → 119 taken 2 times.
✗ Branch 118 → 259 not taken.
✓ Branch 119 → 120 taken 2 times.
✗ Branch 119 → 259 not taken.
✓ Branch 120 → 121 taken 2 times.
✗ Branch 120 → 259 not taken.
2 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1163 1 case COMB(TY_SHORT, TY_LONG): {
1164
5/10
✓ Branch 122 → 123 taken 1 time.
✗ Branch 122 → 260 not taken.
✓ Branch 123 → 124 taken 1 time.
✗ Branch 123 → 260 not taken.
✓ Branch 124 → 125 taken 1 time.
✗ Branch 124 → 260 not taken.
✓ Branch 125 → 126 taken 1 time.
✗ Branch 125 → 260 not taken.
✓ Branch 126 → 127 taken 1 time.
✗ Branch 126 → 291 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1165
7/14
✓ Branch 126 → 127 taken 1 time.
✗ Branch 126 → 291 not taken.
✓ Branch 127 → 128 taken 1 time.
✗ Branch 127 → 131 not taken.
✓ Branch 128 → 129 taken 1 time.
✗ Branch 128 → 291 not taken.
✓ Branch 129 → 130 taken 1 time.
✗ Branch 129 → 131 not taken.
✓ Branch 132 → 133 taken 1 time.
✗ Branch 132 → 261 not taken.
✓ Branch 133 → 134 taken 1 time.
✗ Branch 133 → 261 not taken.
✓ Branch 134 → 135 taken 1 time.
✗ Branch 134 → 261 not taken.
1 return {.value = builder.CreateAdd(lhsLong, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1166 }
1167 case COMB(TY_SHORT, TY_PTR): {
1168 llvm::Value *lhsExt = builder.CreateIntCast(lhsV(), builder.getInt64Ty(), lhsSTy.isSigned());
1169 return {.value = builder.CreateGEP(rhsSTy.getContained().toLLVMType(irGenerator->sourceFile), rhsV(), lhsExt)};
1170 }
1171 2 case COMB(TY_LONG, TY_DOUBLE): {
1172
2/4
✓ Branch 149 → 150 taken 2 times.
✗ Branch 149 → 291 not taken.
✓ Branch 150 → 151 taken 2 times.
✗ Branch 150 → 291 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1173
3/6
✓ Branch 151 → 152 taken 2 times.
✗ Branch 151 → 267 not taken.
✓ Branch 152 → 153 taken 2 times.
✗ Branch 152 → 267 not taken.
✓ Branch 153 → 154 taken 2 times.
✗ Branch 153 → 267 not taken.
2 return {.value = builder.CreateFAdd(lhsFP, rhsV())};
1174 }
1175 342 case COMB(TY_LONG, TY_INT): // fallthrough
1176 case COMB(TY_LONG, TY_SHORT): {
1177
5/10
✓ Branch 155 → 156 taken 342 times.
✗ Branch 155 → 268 not taken.
✓ Branch 156 → 157 taken 342 times.
✗ Branch 156 → 268 not taken.
✓ Branch 157 → 158 taken 342 times.
✗ Branch 157 → 268 not taken.
✓ Branch 158 → 159 taken 342 times.
✗ Branch 158 → 268 not taken.
✓ Branch 159 → 160 taken 342 times.
✗ Branch 159 → 291 not taken.
342 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1178
8/14
✓ Branch 159 → 160 taken 342 times.
✗ Branch 159 → 291 not taken.
✓ Branch 160 → 161 taken 186 times.
✓ Branch 160 → 164 taken 156 times.
✓ Branch 161 → 162 taken 186 times.
✗ Branch 161 → 291 not taken.
✓ Branch 162 → 163 taken 186 times.
✗ Branch 162 → 164 not taken.
✓ Branch 165 → 166 taken 342 times.
✗ Branch 165 → 269 not taken.
✓ Branch 166 → 167 taken 342 times.
✗ Branch 166 → 269 not taken.
✓ Branch 167 → 168 taken 342 times.
✗ Branch 167 → 269 not taken.
342 return {.value = builder.CreateAdd(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1179 }
1180 3968 case COMB(TY_LONG, TY_LONG):
1181
10/16
✓ Branch 169 → 170 taken 3968 times.
✗ Branch 169 → 291 not taken.
✓ Branch 170 → 171 taken 508 times.
✓ Branch 170 → 174 taken 3460 times.
✓ Branch 171 → 172 taken 508 times.
✗ Branch 171 → 291 not taken.
✓ Branch 172 → 173 taken 197 times.
✓ Branch 172 → 174 taken 311 times.
✓ Branch 175 → 176 taken 3968 times.
✗ Branch 175 → 270 not taken.
✓ Branch 176 → 177 taken 3968 times.
✗ Branch 176 → 270 not taken.
✓ Branch 177 → 178 taken 3968 times.
✗ Branch 177 → 270 not taken.
✓ Branch 178 → 179 taken 3968 times.
✗ Branch 178 → 270 not taken.
3968 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1182 case COMB(TY_LONG, TY_PTR): {
1183 llvm::Value *lhsExt = builder.CreateIntCast(lhsV(), builder.getInt64Ty(), lhsSTy.isSigned());
1184 return {.value = builder.CreateGEP(rhsSTy.getContained().toLLVMType(irGenerator->sourceFile), rhsV(), lhsExt)};
1185 }
1186 1 case COMB(TY_BYTE, TY_BYTE): // fallthrough
1187 case COMB(TY_CHAR, TY_CHAR):
1188
6/16
✓ Branch 193 → 194 taken 1 time.
✗ Branch 193 → 291 not taken.
✗ Branch 194 → 195 not taken.
✓ Branch 194 → 198 taken 1 time.
✗ Branch 195 → 196 not taken.
✗ Branch 195 → 291 not taken.
✗ Branch 196 → 197 not taken.
✗ Branch 196 → 198 not taken.
✓ Branch 199 → 200 taken 1 time.
✗ Branch 199 → 276 not taken.
✓ Branch 200 → 201 taken 1 time.
✗ Branch 200 → 276 not taken.
✓ Branch 201 → 202 taken 1 time.
✗ Branch 201 → 276 not taken.
✓ Branch 202 → 203 taken 1 time.
✗ Branch 202 → 276 not taken.
1 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1189 879 case COMB(TY_PTR, TY_INT): // fallthrough
1190 case COMB(TY_PTR, TY_SHORT): // fallthrough
1191 case COMB(TY_PTR, TY_LONG): {
1192
5/10
✓ Branch 204 → 205 taken 879 times.
✗ Branch 204 → 277 not taken.
✓ Branch 205 → 206 taken 879 times.
✗ Branch 205 → 277 not taken.
✓ Branch 206 → 207 taken 879 times.
✗ Branch 206 → 277 not taken.
✓ Branch 207 → 208 taken 879 times.
✗ Branch 207 → 277 not taken.
✓ Branch 208 → 209 taken 879 times.
✗ Branch 208 → 277 not taken.
879 llvm::Value *rhsExt = builder.CreateIntCast(rhsV(), builder.getInt64Ty(), rhsSTy.isSigned());
1193
4/8
✓ Branch 212 → 213 taken 879 times.
✗ Branch 212 → 279 not taken.
✓ Branch 213 → 214 taken 879 times.
✗ Branch 213 → 278 not taken.
✓ Branch 214 → 215 taken 879 times.
✗ Branch 214 → 278 not taken.
✓ Branch 215 → 216 taken 879 times.
✗ Branch 215 → 278 not taken.
1758 return {.value = builder.CreateGEP(lhsSTy.getContained().toLLVMType(irGenerator->sourceFile), lhsV(), rhsExt)};
1194 }
1195 default: // GCOV_EXCL_LINE
1196 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: +"); // GCOV_EXCL_LINE
1197 }
1198
5/14
✓ Branch 12 → 13 taken 593 times.
✗ Branch 12 → 237 not taken.
✓ Branch 13 → 14 taken 593 times.
✗ Branch 13 → 237 not taken.
✓ Branch 14 → 15 taken 593 times.
✗ Branch 14 → 237 not taken.
✓ Branch 15 → 16 taken 593 times.
✗ Branch 15 → 237 not taken.
✓ Branch 16 → 17 taken 593 times.
✗ Branch 16 → 235 not taken.
✗ Branch 237 → 238 not taken.
✗ Branch 237 → 241 not taken.
✗ Branch 239 → 240 not taken.
✗ Branch 239 → 241 not taken.
7139 }
1199
1200 3681 LLVMExprResult OpRuleConversionManager::getMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
1201 LLVMExprResult &rhs, QualType rhsSTy, size_t opIdx) {
1202
1/2
✓ Branch 2 → 3 taken 3681 times.
✗ Branch 2 → 233 not taken.
7362 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1203
1/2
✓ Branch 3 → 4 taken 3681 times.
✗ Branch 3 → 234 not taken.
7362 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1204 3681 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1205 3681 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1206
1/2
✓ Branch 6 → 7 taken 3681 times.
✗ Branch 6 → 235 not taken.
3681 lhsSTy = lhsSTy.removeReferenceWrapper();
1207
1/2
✓ Branch 7 → 8 taken 3681 times.
✗ Branch 7 → 236 not taken.
3681 rhsSTy = rhsSTy.removeReferenceWrapper();
1208
1/2
✓ Branch 8 → 9 taken 3681 times.
✗ Branch 8 → 294 not taken.
3681 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1209
1/2
✓ Branch 9 → 10 taken 3681 times.
✗ Branch 9 → 294 not taken.
3681 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1210
1211 // Handle operator overloads
1212
3/4
✓ Branch 10 → 11 taken 3681 times.
✗ Branch 10 → 294 not taken.
✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 20 taken 3680 times.
3681 if (callsOverloadedOpFct(node, opIdx))
1213 1 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1214
1215
16/21
✓ Branch 20 → 21 taken 3680 times.
✗ Branch 20 → 294 not taken.
✓ Branch 21 → 22 taken 83 times.
✓ Branch 21 → 27 taken 14 times.
✓ Branch 21 → 33 taken 1 time.
✓ Branch 21 → 39 taken 73 times.
✓ Branch 21 → 50 taken 1 time.
✓ Branch 21 → 64 taken 1 time.
✗ Branch 21 → 78 not taken.
✓ Branch 21 → 91 taken 1 time.
✓ Branch 21 → 97 taken 1 time.
✓ Branch 21 → 111 taken 5 times.
✓ Branch 21 → 122 taken 5 times.
✗ Branch 21 → 136 not taken.
✓ Branch 21 → 149 taken 1 time.
✓ Branch 21 → 155 taken 169 times.
✓ Branch 21 → 169 taken 3321 times.
✗ Branch 21 → 180 not taken.
✓ Branch 21 → 193 taken 1 time.
✓ Branch 21 → 204 taken 3 times.
✗ Branch 21 → 219 not taken.
3680 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1216 83 case COMB(TY_DOUBLE, TY_DOUBLE):
1217
4/8
✓ Branch 22 → 23 taken 83 times.
✗ Branch 22 → 245 not taken.
✓ Branch 23 → 24 taken 83 times.
✗ Branch 23 → 245 not taken.
✓ Branch 24 → 25 taken 83 times.
✗ Branch 24 → 245 not taken.
✓ Branch 25 → 26 taken 83 times.
✗ Branch 25 → 245 not taken.
83 return {.value = builder.CreateFSub(lhsV(), rhsV())};
1218 14 case COMB(TY_DOUBLE, TY_INT): // fallthrough
1219 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
1220 case COMB(TY_DOUBLE, TY_LONG): {
1221
2/4
✓ Branch 27 → 28 taken 14 times.
✗ Branch 27 → 294 not taken.
✓ Branch 28 → 29 taken 14 times.
✗ Branch 28 → 294 not taken.
14 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
1222
3/6
✓ Branch 29 → 30 taken 14 times.
✗ Branch 29 → 246 not taken.
✓ Branch 30 → 31 taken 14 times.
✗ Branch 30 → 246 not taken.
✓ Branch 31 → 32 taken 14 times.
✗ Branch 31 → 246 not taken.
14 return {.value = builder.CreateFSub(lhsV(), rhsFP)};
1223 }
1224 1 case COMB(TY_INT, TY_DOUBLE): {
1225
2/4
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 294 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 294 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1226
3/6
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 247 not taken.
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 247 not taken.
✓ Branch 37 → 38 taken 1 time.
✗ Branch 37 → 247 not taken.
1 return {.value = builder.CreateFSub(lhsFP, rhsV())};
1227 }
1228 73 case COMB(TY_INT, TY_INT):
1229
8/16
✓ Branch 39 → 40 taken 73 times.
✗ Branch 39 → 294 not taken.
✓ Branch 40 → 41 taken 73 times.
✗ Branch 40 → 44 not taken.
✓ Branch 41 → 42 taken 73 times.
✗ Branch 41 → 294 not taken.
✓ Branch 42 → 43 taken 73 times.
✗ Branch 42 → 44 not taken.
✓ Branch 45 → 46 taken 73 times.
✗ Branch 45 → 248 not taken.
✓ Branch 46 → 47 taken 73 times.
✗ Branch 46 → 248 not taken.
✓ Branch 47 → 48 taken 73 times.
✗ Branch 47 → 248 not taken.
✓ Branch 48 → 49 taken 73 times.
✗ Branch 48 → 248 not taken.
73 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1230 1 case COMB(TY_INT, TY_SHORT): {
1231
5/10
✓ Branch 50 → 51 taken 1 time.
✗ Branch 50 → 249 not taken.
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 249 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 249 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 249 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 294 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1232
7/14
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 294 not taken.
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 59 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 294 not taken.
✓ Branch 57 → 58 taken 1 time.
✗ Branch 57 → 59 not taken.
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 250 not taken.
✓ Branch 61 → 62 taken 1 time.
✗ Branch 61 → 250 not taken.
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 250 not taken.
1 return {.value = builder.CreateSub(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1233 }
1234 1 case COMB(TY_INT, TY_LONG): {
1235
5/10
✓ Branch 64 → 65 taken 1 time.
✗ Branch 64 → 251 not taken.
✓ Branch 65 → 66 taken 1 time.
✗ Branch 65 → 251 not taken.
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 251 not taken.
✓ Branch 67 → 68 taken 1 time.
✗ Branch 67 → 251 not taken.
✓ Branch 68 → 69 taken 1 time.
✗ Branch 68 → 294 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1236
7/14
✓ Branch 68 → 69 taken 1 time.
✗ Branch 68 → 294 not taken.
✓ Branch 69 → 70 taken 1 time.
✗ Branch 69 → 73 not taken.
✓ Branch 70 → 71 taken 1 time.
✗ Branch 70 → 294 not taken.
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 73 not taken.
✓ Branch 74 → 75 taken 1 time.
✗ Branch 74 → 252 not taken.
✓ Branch 75 → 76 taken 1 time.
✗ Branch 75 → 252 not taken.
✓ Branch 76 → 77 taken 1 time.
✗ Branch 76 → 252 not taken.
1 return {.value = builder.CreateSub(lhsLong, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1237 }
1238 case COMB(TY_INT, TY_PTR): {
1239 llvm::Value *lhsExt = builder.CreateIntCast(lhsV(), builder.getInt64Ty(), lhsSTy.isSigned());
1240 return {.value = builder.CreateGEP(rhsSTy.getContained().toLLVMType(irGenerator->sourceFile), rhsV(), lhsExt)};
1241 }
1242 1 case COMB(TY_SHORT, TY_DOUBLE): {
1243
2/4
✓ Branch 91 → 92 taken 1 time.
✗ Branch 91 → 294 not taken.
✓ Branch 92 → 93 taken 1 time.
✗ Branch 92 → 294 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1244
3/6
✓ Branch 93 → 94 taken 1 time.
✗ Branch 93 → 258 not taken.
✓ Branch 94 → 95 taken 1 time.
✗ Branch 94 → 258 not taken.
✓ Branch 95 → 96 taken 1 time.
✗ Branch 95 → 258 not taken.
1 return {.value = builder.CreateFSub(lhsFP, rhsV())};
1245 }
1246 1 case COMB(TY_SHORT, TY_INT): {
1247
5/10
✓ Branch 97 → 98 taken 1 time.
✗ Branch 97 → 259 not taken.
✓ Branch 98 → 99 taken 1 time.
✗ Branch 98 → 259 not taken.
✓ Branch 99 → 100 taken 1 time.
✗ Branch 99 → 259 not taken.
✓ Branch 100 → 101 taken 1 time.
✗ Branch 100 → 259 not taken.
✓ Branch 101 → 102 taken 1 time.
✗ Branch 101 → 294 not taken.
1 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1248
7/14
✓ Branch 101 → 102 taken 1 time.
✗ Branch 101 → 294 not taken.
✓ Branch 102 → 103 taken 1 time.
✗ Branch 102 → 106 not taken.
✓ Branch 103 → 104 taken 1 time.
✗ Branch 103 → 294 not taken.
✓ Branch 104 → 105 taken 1 time.
✗ Branch 104 → 106 not taken.
✓ Branch 107 → 108 taken 1 time.
✗ Branch 107 → 260 not taken.
✓ Branch 108 → 109 taken 1 time.
✗ Branch 108 → 260 not taken.
✓ Branch 109 → 110 taken 1 time.
✗ Branch 109 → 260 not taken.
1 return {.value = builder.CreateSub(lhsInt, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1249 }
1250 5 case COMB(TY_SHORT, TY_SHORT):
1251
8/16
✓ Branch 111 → 112 taken 5 times.
✗ Branch 111 → 294 not taken.
✓ Branch 112 → 113 taken 5 times.
✗ Branch 112 → 116 not taken.
✓ Branch 113 → 114 taken 5 times.
✗ Branch 113 → 294 not taken.
✓ Branch 114 → 115 taken 5 times.
✗ Branch 114 → 116 not taken.
✓ Branch 117 → 118 taken 5 times.
✗ Branch 117 → 261 not taken.
✓ Branch 118 → 119 taken 5 times.
✗ Branch 118 → 261 not taken.
✓ Branch 119 → 120 taken 5 times.
✗ Branch 119 → 261 not taken.
✓ Branch 120 → 121 taken 5 times.
✗ Branch 120 → 261 not taken.
5 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1252 5 case COMB(TY_SHORT, TY_LONG): {
1253
5/10
✓ Branch 122 → 123 taken 5 times.
✗ Branch 122 → 262 not taken.
✓ Branch 123 → 124 taken 5 times.
✗ Branch 123 → 262 not taken.
✓ Branch 124 → 125 taken 5 times.
✗ Branch 124 → 262 not taken.
✓ Branch 125 → 126 taken 5 times.
✗ Branch 125 → 262 not taken.
✓ Branch 126 → 127 taken 5 times.
✗ Branch 126 → 294 not taken.
5 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1254
7/14
✓ Branch 126 → 127 taken 5 times.
✗ Branch 126 → 294 not taken.
✓ Branch 127 → 128 taken 5 times.
✗ Branch 127 → 131 not taken.
✓ Branch 128 → 129 taken 5 times.
✗ Branch 128 → 294 not taken.
✓ Branch 129 → 130 taken 5 times.
✗ Branch 129 → 131 not taken.
✓ Branch 132 → 133 taken 5 times.
✗ Branch 132 → 263 not taken.
✓ Branch 133 → 134 taken 5 times.
✗ Branch 133 → 263 not taken.
✓ Branch 134 → 135 taken 5 times.
✗ Branch 134 → 263 not taken.
5 return {.value = builder.CreateSub(lhsLong, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1255 }
1256 case COMB(TY_SHORT, TY_PTR): {
1257 llvm::Value *lhsExt = builder.CreateIntCast(lhsV(), builder.getInt64Ty(), lhsSTy.isSigned());
1258 return {.value = builder.CreateGEP(rhsSTy.getContained().toLLVMType(irGenerator->sourceFile), rhsV(), lhsExt)};
1259 }
1260 1 case COMB(TY_LONG, TY_DOUBLE): {
1261
2/4
✓ Branch 149 → 150 taken 1 time.
✗ Branch 149 → 294 not taken.
✓ Branch 150 → 151 taken 1 time.
✗ Branch 150 → 294 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1262
3/6
✓ Branch 151 → 152 taken 1 time.
✗ Branch 151 → 269 not taken.
✓ Branch 152 → 153 taken 1 time.
✗ Branch 152 → 269 not taken.
✓ Branch 153 → 154 taken 1 time.
✗ Branch 153 → 269 not taken.
1 return {.value = builder.CreateFSub(lhsFP, rhsV())};
1263 }
1264 169 case COMB(TY_LONG, TY_INT): // fallthrough
1265 case COMB(TY_LONG, TY_SHORT): {
1266
5/10
✓ Branch 155 → 156 taken 169 times.
✗ Branch 155 → 270 not taken.
✓ Branch 156 → 157 taken 169 times.
✗ Branch 156 → 270 not taken.
✓ Branch 157 → 158 taken 169 times.
✗ Branch 157 → 270 not taken.
✓ Branch 158 → 159 taken 169 times.
✗ Branch 158 → 270 not taken.
✓ Branch 159 → 160 taken 169 times.
✗ Branch 159 → 294 not taken.
169 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1267
8/14
✓ Branch 159 → 160 taken 169 times.
✗ Branch 159 → 294 not taken.
✓ Branch 160 → 161 taken 23 times.
✓ Branch 160 → 164 taken 146 times.
✓ Branch 161 → 162 taken 23 times.
✗ Branch 161 → 294 not taken.
✓ Branch 162 → 163 taken 23 times.
✗ Branch 162 → 164 not taken.
✓ Branch 165 → 166 taken 169 times.
✗ Branch 165 → 271 not taken.
✓ Branch 166 → 167 taken 169 times.
✗ Branch 166 → 271 not taken.
✓ Branch 167 → 168 taken 169 times.
✗ Branch 167 → 271 not taken.
169 return {.value = builder.CreateSub(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1268 }
1269 3321 case COMB(TY_LONG, TY_LONG):
1270
10/16
✓ Branch 169 → 170 taken 3321 times.
✗ Branch 169 → 294 not taken.
✓ Branch 170 → 171 taken 504 times.
✓ Branch 170 → 174 taken 2817 times.
✓ Branch 171 → 172 taken 504 times.
✗ Branch 171 → 294 not taken.
✓ Branch 172 → 173 taken 200 times.
✓ Branch 172 → 174 taken 304 times.
✓ Branch 175 → 176 taken 3321 times.
✗ Branch 175 → 272 not taken.
✓ Branch 176 → 177 taken 3321 times.
✗ Branch 176 → 272 not taken.
✓ Branch 177 → 178 taken 3321 times.
✗ Branch 177 → 272 not taken.
✓ Branch 178 → 179 taken 3321 times.
✗ Branch 178 → 272 not taken.
3321 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1271 case COMB(TY_LONG, TY_PTR): {
1272 llvm::Value *lhsExt = builder.CreateIntCast(lhsV(), builder.getInt64Ty(), lhsSTy.isSigned());
1273 return {.value = builder.CreateGEP(rhsSTy.getContained().toLLVMType(irGenerator->sourceFile), rhsV(), lhsExt)};
1274 }
1275 1 case COMB(TY_BYTE, TY_BYTE): // fallthrough
1276 case COMB(TY_CHAR, TY_CHAR):
1277
6/16
✓ Branch 193 → 194 taken 1 time.
✗ Branch 193 → 294 not taken.
✗ Branch 194 → 195 not taken.
✓ Branch 194 → 198 taken 1 time.
✗ Branch 195 → 196 not taken.
✗ Branch 195 → 294 not taken.
✗ Branch 196 → 197 not taken.
✗ Branch 196 → 198 not taken.
✓ Branch 199 → 200 taken 1 time.
✗ Branch 199 → 278 not taken.
✓ Branch 200 → 201 taken 1 time.
✗ Branch 200 → 278 not taken.
✓ Branch 201 → 202 taken 1 time.
✗ Branch 201 → 278 not taken.
✓ Branch 202 → 203 taken 1 time.
✗ Branch 202 → 278 not taken.
1 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1278 3 case COMB(TY_PTR, TY_INT): // fallthrough
1279 case COMB(TY_PTR, TY_SHORT): // fallthrough
1280 case COMB(TY_PTR, TY_LONG): {
1281
4/8
✓ Branch 204 → 205 taken 3 times.
✗ Branch 204 → 279 not taken.
✓ Branch 205 → 206 taken 3 times.
✗ Branch 205 → 279 not taken.
✓ Branch 206 → 207 taken 3 times.
✗ Branch 206 → 279 not taken.
✓ Branch 207 → 208 taken 3 times.
✗ Branch 207 → 280 not taken.
3 llvm::Value *rhsNeg = builder.CreateNeg(rhsV());
1282
4/8
✓ Branch 207 → 208 taken 3 times.
✗ Branch 207 → 280 not taken.
✓ Branch 208 → 209 taken 3 times.
✗ Branch 208 → 280 not taken.
✓ Branch 209 → 210 taken 3 times.
✗ Branch 209 → 280 not taken.
✓ Branch 210 → 211 taken 3 times.
✗ Branch 210 → 280 not taken.
3 llvm::Value *rhsExt = builder.CreateIntCast(rhsNeg, builder.getInt64Ty(), rhsSTy.isSigned());
1283
4/8
✓ Branch 214 → 215 taken 3 times.
✗ Branch 214 → 282 not taken.
✓ Branch 215 → 216 taken 3 times.
✗ Branch 215 → 281 not taken.
✓ Branch 216 → 217 taken 3 times.
✗ Branch 216 → 281 not taken.
✓ Branch 217 → 218 taken 3 times.
✗ Branch 217 → 281 not taken.
6 return {.value = builder.CreateGEP(lhsSTy.getContained().toLLVMType(irGenerator->sourceFile), lhsV(), rhsExt)};
1284 }
1285 default: // GCOV_EXCL_LINE
1286 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: -"); // GCOV_EXCL_LINE
1287 }
1288
5/14
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 239 not taken.
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 239 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 239 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 239 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 237 not taken.
✗ Branch 239 → 240 not taken.
✗ Branch 239 → 243 not taken.
✗ Branch 241 → 242 not taken.
✗ Branch 241 → 243 not taken.
3682 }
1289
1290 2292 LLVMExprResult OpRuleConversionManager::getMulInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
1291 QualType rhsSTy, size_t opIdx) {
1292
1/2
✓ Branch 2 → 3 taken 2292 times.
✗ Branch 2 → 168 not taken.
4579 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1293
1/2
✓ Branch 3 → 4 taken 2292 times.
✗ Branch 3 → 169 not taken.
4581 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1294 2297 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1295 2295 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1296
1/2
✓ Branch 6 → 7 taken 2292 times.
✗ Branch 6 → 170 not taken.
2292 lhsSTy = lhsSTy.removeReferenceWrapper();
1297
1/2
✓ Branch 7 → 8 taken 2292 times.
✗ Branch 7 → 171 not taken.
2292 rhsSTy = rhsSTy.removeReferenceWrapper();
1298
1/2
✓ Branch 8 → 9 taken 2292 times.
✗ Branch 8 → 207 not taken.
2292 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1299
1/2
✓ Branch 9 → 10 taken 2292 times.
✗ Branch 9 → 207 not taken.
2292 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1300
1301 // Handle operator overloads
1302
3/4
✓ Branch 10 → 11 taken 2292 times.
✗ Branch 10 → 207 not taken.
✓ Branch 11 → 12 taken 9 times.
✓ Branch 11 → 20 taken 2283 times.
2292 if (callsOverloadedOpFct(node, opIdx))
1303 9 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1304
1305
14/16
✓ Branch 20 → 21 taken 2283 times.
✗ Branch 20 → 207 not taken.
✓ Branch 21 → 22 taken 162 times.
✓ Branch 21 → 27 taken 8 times.
✓ Branch 21 → 33 taken 1 time.
✓ Branch 21 → 39 taken 118 times.
✓ Branch 21 → 50 taken 1 time.
✓ Branch 21 → 64 taken 3 times.
✓ Branch 21 → 78 taken 1 time.
✓ Branch 21 → 84 taken 1 time.
✓ Branch 21 → 98 taken 1 time.
✓ Branch 21 → 109 taken 2 times.
✓ Branch 21 → 123 taken 1 time.
✓ Branch 21 → 129 taken 1090 times.
✓ Branch 21 → 143 taken 894 times.
✗ Branch 21 → 154 not taken.
2283 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1306 162 case COMB(TY_DOUBLE, TY_DOUBLE):
1307
4/8
✓ Branch 22 → 23 taken 162 times.
✗ Branch 22 → 180 not taken.
✓ Branch 23 → 24 taken 162 times.
✗ Branch 23 → 180 not taken.
✓ Branch 24 → 25 taken 162 times.
✗ Branch 24 → 180 not taken.
✓ Branch 25 → 26 taken 162 times.
✗ Branch 25 → 180 not taken.
162 return {.value = builder.CreateFMul(lhsV(), rhsV())};
1308 8 case COMB(TY_DOUBLE, TY_INT): // fallthrough
1309 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
1310 case COMB(TY_DOUBLE, TY_LONG): {
1311
2/4
✓ Branch 27 → 28 taken 8 times.
✗ Branch 27 → 207 not taken.
✓ Branch 28 → 29 taken 8 times.
✗ Branch 28 → 207 not taken.
8 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
1312
3/6
✓ Branch 29 → 30 taken 8 times.
✗ Branch 29 → 181 not taken.
✓ Branch 30 → 31 taken 8 times.
✗ Branch 30 → 181 not taken.
✓ Branch 31 → 32 taken 8 times.
✗ Branch 31 → 181 not taken.
8 return {.value = builder.CreateFMul(lhsV(), rhsFP)};
1313 }
1314 1 case COMB(TY_INT, TY_DOUBLE): {
1315
2/4
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 207 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 207 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1316
3/6
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 182 not taken.
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 182 not taken.
✓ Branch 37 → 38 taken 1 time.
✗ Branch 37 → 182 not taken.
1 return {.value = builder.CreateFMul(lhsFP, rhsV())};
1317 }
1318 118 case COMB(TY_INT, TY_INT):
1319
10/16
✓ Branch 39 → 40 taken 118 times.
✗ Branch 39 → 207 not taken.
✓ Branch 40 → 41 taken 107 times.
✓ Branch 40 → 44 taken 11 times.
✓ Branch 41 → 42 taken 107 times.
✗ Branch 41 → 207 not taken.
✓ Branch 42 → 43 taken 60 times.
✓ Branch 42 → 44 taken 47 times.
✓ Branch 45 → 46 taken 118 times.
✗ Branch 45 → 183 not taken.
✓ Branch 46 → 47 taken 118 times.
✗ Branch 46 → 183 not taken.
✓ Branch 47 → 48 taken 118 times.
✗ Branch 47 → 183 not taken.
✓ Branch 48 → 49 taken 118 times.
✗ Branch 48 → 183 not taken.
118 return {.value = builder.CreateMul(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1320 1 case COMB(TY_INT, TY_SHORT): {
1321
5/10
✓ Branch 50 → 51 taken 1 time.
✗ Branch 50 → 184 not taken.
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 184 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 184 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 184 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 207 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1322
7/14
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 207 not taken.
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 59 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 207 not taken.
✓ Branch 57 → 58 taken 1 time.
✗ Branch 57 → 59 not taken.
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 185 not taken.
✓ Branch 61 → 62 taken 1 time.
✗ Branch 61 → 185 not taken.
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 185 not taken.
1 return {.value = builder.CreateMul(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1323 }
1324 3 case COMB(TY_INT, TY_LONG): {
1325
5/10
✓ Branch 64 → 65 taken 3 times.
✗ Branch 64 → 186 not taken.
✓ Branch 65 → 66 taken 3 times.
✗ Branch 65 → 186 not taken.
✓ Branch 66 → 67 taken 3 times.
✗ Branch 66 → 186 not taken.
✓ Branch 67 → 68 taken 3 times.
✗ Branch 67 → 186 not taken.
✓ Branch 68 → 69 taken 3 times.
✗ Branch 68 → 207 not taken.
3 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1326
8/14
✓ Branch 68 → 69 taken 3 times.
✗ Branch 68 → 207 not taken.
✓ Branch 69 → 70 taken 3 times.
✗ Branch 69 → 73 not taken.
✓ Branch 70 → 71 taken 3 times.
✗ Branch 70 → 207 not taken.
✓ Branch 71 → 72 taken 1 time.
✓ Branch 71 → 73 taken 2 times.
✓ Branch 74 → 75 taken 3 times.
✗ Branch 74 → 187 not taken.
✓ Branch 75 → 76 taken 3 times.
✗ Branch 75 → 187 not taken.
✓ Branch 76 → 77 taken 3 times.
✗ Branch 76 → 187 not taken.
3 return {.value = builder.CreateMul(lhsLong, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1327 }
1328 1 case COMB(TY_SHORT, TY_DOUBLE): {
1329
2/4
✓ Branch 78 → 79 taken 1 time.
✗ Branch 78 → 207 not taken.
✓ Branch 79 → 80 taken 1 time.
✗ Branch 79 → 207 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1330
3/6
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 188 not taken.
✓ Branch 81 → 82 taken 1 time.
✗ Branch 81 → 188 not taken.
✓ Branch 82 → 83 taken 1 time.
✗ Branch 82 → 188 not taken.
1 return {.value = builder.CreateFMul(lhsFP, rhsV())};
1331 }
1332 1 case COMB(TY_SHORT, TY_INT): {
1333
5/10
✓ Branch 84 → 85 taken 1 time.
✗ Branch 84 → 189 not taken.
✓ Branch 85 → 86 taken 1 time.
✗ Branch 85 → 189 not taken.
✓ Branch 86 → 87 taken 1 time.
✗ Branch 86 → 189 not taken.
✓ Branch 87 → 88 taken 1 time.
✗ Branch 87 → 189 not taken.
✓ Branch 88 → 89 taken 1 time.
✗ Branch 88 → 207 not taken.
1 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1334
7/14
✓ Branch 88 → 89 taken 1 time.
✗ Branch 88 → 207 not taken.
✓ Branch 89 → 90 taken 1 time.
✗ Branch 89 → 93 not taken.
✓ Branch 90 → 91 taken 1 time.
✗ Branch 90 → 207 not taken.
✓ Branch 91 → 92 taken 1 time.
✗ Branch 91 → 93 not taken.
✓ Branch 94 → 95 taken 1 time.
✗ Branch 94 → 190 not taken.
✓ Branch 95 → 96 taken 1 time.
✗ Branch 95 → 190 not taken.
✓ Branch 96 → 97 taken 1 time.
✗ Branch 96 → 190 not taken.
1 return {.value = builder.CreateMul(lhsInt, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1335 }
1336 1 case COMB(TY_SHORT, TY_SHORT):
1337
8/16
✓ Branch 98 → 99 taken 1 time.
✗ Branch 98 → 207 not taken.
✓ Branch 99 → 100 taken 1 time.
✗ Branch 99 → 103 not taken.
✓ Branch 100 → 101 taken 1 time.
✗ Branch 100 → 207 not taken.
✓ Branch 101 → 102 taken 1 time.
✗ Branch 101 → 103 not taken.
✓ Branch 104 → 105 taken 1 time.
✗ Branch 104 → 191 not taken.
✓ Branch 105 → 106 taken 1 time.
✗ Branch 105 → 191 not taken.
✓ Branch 106 → 107 taken 1 time.
✗ Branch 106 → 191 not taken.
✓ Branch 107 → 108 taken 1 time.
✗ Branch 107 → 191 not taken.
1 return {.value = builder.CreateMul(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1338 2 case COMB(TY_SHORT, TY_LONG): {
1339
5/10
✓ Branch 109 → 110 taken 2 times.
✗ Branch 109 → 192 not taken.
✓ Branch 110 → 111 taken 2 times.
✗ Branch 110 → 192 not taken.
✓ Branch 111 → 112 taken 2 times.
✗ Branch 111 → 192 not taken.
✓ Branch 112 → 113 taken 2 times.
✗ Branch 112 → 192 not taken.
✓ Branch 113 → 114 taken 2 times.
✗ Branch 113 → 207 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1340
8/14
✓ Branch 113 → 114 taken 2 times.
✗ Branch 113 → 207 not taken.
✓ Branch 114 → 115 taken 2 times.
✗ Branch 114 → 118 not taken.
✓ Branch 115 → 116 taken 2 times.
✗ Branch 115 → 207 not taken.
✓ Branch 116 → 117 taken 1 time.
✓ Branch 116 → 118 taken 1 time.
✓ Branch 119 → 120 taken 2 times.
✗ Branch 119 → 193 not taken.
✓ Branch 120 → 121 taken 2 times.
✗ Branch 120 → 193 not taken.
✓ Branch 121 → 122 taken 2 times.
✗ Branch 121 → 193 not taken.
2 return {.value = builder.CreateMul(lhsLong, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1341 }
1342 1 case COMB(TY_LONG, TY_DOUBLE): {
1343
2/4
✓ Branch 123 → 124 taken 1 time.
✗ Branch 123 → 207 not taken.
✓ Branch 124 → 125 taken 1 time.
✗ Branch 124 → 207 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1344
3/6
✓ Branch 125 → 126 taken 1 time.
✗ Branch 125 → 194 not taken.
✓ Branch 126 → 127 taken 1 time.
✗ Branch 126 → 194 not taken.
✓ Branch 127 → 128 taken 1 time.
✗ Branch 127 → 194 not taken.
1 return {.value = builder.CreateFMul(lhsFP, rhsV())};
1345 }
1346 1090 case COMB(TY_LONG, TY_INT): // fallthrough
1347 case COMB(TY_LONG, TY_SHORT): {
1348
5/10
✓ Branch 129 → 130 taken 1090 times.
✗ Branch 129 → 195 not taken.
✓ Branch 130 → 131 taken 1090 times.
✗ Branch 130 → 195 not taken.
✓ Branch 131 → 132 taken 1090 times.
✗ Branch 131 → 195 not taken.
✓ Branch 132 → 133 taken 1090 times.
✗ Branch 132 → 195 not taken.
✓ Branch 133 → 134 taken 1090 times.
✗ Branch 133 → 207 not taken.
1090 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1349
8/14
✓ Branch 133 → 134 taken 1090 times.
✗ Branch 133 → 207 not taken.
✓ Branch 134 → 135 taken 5 times.
✓ Branch 134 → 138 taken 1085 times.
✓ Branch 135 → 136 taken 5 times.
✗ Branch 135 → 207 not taken.
✓ Branch 136 → 137 taken 5 times.
✗ Branch 136 → 138 not taken.
✓ Branch 139 → 140 taken 1090 times.
✗ Branch 139 → 196 not taken.
✓ Branch 140 → 141 taken 1090 times.
✗ Branch 140 → 196 not taken.
✓ Branch 141 → 142 taken 1090 times.
✗ Branch 141 → 196 not taken.
1090 return {.value = builder.CreateMul(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1350 }
1351 894 case COMB(TY_LONG, TY_LONG): // fallthrough
1352 case COMB(TY_BYTE, TY_BYTE):
1353
10/16
✓ Branch 143 → 144 taken 894 times.
✗ Branch 143 → 207 not taken.
✓ Branch 144 → 145 taken 245 times.
✓ Branch 144 → 148 taken 649 times.
✓ Branch 145 → 146 taken 245 times.
✗ Branch 145 → 207 not taken.
✓ Branch 146 → 147 taken 33 times.
✓ Branch 146 → 148 taken 212 times.
✓ Branch 149 → 150 taken 894 times.
✗ Branch 149 → 197 not taken.
✓ Branch 150 → 151 taken 894 times.
✗ Branch 150 → 197 not taken.
✓ Branch 151 → 152 taken 894 times.
✗ Branch 151 → 197 not taken.
✓ Branch 152 → 153 taken 894 times.
✗ Branch 152 → 197 not taken.
894 return {.value = builder.CreateMul(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1354 default: // GCOV_EXCL_LINE
1355 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: *"); // GCOV_EXCL_LINE
1356 }
1357
5/14
✓ Branch 12 → 13 taken 9 times.
✗ Branch 12 → 174 not taken.
✓ Branch 13 → 14 taken 9 times.
✗ Branch 13 → 174 not taken.
✓ Branch 14 → 15 taken 9 times.
✗ Branch 14 → 174 not taken.
✓ Branch 15 → 16 taken 9 times.
✗ Branch 15 → 174 not taken.
✓ Branch 16 → 17 taken 9 times.
✗ Branch 16 → 172 not taken.
✗ Branch 174 → 175 not taken.
✗ Branch 174 → 178 not taken.
✗ Branch 176 → 177 not taken.
✗ Branch 176 → 178 not taken.
2301 }
1358
1359 506 LLVMExprResult OpRuleConversionManager::getDivInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
1360 QualType rhsSTy, size_t opIdx) {
1361
1/2
✓ Branch 2 → 3 taken 506 times.
✗ Branch 2 → 120 not taken.
1008 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1362
1/2
✓ Branch 3 → 4 taken 506 times.
✗ Branch 3 → 121 not taken.
1012 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1363 510 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1364 506 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1365
1/2
✓ Branch 6 → 7 taken 506 times.
✗ Branch 6 → 122 not taken.
506 lhsSTy = lhsSTy.removeReferenceWrapper();
1366
1/2
✓ Branch 7 → 8 taken 506 times.
✗ Branch 7 → 123 not taken.
506 rhsSTy = rhsSTy.removeReferenceWrapper();
1367
1/2
✓ Branch 8 → 9 taken 506 times.
✗ Branch 8 → 159 not taken.
506 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1368
1/2
✓ Branch 9 → 10 taken 506 times.
✗ Branch 9 → 159 not taken.
506 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1369
1370 // Handle operator overloads
1371
3/4
✓ Branch 10 → 11 taken 506 times.
✗ Branch 10 → 159 not taken.
✓ Branch 11 → 12 taken 5 times.
✓ Branch 11 → 20 taken 501 times.
506 if (callsOverloadedOpFct(node, opIdx))
1372 5 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1373
1374
14/16
✓ Branch 20 → 21 taken 501 times.
✗ Branch 20 → 159 not taken.
✓ Branch 21 → 22 taken 250 times.
✓ Branch 21 → 27 taken 8 times.
✓ Branch 21 → 33 taken 10 times.
✓ Branch 21 → 39 taken 8 times.
✓ Branch 21 → 44 taken 1 time.
✓ Branch 21 → 52 taken 1 time.
✓ Branch 21 → 60 taken 1 time.
✓ Branch 21 → 66 taken 3 times.
✓ Branch 21 → 74 taken 1 time.
✓ Branch 21 → 79 taken 1 time.
✓ Branch 21 → 87 taken 3 times.
✓ Branch 21 → 93 taken 16 times.
✓ Branch 21 → 101 taken 198 times.
✗ Branch 21 → 106 not taken.
501 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1375 250 case COMB(TY_DOUBLE, TY_DOUBLE):
1376
4/8
✓ Branch 22 → 23 taken 250 times.
✗ Branch 22 → 132 not taken.
✓ Branch 23 → 24 taken 250 times.
✗ Branch 23 → 132 not taken.
✓ Branch 24 → 25 taken 250 times.
✗ Branch 24 → 132 not taken.
✓ Branch 25 → 26 taken 250 times.
✗ Branch 25 → 132 not taken.
250 return {.value = builder.CreateFDiv(lhsV(), rhsV())};
1377 8 case COMB(TY_DOUBLE, TY_INT): // fallthrough
1378 case COMB(TY_DOUBLE, TY_SHORT): // fallthrough
1379 case COMB(TY_DOUBLE, TY_LONG): {
1380
2/4
✓ Branch 27 → 28 taken 8 times.
✗ Branch 27 → 159 not taken.
✓ Branch 28 → 29 taken 8 times.
✗ Branch 28 → 159 not taken.
8 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
1381
3/6
✓ Branch 29 → 30 taken 8 times.
✗ Branch 29 → 133 not taken.
✓ Branch 30 → 31 taken 8 times.
✗ Branch 30 → 133 not taken.
✓ Branch 31 → 32 taken 8 times.
✗ Branch 31 → 133 not taken.
8 return {.value = builder.CreateFDiv(lhsV(), rhsFP)};
1382 }
1383 10 case COMB(TY_INT, TY_DOUBLE): {
1384
2/4
✓ Branch 33 → 34 taken 10 times.
✗ Branch 33 → 159 not taken.
✓ Branch 34 → 35 taken 10 times.
✗ Branch 34 → 159 not taken.
10 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1385
3/6
✓ Branch 35 → 36 taken 10 times.
✗ Branch 35 → 134 not taken.
✓ Branch 36 → 37 taken 10 times.
✗ Branch 36 → 134 not taken.
✓ Branch 37 → 38 taken 10 times.
✗ Branch 37 → 134 not taken.
10 return {.value = builder.CreateFDiv(lhsFP, rhsV())};
1386 }
1387 8 case COMB(TY_INT, TY_INT):
1388
4/8
✓ Branch 39 → 40 taken 8 times.
✗ Branch 39 → 135 not taken.
✓ Branch 40 → 41 taken 8 times.
✗ Branch 40 → 135 not taken.
✓ Branch 41 → 42 taken 8 times.
✗ Branch 41 → 135 not taken.
✓ Branch 42 → 43 taken 8 times.
✗ Branch 42 → 135 not taken.
8 return {.value = builder.CreateSDiv(lhsV(), rhsV())};
1389 1 case COMB(TY_INT, TY_SHORT): {
1390
5/10
✓ Branch 44 → 45 taken 1 time.
✗ Branch 44 → 136 not taken.
✓ Branch 45 → 46 taken 1 time.
✗ Branch 45 → 136 not taken.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 136 not taken.
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 136 not taken.
✓ Branch 48 → 49 taken 1 time.
✗ Branch 48 → 137 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1391
3/6
✓ Branch 48 → 49 taken 1 time.
✗ Branch 48 → 137 not taken.
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 137 not taken.
✓ Branch 50 → 51 taken 1 time.
✗ Branch 50 → 137 not taken.
1 return {.value = builder.CreateSDiv(lhsV(), rhsInt)};
1392 }
1393 1 case COMB(TY_INT, TY_LONG): {
1394
5/10
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 138 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 138 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 138 not taken.
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 138 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 139 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1395
3/6
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 139 not taken.
✓ Branch 57 → 58 taken 1 time.
✗ Branch 57 → 139 not taken.
✓ Branch 58 → 59 taken 1 time.
✗ Branch 58 → 139 not taken.
1 return {.value = builder.CreateSDiv(lhsLong, rhsV())};
1396 }
1397 1 case COMB(TY_SHORT, TY_DOUBLE): {
1398
2/4
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 159 not taken.
✓ Branch 61 → 62 taken 1 time.
✗ Branch 61 → 159 not taken.
1 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1399
3/6
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 140 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 140 not taken.
✓ Branch 64 → 65 taken 1 time.
✗ Branch 64 → 140 not taken.
1 return {.value = builder.CreateFDiv(lhsFP, rhsV())};
1400 }
1401 3 case COMB(TY_SHORT, TY_INT): {
1402
5/10
✓ Branch 66 → 67 taken 3 times.
✗ Branch 66 → 141 not taken.
✓ Branch 67 → 68 taken 3 times.
✗ Branch 67 → 141 not taken.
✓ Branch 68 → 69 taken 3 times.
✗ Branch 68 → 141 not taken.
✓ Branch 69 → 70 taken 3 times.
✗ Branch 69 → 141 not taken.
✓ Branch 70 → 71 taken 3 times.
✗ Branch 70 → 142 not taken.
3 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1403
3/6
✓ Branch 70 → 71 taken 3 times.
✗ Branch 70 → 142 not taken.
✓ Branch 71 → 72 taken 3 times.
✗ Branch 71 → 142 not taken.
✓ Branch 72 → 73 taken 3 times.
✗ Branch 72 → 142 not taken.
3 return {.value = builder.CreateSDiv(lhsInt, rhsV())};
1404 }
1405 1 case COMB(TY_SHORT, TY_SHORT):
1406
4/8
✓ Branch 74 → 75 taken 1 time.
✗ Branch 74 → 143 not taken.
✓ Branch 75 → 76 taken 1 time.
✗ Branch 75 → 143 not taken.
✓ Branch 76 → 77 taken 1 time.
✗ Branch 76 → 143 not taken.
✓ Branch 77 → 78 taken 1 time.
✗ Branch 77 → 143 not taken.
1 return {.value = builder.CreateSDiv(lhsV(), rhsV())};
1407 1 case COMB(TY_SHORT, TY_LONG): {
1408
5/10
✓ Branch 79 → 80 taken 1 time.
✗ Branch 79 → 144 not taken.
✓ Branch 80 → 81 taken 1 time.
✗ Branch 80 → 144 not taken.
✓ Branch 81 → 82 taken 1 time.
✗ Branch 81 → 144 not taken.
✓ Branch 82 → 83 taken 1 time.
✗ Branch 82 → 144 not taken.
✓ Branch 83 → 84 taken 1 time.
✗ Branch 83 → 145 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1409
3/6
✓ Branch 83 → 84 taken 1 time.
✗ Branch 83 → 145 not taken.
✓ Branch 84 → 85 taken 1 time.
✗ Branch 84 → 145 not taken.
✓ Branch 85 → 86 taken 1 time.
✗ Branch 85 → 145 not taken.
1 return {.value = builder.CreateSDiv(lhsLong, rhsV())};
1410 }
1411 3 case COMB(TY_LONG, TY_DOUBLE): {
1412
2/4
✓ Branch 87 → 88 taken 3 times.
✗ Branch 87 → 159 not taken.
✓ Branch 88 → 89 taken 3 times.
✗ Branch 88 → 159 not taken.
3 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1413
3/6
✓ Branch 89 → 90 taken 3 times.
✗ Branch 89 → 146 not taken.
✓ Branch 90 → 91 taken 3 times.
✗ Branch 90 → 146 not taken.
✓ Branch 91 → 92 taken 3 times.
✗ Branch 91 → 146 not taken.
3 return {.value = builder.CreateFDiv(lhsFP, rhsV())};
1414 }
1415 16 case COMB(TY_LONG, TY_INT): // fallthrough
1416 case COMB(TY_LONG, TY_SHORT): {
1417
5/10
✓ Branch 93 → 94 taken 16 times.
✗ Branch 93 → 147 not taken.
✓ Branch 94 → 95 taken 16 times.
✗ Branch 94 → 147 not taken.
✓ Branch 95 → 96 taken 16 times.
✗ Branch 95 → 147 not taken.
✓ Branch 96 → 97 taken 16 times.
✗ Branch 96 → 147 not taken.
✓ Branch 97 → 98 taken 16 times.
✗ Branch 97 → 148 not taken.
16 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1418
3/6
✓ Branch 97 → 98 taken 16 times.
✗ Branch 97 → 148 not taken.
✓ Branch 98 → 99 taken 16 times.
✗ Branch 98 → 148 not taken.
✓ Branch 99 → 100 taken 16 times.
✗ Branch 99 → 148 not taken.
16 return {.value = builder.CreateSDiv(lhsV(), rhsLong)};
1419 }
1420 198 case COMB(TY_LONG, TY_LONG): // fallthrough
1421 case COMB(TY_BYTE, TY_BYTE): // fallthrough
1422 case COMB(TY_CHAR, TY_CHAR):
1423
4/8
✓ Branch 101 → 102 taken 198 times.
✗ Branch 101 → 149 not taken.
✓ Branch 102 → 103 taken 198 times.
✗ Branch 102 → 149 not taken.
✓ Branch 103 → 104 taken 198 times.
✗ Branch 103 → 149 not taken.
✓ Branch 104 → 105 taken 198 times.
✗ Branch 104 → 149 not taken.
198 return {.value = builder.CreateSDiv(lhsV(), rhsV())};
1424 default: // GCOV_EXCL_LINE
1425 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: /"); // GCOV_EXCL_LINE
1426 }
1427
5/14
✓ Branch 12 → 13 taken 5 times.
✗ Branch 12 → 126 not taken.
✓ Branch 13 → 14 taken 5 times.
✗ Branch 13 → 126 not taken.
✓ Branch 14 → 15 taken 5 times.
✗ Branch 14 → 126 not taken.
✓ Branch 15 → 16 taken 5 times.
✗ Branch 15 → 126 not taken.
✓ Branch 16 → 17 taken 5 times.
✗ Branch 16 → 124 not taken.
✗ Branch 126 → 127 not taken.
✗ Branch 126 → 130 not taken.
✗ Branch 128 → 129 not taken.
✗ Branch 128 → 130 not taken.
511 }
1428
1429 128 LLVMExprResult OpRuleConversionManager::getRemInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
1430 QualType rhsSTy) const {
1431
1/2
✓ Branch 2 → 3 taken 128 times.
✗ Branch 2 → 77 not taken.
256 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1432
1/2
✓ Branch 3 → 4 taken 128 times.
✗ Branch 3 → 78 not taken.
256 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1433
1/2
✓ Branch 4 → 5 taken 128 times.
✗ Branch 4 → 79 not taken.
128 lhsSTy = lhsSTy.removeReferenceWrapper();
1434
1/2
✓ Branch 5 → 6 taken 128 times.
✗ Branch 5 → 80 not taken.
128 rhsSTy = rhsSTy.removeReferenceWrapper();
1435
1/2
✓ Branch 6 → 7 taken 128 times.
✗ Branch 6 → 96 not taken.
128 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1436
1/2
✓ Branch 7 → 8 taken 128 times.
✗ Branch 7 → 96 not taken.
128 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1437
1438
10/12
✓ Branch 8 → 9 taken 128 times.
✗ Branch 8 → 96 not taken.
✓ Branch 9 → 10 taken 1 time.
✓ Branch 9 → 18 taken 33 times.
✓ Branch 9 → 22 taken 1 time.
✓ Branch 9 → 29 taken 1 time.
✓ Branch 9 → 36 taken 1 time.
✓ Branch 9 → 43 taken 1 time.
✓ Branch 9 → 47 taken 1 time.
✓ Branch 9 → 54 taken 2 times.
✓ Branch 9 → 61 taken 87 times.
✗ Branch 9 → 65 not taken.
128 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1439 1 case COMB(TY_DOUBLE, TY_DOUBLE): {
1440 // LLVM generates a call to fmod on Linux systems
1441
1/2
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 13 not taken.
1 if (irGenerator->cliOptions.targetTriple.isOSLinux())
1442
1/2
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 96 not taken.
1 irGenerator->resourceManager.linker.requestLibMathLinkage();
1443
4/8
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 81 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 81 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 81 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 81 not taken.
1 return {.value = builder.CreateFRem(lhsV(), rhsV())};
1444 }
1445 33 case COMB(TY_INT, TY_INT):
1446
3/6
✓ Branch 18 → 19 taken 33 times.
✗ Branch 18 → 96 not taken.
✓ Branch 19 → 20 taken 33 times.
✗ Branch 19 → 96 not taken.
✓ Branch 20 → 21 taken 33 times.
✗ Branch 20 → 96 not taken.
33 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsV())};
1447 1 case COMB(TY_INT, TY_SHORT): {
1448
5/10
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 82 not taken.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 82 not taken.
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 82 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 82 not taken.
✓ Branch 26 → 27 taken 1 time.
✗ Branch 26 → 96 not taken.
1 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1449
2/4
✓ Branch 26 → 27 taken 1 time.
✗ Branch 26 → 96 not taken.
✓ Branch 27 → 28 taken 1 time.
✗ Branch 27 → 96 not taken.
1 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsInt)};
1450 }
1451 1 case COMB(TY_INT, TY_LONG): {
1452
5/10
✓ Branch 29 → 30 taken 1 time.
✗ Branch 29 → 83 not taken.
✓ Branch 30 → 31 taken 1 time.
✗ Branch 30 → 83 not taken.
✓ Branch 31 → 32 taken 1 time.
✗ Branch 31 → 83 not taken.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 83 not taken.
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 96 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1453
2/4
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 96 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 96 not taken.
1 return {.value = generateRem(lhsSTy, rhsSTy, lhsLong, rhsV())};
1454 }
1455 1 case COMB(TY_SHORT, TY_INT): {
1456
5/10
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 84 not taken.
✓ Branch 37 → 38 taken 1 time.
✗ Branch 37 → 84 not taken.
✓ Branch 38 → 39 taken 1 time.
✗ Branch 38 → 84 not taken.
✓ Branch 39 → 40 taken 1 time.
✗ Branch 39 → 84 not taken.
✓ Branch 40 → 41 taken 1 time.
✗ Branch 40 → 96 not taken.
1 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1457
2/4
✓ Branch 40 → 41 taken 1 time.
✗ Branch 40 → 96 not taken.
✓ Branch 41 → 42 taken 1 time.
✗ Branch 41 → 96 not taken.
1 return {.value = generateRem(lhsSTy, rhsSTy, lhsInt, rhsV())};
1458 }
1459 1 case COMB(TY_SHORT, TY_SHORT):
1460
3/6
✓ Branch 43 → 44 taken 1 time.
✗ Branch 43 → 96 not taken.
✓ Branch 44 → 45 taken 1 time.
✗ Branch 44 → 96 not taken.
✓ Branch 45 → 46 taken 1 time.
✗ Branch 45 → 96 not taken.
1 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsV())};
1461 1 case COMB(TY_SHORT, TY_LONG): {
1462
5/10
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 85 not taken.
✓ Branch 48 → 49 taken 1 time.
✗ Branch 48 → 85 not taken.
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 85 not taken.
✓ Branch 50 → 51 taken 1 time.
✗ Branch 50 → 85 not taken.
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 96 not taken.
1 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1463
2/4
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 96 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 96 not taken.
1 return {.value = generateRem(lhsSTy, rhsSTy, lhsLong, rhsV())};
1464 }
1465 2 case COMB(TY_LONG, TY_INT): // fallthrough
1466 case COMB(TY_LONG, TY_SHORT): {
1467
5/10
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 86 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 86 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 86 not taken.
✓ Branch 57 → 58 taken 2 times.
✗ Branch 57 → 86 not taken.
✓ Branch 58 → 59 taken 2 times.
✗ Branch 58 → 96 not taken.
2 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1468
2/4
✓ Branch 58 → 59 taken 2 times.
✗ Branch 58 → 96 not taken.
✓ Branch 59 → 60 taken 2 times.
✗ Branch 59 → 96 not taken.
2 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsLong)};
1469 }
1470 87 case COMB(TY_LONG, TY_LONG):
1471
3/6
✓ Branch 61 → 62 taken 87 times.
✗ Branch 61 → 96 not taken.
✓ Branch 62 → 63 taken 87 times.
✗ Branch 62 → 96 not taken.
✓ Branch 63 → 64 taken 87 times.
✗ Branch 63 → 96 not taken.
87 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsV())};
1472 default: // GCOV_EXCL_LINE
1473 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: %"); // GCOV_EXCL_LINE
1474 }
1475 128 }
1476
1477 1004 LLVMExprResult OpRuleConversionManager::getPrefixMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1478
1/2
✓ Branch 2 → 3 taken 1004 times.
✗ Branch 2 → 25 not taken.
2008 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1479
1/2
✓ Branch 3 → 4 taken 1004 times.
✗ Branch 3 → 26 not taken.
1004 lhsSTy = lhsSTy.removeReferenceWrapper();
1480
1481
3/5
✓ Branch 4 → 5 taken 1004 times.
✗ Branch 4 → 38 not taken.
✓ Branch 5 → 6 taken 283 times.
✓ Branch 5 → 10 taken 721 times.
✗ Branch 5 → 14 not taken.
1004 switch (lhsSTy.getSuperType()) {
1482 283 case TY_DOUBLE:
1483
3/6
✓ Branch 6 → 7 taken 283 times.
✗ Branch 6 → 27 not taken.
✓ Branch 7 → 8 taken 283 times.
✗ Branch 7 → 27 not taken.
✓ Branch 8 → 9 taken 283 times.
✗ Branch 8 → 27 not taken.
283 return {.value = builder.CreateFNeg(lhsV())};
1484 721 case TY_INT: // fallthrough
1485 case TY_SHORT: // fallthrough
1486 case TY_LONG:
1487
3/6
✓ Branch 10 → 11 taken 721 times.
✗ Branch 10 → 28 not taken.
✓ Branch 11 → 12 taken 721 times.
✗ Branch 11 → 28 not taken.
✓ Branch 12 → 13 taken 721 times.
✗ Branch 12 → 28 not taken.
721 return {.value = builder.CreateNeg(lhsV(), "")};
1488 default: // GCOV_EXCL_LINE
1489 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: -"); // GCOV_EXCL_LINE
1490 }
1491 1004 }
1492
1493 83 LLVMExprResult OpRuleConversionManager::getPrefixPlusPlusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1494
1/2
✓ Branch 2 → 3 taken 83 times.
✗ Branch 2 → 44 not taken.
166 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1495
1/2
✓ Branch 3 → 4 taken 83 times.
✗ Branch 3 → 45 not taken.
83 lhsSTy = lhsSTy.removeReferenceWrapper();
1496
1497
4/7
✓ Branch 4 → 5 taken 83 times.
✗ Branch 4 → 62 not taken.
✓ Branch 5 → 6 taken 7 times.
✓ Branch 5 → 12 taken 1 time.
✓ Branch 5 → 18 taken 75 times.
✗ Branch 5 → 24 not taken.
✗ Branch 5 → 33 not taken.
83 switch (lhsSTy.getSuperType()) {
1498 7 case TY_INT:
1499
5/10
✓ Branch 6 → 7 taken 7 times.
✗ Branch 6 → 62 not taken.
✓ Branch 7 → 8 taken 7 times.
✗ Branch 7 → 46 not taken.
✓ Branch 8 → 9 taken 7 times.
✗ Branch 8 → 46 not taken.
✓ Branch 9 → 10 taken 7 times.
✗ Branch 9 → 46 not taken.
✓ Branch 10 → 11 taken 7 times.
✗ Branch 10 → 46 not taken.
7 return {.value = builder.CreateAdd(lhsV(), builder.getInt32(1), "", false, lhsSTy.isSigned())};
1500 1 case TY_SHORT:
1501
5/10
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 62 not taken.
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 47 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 47 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 47 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 47 not taken.
1 return {.value = builder.CreateAdd(lhsV(), builder.getInt16(1), "", false, lhsSTy.isSigned())};
1502 75 case TY_LONG:
1503
5/10
✓ Branch 18 → 19 taken 75 times.
✗ Branch 18 → 62 not taken.
✓ Branch 19 → 20 taken 75 times.
✗ Branch 19 → 48 not taken.
✓ Branch 20 → 21 taken 75 times.
✗ Branch 20 → 48 not taken.
✓ Branch 21 → 22 taken 75 times.
✗ Branch 21 → 48 not taken.
✓ Branch 22 → 23 taken 75 times.
✗ Branch 22 → 48 not taken.
75 return {.value = builder.CreateAdd(lhsV(), builder.getInt64(1), "", false, lhsSTy.isSigned())};
1504 case TY_PTR: {
1505 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
1506 return {.value = builder.CreateGEP(elementTy, lhsV(), builder.getInt64(1))};
1507 }
1508 default: // GCOV_EXCL_LINE
1509 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: ++ (prefix)"); // GCOV_EXCL_LINE
1510 }
1511 83 }
1512
1513 12 LLVMExprResult OpRuleConversionManager::getPrefixMinusMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1514
1/2
✓ Branch 2 → 3 taken 12 times.
✗ Branch 2 → 44 not taken.
24 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1515
1/2
✓ Branch 3 → 4 taken 12 times.
✗ Branch 3 → 45 not taken.
12 lhsSTy = lhsSTy.removeReferenceWrapper();
1516
1517
4/7
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 62 not taken.
✓ Branch 5 → 6 taken 4 times.
✓ Branch 5 → 12 taken 1 time.
✓ Branch 5 → 18 taken 7 times.
✗ Branch 5 → 24 not taken.
✗ Branch 5 → 33 not taken.
12 switch (lhsSTy.getSuperType()) {
1518 4 case TY_INT:
1519
5/10
✓ Branch 6 → 7 taken 4 times.
✗ Branch 6 → 62 not taken.
✓ Branch 7 → 8 taken 4 times.
✗ Branch 7 → 46 not taken.
✓ Branch 8 → 9 taken 4 times.
✗ Branch 8 → 46 not taken.
✓ Branch 9 → 10 taken 4 times.
✗ Branch 9 → 46 not taken.
✓ Branch 10 → 11 taken 4 times.
✗ Branch 10 → 46 not taken.
4 return {.value = builder.CreateSub(lhsV(), builder.getInt32(1), "", false, lhsSTy.isSigned())};
1520 1 case TY_SHORT:
1521
5/10
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 62 not taken.
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 47 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 47 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 47 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 47 not taken.
1 return {.value = builder.CreateSub(lhsV(), builder.getInt16(1), "", false, lhsSTy.isSigned())};
1522 7 case TY_LONG:
1523
5/10
✓ Branch 18 → 19 taken 7 times.
✗ Branch 18 → 62 not taken.
✓ Branch 19 → 20 taken 7 times.
✗ Branch 19 → 48 not taken.
✓ Branch 20 → 21 taken 7 times.
✗ Branch 20 → 48 not taken.
✓ Branch 21 → 22 taken 7 times.
✗ Branch 21 → 48 not taken.
✓ Branch 22 → 23 taken 7 times.
✗ Branch 22 → 48 not taken.
7 return {.value = builder.CreateSub(lhsV(), builder.getInt64(1), "", false, lhsSTy.isSigned())};
1524 case TY_PTR: {
1525 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
1526 return {.value = builder.CreateGEP(elementTy, lhsV(), builder.getInt64(-1))};
1527 }
1528 default: // GCOV_EXCL_LINE
1529 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: -- (prefix)"); // GCOV_EXCL_LINE
1530 }
1531 12 }
1532
1533 3441 LLVMExprResult OpRuleConversionManager::getPrefixNotInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1534
1/2
✓ Branch 2 → 3 taken 3441 times.
✗ Branch 2 → 20 not taken.
6882 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1535
1/2
✓ Branch 3 → 4 taken 3441 times.
✗ Branch 3 → 21 not taken.
3441 lhsSTy = lhsSTy.removeReferenceWrapper();
1536
1537
2/4
✓ Branch 4 → 5 taken 3441 times.
✗ Branch 4 → 32 not taken.
✓ Branch 5 → 6 taken 3441 times.
✗ Branch 5 → 11 not taken.
3441 switch (lhsSTy.getSuperType()) {
1538 3441 case TY_BOOL:
1539
3/6
✓ Branch 6 → 7 taken 3441 times.
✗ Branch 6 → 22 not taken.
✓ Branch 7 → 8 taken 3441 times.
✗ Branch 7 → 22 not taken.
✓ Branch 8 → 9 taken 3441 times.
✗ Branch 8 → 22 not taken.
6882 return {.value = builder.CreateNot(lhsV())};
1540 default: // GCOV_EXCL_LINE
1541 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: !"); // GCOV_EXCL_LINE
1542 }
1543 3441 }
1544
1545 12 LLVMExprResult OpRuleConversionManager::getPrefixBitwiseNotInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) {
1546
1/2
✓ Branch 2 → 3 taken 12 times.
✗ Branch 2 → 31 not taken.
23 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1547 13 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1548
1/2
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 32 not taken.
12 lhsSTy = lhsSTy.removeReferenceWrapper();
1549
1550 // Handle operator overloads
1551
3/4
✓ Branch 5 → 6 taken 12 times.
✗ Branch 5 → 51 not taken.
✓ Branch 6 → 7 taken 2 times.
✓ Branch 6 → 13 taken 10 times.
12 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
1552 2 return callOperatorOverloadFct<1>(node, {lhsV, lhsP}, DEFAULT_OP_IDX);
1553
1554
2/4
✓ Branch 13 → 14 taken 10 times.
✗ Branch 13 → 51 not taken.
✓ Branch 14 → 15 taken 10 times.
✗ Branch 14 → 19 not taken.
10 switch (lhsSTy.getSuperType()) {
1555 10 case TY_INT: // fallthrough
1556 case TY_SHORT: // fallthrough
1557 case TY_LONG: // fallthrough
1558 case TY_BYTE:
1559
3/6
✓ Branch 15 → 16 taken 10 times.
✗ Branch 15 → 41 not taken.
✓ Branch 16 → 17 taken 10 times.
✗ Branch 16 → 41 not taken.
✓ Branch 17 → 18 taken 10 times.
✗ Branch 17 → 41 not taken.
10 return {.value = builder.CreateNot(lhsV())};
1560 default: // GCOV_EXCL_LINE
1561 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: ~"); // GCOV_EXCL_LINE
1562 }
1563
3/10
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 35 not taken.
✓ Branch 8 → 9 taken 2 times.
✗ Branch 8 → 35 not taken.
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 33 not taken.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 39 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 39 not taken.
14 }
1564
1565 4483 LLVMExprResult OpRuleConversionManager::getPostfixPlusPlusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) {
1566
1/2
✓ Branch 2 → 3 taken 4483 times.
✗ Branch 2 → 54 not taken.
8957 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1567 4492 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1568
1/2
✓ Branch 4 → 5 taken 4483 times.
✗ Branch 4 → 55 not taken.
4483 lhsSTy = lhsSTy.removeReferenceWrapper();
1569
1570 // Handle operator overloads
1571
3/4
✓ Branch 5 → 6 taken 4483 times.
✗ Branch 5 → 80 not taken.
✓ Branch 6 → 7 taken 9 times.
✓ Branch 6 → 13 taken 4474 times.
4483 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
1572 9 return callOperatorOverloadFct<1>(node, {lhsV, lhsP}, DEFAULT_OP_IDX);
1573
1574
5/7
✓ Branch 13 → 14 taken 4474 times.
✗ Branch 13 → 80 not taken.
✓ Branch 14 → 15 taken 336 times.
✓ Branch 14 → 21 taken 21 times.
✓ Branch 14 → 27 taken 4092 times.
✓ Branch 14 → 33 taken 25 times.
✗ Branch 14 → 42 not taken.
4474 switch (lhsSTy.getSuperType()) {
1575 336 case TY_INT:
1576
5/10
✓ Branch 15 → 16 taken 336 times.
✗ Branch 15 → 80 not taken.
✓ Branch 16 → 17 taken 336 times.
✗ Branch 16 → 64 not taken.
✓ Branch 17 → 18 taken 336 times.
✗ Branch 17 → 64 not taken.
✓ Branch 18 → 19 taken 336 times.
✗ Branch 18 → 64 not taken.
✓ Branch 19 → 20 taken 336 times.
✗ Branch 19 → 64 not taken.
336 return {.value = builder.CreateAdd(lhsV(), builder.getInt32(1), "", false, lhsSTy.isSigned())};
1577 21 case TY_SHORT:
1578
5/10
✓ Branch 21 → 22 taken 21 times.
✗ Branch 21 → 80 not taken.
✓ Branch 22 → 23 taken 21 times.
✗ Branch 22 → 65 not taken.
✓ Branch 23 → 24 taken 21 times.
✗ Branch 23 → 65 not taken.
✓ Branch 24 → 25 taken 21 times.
✗ Branch 24 → 65 not taken.
✓ Branch 25 → 26 taken 21 times.
✗ Branch 25 → 65 not taken.
21 return {.value = builder.CreateAdd(lhsV(), builder.getInt16(1), "", false, lhsSTy.isSigned())};
1579 4092 case TY_LONG:
1580
5/10
✓ Branch 27 → 28 taken 4092 times.
✗ Branch 27 → 80 not taken.
✓ Branch 28 → 29 taken 4092 times.
✗ Branch 28 → 66 not taken.
✓ Branch 29 → 30 taken 4092 times.
✗ Branch 29 → 66 not taken.
✓ Branch 30 → 31 taken 4092 times.
✗ Branch 30 → 66 not taken.
✓ Branch 31 → 32 taken 4092 times.
✗ Branch 31 → 66 not taken.
4092 return {.value = builder.CreateAdd(lhsV(), builder.getInt64(1), "", false, lhsSTy.isSigned())};
1581 25 case TY_PTR: {
1582
2/4
✓ Branch 33 → 34 taken 25 times.
✗ Branch 33 → 67 not taken.
✓ Branch 34 → 35 taken 25 times.
✗ Branch 34 → 67 not taken.
25 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
1583
3/6
✓ Branch 37 → 38 taken 25 times.
✗ Branch 37 → 68 not taken.
✓ Branch 39 → 40 taken 25 times.
✗ Branch 39 → 68 not taken.
✓ Branch 40 → 41 taken 25 times.
✗ Branch 40 → 68 not taken.
50 return {.value = builder.CreateGEP(elementTy, lhsV(), builder.getInt64(1))};
1584 }
1585 default: // GCOV_EXCL_LINE
1586 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: ++ (postfix)"); // GCOV_EXCL_LINE
1587 }
1588
3/10
✓ Branch 7 → 8 taken 9 times.
✗ Branch 7 → 58 not taken.
✓ Branch 8 → 9 taken 9 times.
✗ Branch 8 → 58 not taken.
✓ Branch 9 → 10 taken 9 times.
✗ Branch 9 → 56 not taken.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 62 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 62 not taken.
4492 }
1589
1590 430 LLVMExprResult OpRuleConversionManager::getPostfixMinusMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) {
1591
1/2
✓ Branch 2 → 3 taken 430 times.
✗ Branch 2 → 54 not taken.
853 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1592 437 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1593
1/2
✓ Branch 4 → 5 taken 430 times.
✗ Branch 4 → 55 not taken.
430 lhsSTy = lhsSTy.removeReferenceWrapper();
1594
1595 // Handle operator overloads
1596
3/4
✓ Branch 5 → 6 taken 430 times.
✗ Branch 5 → 80 not taken.
✓ Branch 6 → 7 taken 7 times.
✓ Branch 6 → 13 taken 423 times.
430 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
1597 7 return callOperatorOverloadFct<1>(node, {lhsV, lhsP}, DEFAULT_OP_IDX);
1598
1599
5/7
✓ Branch 13 → 14 taken 423 times.
✗ Branch 13 → 80 not taken.
✓ Branch 14 → 15 taken 16 times.
✓ Branch 14 → 21 taken 5 times.
✓ Branch 14 → 27 taken 400 times.
✓ Branch 14 → 33 taken 2 times.
✗ Branch 14 → 42 not taken.
423 switch (lhsSTy.getSuperType()) {
1600 16 case TY_INT:
1601
5/10
✓ Branch 15 → 16 taken 16 times.
✗ Branch 15 → 80 not taken.
✓ Branch 16 → 17 taken 16 times.
✗ Branch 16 → 64 not taken.
✓ Branch 17 → 18 taken 16 times.
✗ Branch 17 → 64 not taken.
✓ Branch 18 → 19 taken 16 times.
✗ Branch 18 → 64 not taken.
✓ Branch 19 → 20 taken 16 times.
✗ Branch 19 → 64 not taken.
16 return {.value = builder.CreateSub(lhsV(), builder.getInt32(1), "", false, lhsSTy.isSigned())};
1602 5 case TY_SHORT:
1603
5/10
✓ Branch 21 → 22 taken 5 times.
✗ Branch 21 → 80 not taken.
✓ Branch 22 → 23 taken 5 times.
✗ Branch 22 → 65 not taken.
✓ Branch 23 → 24 taken 5 times.
✗ Branch 23 → 65 not taken.
✓ Branch 24 → 25 taken 5 times.
✗ Branch 24 → 65 not taken.
✓ Branch 25 → 26 taken 5 times.
✗ Branch 25 → 65 not taken.
5 return {.value = builder.CreateSub(lhsV(), builder.getInt16(1), "", false, lhsSTy.isSigned())};
1604 400 case TY_LONG:
1605
5/10
✓ Branch 27 → 28 taken 400 times.
✗ Branch 27 → 80 not taken.
✓ Branch 28 → 29 taken 400 times.
✗ Branch 28 → 66 not taken.
✓ Branch 29 → 30 taken 400 times.
✗ Branch 29 → 66 not taken.
✓ Branch 30 → 31 taken 400 times.
✗ Branch 30 → 66 not taken.
✓ Branch 31 → 32 taken 400 times.
✗ Branch 31 → 66 not taken.
400 return {.value = builder.CreateSub(lhsV(), builder.getInt64(1), "", false, lhsSTy.isSigned())};
1606 2 case TY_PTR: {
1607
2/4
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 67 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 67 not taken.
2 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
1608
3/6
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 68 not taken.
✓ Branch 39 → 40 taken 2 times.
✗ Branch 39 → 68 not taken.
✓ Branch 40 → 41 taken 2 times.
✗ Branch 40 → 68 not taken.
4 return {.value = builder.CreateGEP(elementTy, lhsV(), builder.getInt64(-1))};
1609 }
1610 default: // GCOV_EXCL_LINE
1611 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: -- (postfix)"); // GCOV_EXCL_LINE
1612 }
1613
3/10
✓ Branch 7 → 8 taken 7 times.
✗ Branch 7 → 58 not taken.
✓ Branch 8 → 9 taken 7 times.
✗ Branch 8 → 58 not taken.
✓ Branch 9 → 10 taken 7 times.
✗ Branch 9 → 56 not taken.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 62 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 62 not taken.
437 }
1614
1615 8009 LLVMExprResult OpRuleConversionManager::getCastInst(const ASTNode *node, QualType lhsSTy, LLVMExprResult &rhs,
1616 QualType rhsSTy) const {
1617
1/2
✓ Branch 2 → 3 taken 8009 times.
✗ Branch 2 → 153 not taken.
13139 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1618 8017 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1619
1/2
✓ Branch 4 → 5 taken 8009 times.
✗ Branch 4 → 154 not taken.
8009 lhsSTy = lhsSTy.removeReferenceWrapper();
1620
1/2
✓ Branch 5 → 6 taken 8009 times.
✗ Branch 5 → 155 not taken.
8009 rhsSTy = rhsSTy.removeReferenceWrapper();
1621
1/2
✓ Branch 6 → 7 taken 8009 times.
✗ Branch 6 → 194 not taken.
8009 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1622
1623 // Handle identity casts
1624
3/4
✓ Branch 7 → 8 taken 8009 times.
✗ Branch 7 → 194 not taken.
✓ Branch 8 → 9 taken 868 times.
✓ Branch 8 → 10 taken 7141 times.
8009 if (lhsSTy.matches(rhsSTy, false, true, false))
1625 868 return rhs;
1626
1627
13/18
✓ Branch 10 → 11 taken 7141 times.
✗ Branch 10 → 194 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 2472 times.
✓ Branch 11 → 27 taken 43 times.
✓ Branch 11 → 38 taken 64 times.
✓ Branch 11 → 49 taken 817 times.
✓ Branch 11 → 54 taken 46 times.
✓ Branch 11 → 65 taken 282 times.
✓ Branch 11 → 70 taken 49 times.
✓ Branch 11 → 81 taken 1362 times.
✓ Branch 11 → 86 taken 46 times.
✓ Branch 11 → 88 taken 176 times.
✓ Branch 11 → 93 taken 1776 times.
✗ Branch 11 → 95 not taken.
✗ Branch 11 → 108 not taken.
✓ Branch 11 → 123 taken 8 times.
✗ Branch 11 → 141 not taken.
7141 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1628 case COMB(TY_DOUBLE, TY_DOUBLE): // fallthrough
1629 case COMB(TY_INT, TY_INT): // fallthrough
1630 case COMB(TY_SHORT, TY_SHORT): // fallthrough
1631 case COMB(TY_LONG, TY_LONG): // fallthrough
1632 case COMB(TY_BYTE, TY_BYTE): // fallthrough
1633 case COMB(TY_CHAR, TY_CHAR): // fallthrough
1634 case COMB(TY_STRING, TY_STRING): // fallthrough
1635 case COMB(TY_BOOL, TY_BOOL):
1636 return rhs; // Identity cast
1637 2472 case COMB(TY_PTR, TY_PTR): {
1638 // Handle safe struct-pointer upcasts: cast<Base*>(derived) / cast<Interface*>(struct). The pointer must be
1639 // advanced to the embedded subobject (past any vtable prefix) instead of being passed through unchanged.
1640
1/2
✓ Branch 13 → 14 taken 2472 times.
✗ Branch 13 → 156 not taken.
2472 const QualType lhsContained = lhsSTy.getContained();
1641
1/2
✓ Branch 14 → 15 taken 2472 times.
✗ Branch 14 → 156 not taken.
2472 const QualType rhsContained = rhsSTy.getContained();
1642
5/6
✓ Branch 15 → 16 taken 2472 times.
✗ Branch 15 → 156 not taken.
✓ Branch 16 → 17 taken 2465 times.
✓ Branch 16 → 19 taken 7 times.
✓ Branch 21 → 22 taken 469 times.
✓ Branch 21 → 25 taken 2003 times.
4937 if (lhsContained.matchesInterfaceImplementedByStruct(rhsContained) ||
1643
3/4
✓ Branch 17 → 18 taken 2465 times.
✗ Branch 17 → 156 not taken.
✓ Branch 18 → 19 taken 462 times.
✓ Branch 18 → 20 taken 2003 times.
2465 lhsContained.matchesComposedBaseOfStruct(rhsContained))
1644
2/4
✓ Branch 22 → 23 taken 469 times.
✗ Branch 22 → 156 not taken.
✓ Branch 23 → 24 taken 469 times.
✗ Branch 23 → 156 not taken.
469 return {.value = irGenerator->getUpcastedStructPtr(rhsV(), lhsSTy, rhsSTy)};
1645 2003 return rhs;
1646 }
1647 43 case COMB(TY_DOUBLE, TY_INT):
1648 case COMB(TY_DOUBLE, TY_SHORT):
1649 case COMB(TY_DOUBLE, TY_LONG):
1650
9/16
✓ Branch 27 → 28 taken 43 times.
✗ Branch 27 → 194 not taken.
✓ Branch 28 → 29 taken 23 times.
✓ Branch 28 → 33 taken 20 times.
✓ Branch 29 → 30 taken 23 times.
✗ Branch 29 → 157 not taken.
✓ Branch 30 → 31 taken 23 times.
✗ Branch 30 → 157 not taken.
✓ Branch 31 → 32 taken 23 times.
✗ Branch 31 → 157 not taken.
✓ Branch 33 → 34 taken 20 times.
✗ Branch 33 → 157 not taken.
✓ Branch 34 → 35 taken 20 times.
✗ Branch 34 → 157 not taken.
✓ Branch 35 → 36 taken 20 times.
✗ Branch 35 → 157 not taken.
43 return {.value = rhsSTy.isSigned() ? builder.CreateSIToFP(rhsV(), lhsT) : builder.CreateUIToFP(rhsV(), lhsT)};
1651 64 case COMB(TY_INT, TY_DOUBLE):
1652
5/16
✓ Branch 38 → 39 taken 64 times.
✗ Branch 38 → 194 not taken.
✓ Branch 39 → 40 taken 64 times.
✗ Branch 39 → 44 not taken.
✓ Branch 40 → 41 taken 64 times.
✗ Branch 40 → 159 not taken.
✓ Branch 41 → 42 taken 64 times.
✗ Branch 41 → 159 not taken.
✓ Branch 42 → 43 taken 64 times.
✗ Branch 42 → 159 not taken.
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 159 not taken.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 159 not taken.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 159 not taken.
64 return {.value = lhsSTy.isSigned() ? builder.CreateFPToSI(rhsV(), lhsT) : builder.CreateFPToUI(rhsV(), lhsT)};
1653 817 case COMB(TY_INT, TY_SHORT): // fallthrough
1654 case COMB(TY_INT, TY_LONG): // fallthrough
1655 case COMB(TY_INT, TY_BYTE): // fallthrough
1656 case COMB(TY_INT, TY_CHAR):
1657
4/8
✓ Branch 49 → 50 taken 817 times.
✗ Branch 49 → 161 not taken.
✓ Branch 50 → 51 taken 817 times.
✗ Branch 50 → 161 not taken.
✓ Branch 51 → 52 taken 817 times.
✗ Branch 51 → 161 not taken.
✓ Branch 52 → 53 taken 817 times.
✗ Branch 52 → 161 not taken.
817 return {.value = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned())};
1658 46 case COMB(TY_SHORT, TY_DOUBLE):
1659
5/16
✓ Branch 54 → 55 taken 46 times.
✗ Branch 54 → 194 not taken.
✓ Branch 55 → 56 taken 46 times.
✗ Branch 55 → 60 not taken.
✓ Branch 56 → 57 taken 46 times.
✗ Branch 56 → 162 not taken.
✓ Branch 57 → 58 taken 46 times.
✗ Branch 57 → 162 not taken.
✓ Branch 58 → 59 taken 46 times.
✗ Branch 58 → 162 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 162 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 61 → 162 not taken.
✗ Branch 62 → 63 not taken.
✗ Branch 62 → 162 not taken.
46 return {.value = lhsSTy.isSigned() ? builder.CreateFPToSI(rhsV(), lhsT) : builder.CreateFPToUI(rhsV(), lhsT)};
1660 282 case COMB(TY_SHORT, TY_INT): // fallthrough
1661 case COMB(TY_SHORT, TY_LONG):
1662
4/8
✓ Branch 65 → 66 taken 282 times.
✗ Branch 65 → 164 not taken.
✓ Branch 66 → 67 taken 282 times.
✗ Branch 66 → 164 not taken.
✓ Branch 67 → 68 taken 282 times.
✗ Branch 67 → 164 not taken.
✓ Branch 68 → 69 taken 282 times.
✗ Branch 68 → 164 not taken.
282 return {.value = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned())};
1663 49 case COMB(TY_LONG, TY_DOUBLE):
1664
9/16
✓ Branch 70 → 71 taken 49 times.
✗ Branch 70 → 194 not taken.
✓ Branch 71 → 72 taken 47 times.
✓ Branch 71 → 76 taken 2 times.
✓ Branch 72 → 73 taken 47 times.
✗ Branch 72 → 165 not taken.
✓ Branch 73 → 74 taken 47 times.
✗ Branch 73 → 165 not taken.
✓ Branch 74 → 75 taken 47 times.
✗ Branch 74 → 165 not taken.
✓ Branch 76 → 77 taken 2 times.
✗ Branch 76 → 165 not taken.
✓ Branch 77 → 78 taken 2 times.
✗ Branch 77 → 165 not taken.
✓ Branch 78 → 79 taken 2 times.
✗ Branch 78 → 165 not taken.
49 return {.value = lhsSTy.isSigned() ? builder.CreateFPToSI(rhsV(), lhsT) : builder.CreateFPToUI(rhsV(), lhsT)};
1665 1362 case COMB(TY_LONG, TY_INT): // fallthrough
1666 case COMB(TY_LONG, TY_SHORT): // fallthrough
1667 case COMB(TY_BYTE, TY_INT):
1668
4/8
✓ Branch 81 → 82 taken 1362 times.
✗ Branch 81 → 167 not taken.
✓ Branch 82 → 83 taken 1362 times.
✗ Branch 82 → 167 not taken.
✓ Branch 83 → 84 taken 1362 times.
✗ Branch 83 → 167 not taken.
✓ Branch 84 → 85 taken 1362 times.
✗ Branch 84 → 167 not taken.
1362 return {.value = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned())};
1669 46 case COMB(TY_BYTE, TY_CHAR):
1670
1/2
✓ Branch 86 → 87 taken 46 times.
✗ Branch 86 → 194 not taken.
46 return {.value = rhsV()};
1671 176 case COMB(TY_CHAR, TY_INT): // fallthrough
1672 case COMB(TY_CHAR, TY_SHORT): // fallthrough
1673 case COMB(TY_CHAR, TY_LONG):
1674
4/8
✓ Branch 88 → 89 taken 176 times.
✗ Branch 88 → 168 not taken.
✓ Branch 89 → 90 taken 176 times.
✗ Branch 89 → 168 not taken.
✓ Branch 90 → 91 taken 176 times.
✗ Branch 90 → 168 not taken.
✓ Branch 91 → 92 taken 176 times.
✗ Branch 91 → 168 not taken.
176 return {.value = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned())};
1675 1776 case COMB(TY_CHAR, TY_BYTE): // fallthrough
1676 case COMB(TY_STRING, TY_PTR): // fallthrough
1677 case COMB(TY_PTR, TY_STRING):
1678
1/2
✓ Branch 93 → 94 taken 1776 times.
✗ Branch 93 → 194 not taken.
1776 return {.value = rhsV()};
1679 case COMB(TY_ARRAY, TY_PTR): // fallthrough
1680 case COMB(TY_ARRAY, TY_STRING):
1681 assert(lhsSTy.isArrayOf(TY_CHAR));
1682 assert(rhsSTy.isPtrTo(TY_CHAR) || rhsSTy.is(TY_STRING));
1683 return {.value = builder.CreateBitCast(rhsV(), rhsSTy.toLLVMType(irGenerator->sourceFile))};
1684 case COMB(TY_PTR, TY_ARRAY): // fallthrough
1685 case COMB(TY_STRING, TY_ARRAY): {
1686 assert(lhsSTy.isPtrTo(TY_CHAR) || lhsSTy.is(TY_STRING));
1687 assert(rhsSTy.isArrayOf(TY_CHAR));
1688 llvm::Value *indices[1] = {builder.getInt32(0)};
1689 return {.value = builder.CreateInBoundsGEP(builder.getInt8Ty(), rhsP(), indices)};
1690 }
1691 8 case COMB(TY_PTR, TY_FUNCTION): // fallthrough
1692 case COMB(TY_PTR, TY_PROCEDURE): {
1693
2/4
✓ Branch 123 → 124 taken 8 times.
✗ Branch 123 → 194 not taken.
✗ Branch 124 → 125 not taken.
✓ Branch 124 → 126 taken 8 times.
8 assert(lhsSTy.isPtrTo(TY_BYTE));
1694
2/4
✓ Branch 129 → 130 taken 8 times.
✗ Branch 129 → 173 not taken.
✓ Branch 130 → 131 taken 8 times.
✗ Branch 130 → 173 not taken.
16 llvm::Value *fctPtrPtr = irGenerator->insertStructGEP(irGenerator->llvmTypes.lambdaFatPtrType, rhsP(), 0);
1695
2/4
✓ Branch 136 → 137 taken 8 times.
✗ Branch 136 → 179 not taken.
✓ Branch 137 → 138 taken 8 times.
✗ Branch 137 → 179 not taken.
16 llvm::Value *fctPtr = irGenerator->insertLoad(builder.getPtrTy(), fctPtrPtr);
1696 8 return {.value = fctPtr};
1697 }
1698 default: // GCOV_EXCL_LINE
1699 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: (cast)"); // GCOV_EXCL_LINE
1700 }
1701 8009 }
1702
1703 67018 bool OpRuleConversionManager::callsOverloadedOpFct(const ASTNode *node, size_t opIdx) const {
1704 67018 const std::vector<const Function *> &opFctList = irGenerator->getOpFctPointers(node);
1705
4/4
✓ Branch 4 → 5 taken 65996 times.
✓ Branch 4 → 8 taken 1022 times.
✓ Branch 6 → 7 taken 5336 times.
✓ Branch 6 → 8 taken 60660 times.
67018 return opFctList.size() > opIdx && opFctList.at(opIdx) != nullptr;
1706 }
1707
1708 template <size_t N>
1709 5320 LLVMExprResult OpRuleConversionManager::callOperatorOverloadFct(const ASTNode *node, const std::array<ResolverFct, N * 2> &opV,
1710 size_t opIdx) {
1711 static_assert(N == 1 || N == 2, "Only unary and binary operators are overloadable");
1712 5320 const size_t manIdx = irGenerator->manIdx;
1713
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 2 → 3 taken 18 times.
✗ Branch 2 → 128 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 2 → 3 taken 5302 times.
✗ Branch 2 → 137 not taken.
5320 const std::vector<std::vector<const Function *>> *opFctPointers = node->getOpFctPointers();
1714
4/8
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 4 → 5 taken 18 times.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 18 times.
✗ Branch 6 → 8 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 4 → 5 taken 5302 times.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 5302 times.
✗ Branch 6 → 8 not taken.
5320 assert(!opFctPointers->empty() && opFctPointers->size() > manIdx);
1715
8/16
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 9 → 10 taken 18 times.
✗ Branch 9 → 128 not taken.
✓ Branch 11 → 12 taken 18 times.
✗ Branch 11 → 16 not taken.
✓ Branch 12 → 13 taken 18 times.
✗ Branch 12 → 128 not taken.
✓ Branch 14 → 15 taken 18 times.
✗ Branch 14 → 16 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 9 → 10 taken 5302 times.
✗ Branch 9 → 137 not taken.
✓ Branch 11 → 12 taken 5302 times.
✗ Branch 11 → 16 not taken.
✓ Branch 12 → 13 taken 5302 times.
✗ Branch 12 → 137 not taken.
✓ Branch 14 → 15 taken 5302 times.
✗ Branch 14 → 16 not taken.
5320 assert(!opFctPointers->at(manIdx).empty() && opFctPointers->at(manIdx).size() > opIdx);
1716
4/8
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 17 → 18 taken 18 times.
✗ Branch 17 → 128 not taken.
✓ Branch 18 → 19 taken 18 times.
✗ Branch 18 → 128 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 17 → 18 taken 5302 times.
✗ Branch 17 → 137 not taken.
✓ Branch 18 → 19 taken 5302 times.
✗ Branch 18 → 137 not taken.
5320 const Function *opFct = opFctPointers->at(manIdx).at(opIdx);
1717
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 18 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 5302 times.
5320 assert(opFct != nullptr);
1718
1719
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 21 → 22 taken 18 times.
✗ Branch 21 → 128 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 21 → 22 taken 5302 times.
✗ Branch 21 → 137 not taken.
5320 const std::string mangledName = opFct->getMangledName();
1720
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 18 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 5302 times.
5320 assert(opFct->entry->scope != nullptr);
1721
1722 // Get arg values
1723
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 24 → 25 taken 18 times.
✗ Branch 24 → 126 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 24 → 25 taken 5302 times.
✗ Branch 24 → 135 not taken.
5320 const QualTypeList &paramTypes = opFct->getParamTypes();
1724
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 18 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 5302 times.
5320 assert(paramTypes.size() == N);
1725 llvm::Value *argValues[N];
1726
10/16
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 29 → 30 taken 18 times.
✗ Branch 29 → 124 not taken.
✓ Branch 30 → 31 taken 17 times.
✓ Branch 30 → 34 taken 1 time.
✓ Branch 32 → 33 taken 17 times.
✗ Branch 32 → 124 not taken.
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 124 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 29 → 30 taken 5302 times.
✗ Branch 29 → 133 not taken.
✓ Branch 30 → 31 taken 5142 times.
✓ Branch 30 → 34 taken 160 times.
✓ Branch 32 → 33 taken 5142 times.
✗ Branch 32 → 133 not taken.
✓ Branch 35 → 36 taken 160 times.
✗ Branch 35 → 133 not taken.
5320 argValues[0] = paramTypes[0].isRef() ? opV[1]() : opV[0]();
1727 if constexpr (N == 2)
1728
5/8
✓ Branch 38 → 39 taken 5302 times.
✗ Branch 38 → 133 not taken.
✓ Branch 39 → 40 taken 2719 times.
✓ Branch 39 → 43 taken 2583 times.
✓ Branch 41 → 42 taken 2719 times.
✗ Branch 41 → 133 not taken.
✓ Branch 44 → 45 taken 2583 times.
✗ Branch 44 → 133 not taken.
5302 argValues[1] = paramTypes[1].isRef() ? opV[3]() : opV[2]();
1729
1730 // Function is not defined in the current module -> declare it
1731
6/8
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 38 → 39 taken 18 times.
✗ Branch 38 → 104 not taken.
✓ Branch 39 → 40 taken 13 times.
✓ Branch 39 → 69 taken 5 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 47 → 48 taken 5302 times.
✗ Branch 47 → 113 not taken.
✓ Branch 48 → 49 taken 945 times.
✓ Branch 48 → 78 taken 4357 times.
5320 if (!irGenerator->module->getFunction(mangledName)) {
1732 // Get returnType
1733
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 40 → 41 taken 13 times.
✗ Branch 40 → 113 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 49 → 50 taken 945 times.
✗ Branch 49 → 122 not taken.
958 llvm::Type *returnType = builder.getVoidTy();
1734
6/8
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 41 → 42 taken 13 times.
✗ Branch 41 → 113 not taken.
✓ Branch 42 → 43 taken 1 time.
✓ Branch 42 → 45 taken 12 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 50 → 51 taken 945 times.
✗ Branch 50 → 122 not taken.
✓ Branch 51 → 52 taken 572 times.
✓ Branch 51 → 54 taken 373 times.
958 if (!opFct->returnType.is(TY_DYN))
1735
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 43 → 44 taken 1 time.
✗ Branch 43 → 113 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 52 → 53 taken 572 times.
✗ Branch 52 → 122 not taken.
573 returnType = opFct->returnType.toLLVMType(irGenerator->sourceFile);
1736
1737 // Get arg types
1738 958 std::vector<llvm::Type *> argTypes;
1739
6/8
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 45 → 46 taken 13 times.
✗ Branch 45 → 108 not taken.
✓ Branch 61 → 48 taken 13 times.
✓ Branch 61 → 62 taken 13 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 54 → 55 taken 945 times.
✗ Branch 54 → 117 not taken.
✓ Branch 70 → 57 taken 1890 times.
✓ Branch 70 → 71 taken 945 times.
3819 for (const QualType &paramType : opFct->getParamTypes())
1740
4/8
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 50 → 51 taken 13 times.
✗ Branch 50 → 105 not taken.
✓ Branch 51 → 52 taken 13 times.
✗ Branch 51 → 105 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 59 → 60 taken 1890 times.
✗ Branch 59 → 114 not taken.
✓ Branch 60 → 61 taken 1890 times.
✗ Branch 60 → 114 not taken.
1903 argTypes.push_back(paramType.toLLVMType(irGenerator->sourceFile));
1741
1742
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 64 → 65 taken 13 times.
✗ Branch 64 → 109 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 73 → 74 taken 945 times.
✗ Branch 73 → 118 not taken.
958 llvm::FunctionType *fctType = llvm::FunctionType::get(returnType, argTypes, false);
1743
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 66 → 67 taken 13 times.
✗ Branch 66 → 110 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 75 → 76 taken 945 times.
✗ Branch 75 → 119 not taken.
958 irGenerator->module->getOrInsertFunction(mangledName, fctType);
1744 958 }
1745
1746 // Get callee function
1747
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 70 → 71 taken 18 times.
✗ Branch 70 → 114 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 79 → 80 taken 5302 times.
✗ Branch 79 → 123 not taken.
5320 llvm::Function *callee = irGenerator->module->getFunction(mangledName);
1748
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✗ Branch 71 → 72 not taken.
✓ Branch 71 → 73 taken 18 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✗ Branch 80 → 81 not taken.
✓ Branch 80 → 82 taken 5302 times.
5320 assert(callee != nullptr);
1749
1750 // Generate function call
1751
8/16
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 73 → 74 taken 18 times.
✗ Branch 73 → 117 not taken.
✓ Branch 75 → 76 taken 18 times.
✗ Branch 75 → 115 not taken.
✓ Branch 76 → 77 taken 18 times.
✗ Branch 76 → 115 not taken.
✓ Branch 77 → 78 taken 18 times.
✗ Branch 77 → 124 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 82 → 83 taken 5302 times.
✗ Branch 82 → 126 not taken.
✓ Branch 84 → 85 taken 5302 times.
✗ Branch 84 → 124 not taken.
✓ Branch 85 → 86 taken 5302 times.
✗ Branch 85 → 124 not taken.
✓ Branch 86 → 87 taken 5302 times.
✗ Branch 86 → 133 not taken.
5320 llvm::Value *result = builder.CreateCall(callee, argValues);
1752
1753 // If this is a procedure, return true
1754
4/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 80 → 81 taken 14 times.
✓ Branch 80 → 83 taken 4 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 89 → 90 taken 887 times.
✓ Branch 89 → 92 taken 4415 times.
5320 if (opFct->isProcedure())
1755
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 81 → 82 taken 14 times.
✗ Branch 81 → 124 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 90 → 91 taken 887 times.
✗ Branch 90 → 133 not taken.
901 return {.constant = builder.getTrue()};
1756
1757 // Attach address to anonymous symbol to keep track of de-allocation
1758 4419 const SymbolTableEntry *anonymousSymbol = nullptr;
1759 4419 llvm::Value *resultPtr = nullptr;
1760
6/8
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 83 → 84 taken 4 times.
✗ Branch 83 → 124 not taken.
✓ Branch 84 → 85 taken 2 times.
✓ Branch 84 → 96 taken 2 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 92 → 93 taken 4415 times.
✗ Branch 92 → 133 not taken.
✓ Branch 93 → 94 taken 621 times.
✓ Branch 93 → 105 taken 3794 times.
4419 if (opFct->returnType.is(TY_STRUCT)) {
1761
2/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 85 → 86 taken 2 times.
✗ Branch 85 → 124 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 94 → 95 taken 621 times.
✗ Branch 94 → 133 not taken.
623 anonymousSymbol = irGenerator->currentScope->symbolTable.lookupAnonymous(node, opIdx);
1762
3/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✗ Branch 86 → 87 not taken.
✓ Branch 86 → 96 taken 2 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 95 → 96 taken 355 times.
✓ Branch 95 → 105 taken 266 times.
623 if (anonymousSymbol != nullptr) {
1763
1/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 118 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 100 → 101 taken 355 times.
✗ Branch 100 → 127 not taken.
710 resultPtr = irGenerator->insertAlloca(result->getType());
1764
1/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✗ Branch 94 → 95 not taken.
✗ Branch 94 → 124 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 103 → 104 taken 355 times.
✗ Branch 103 → 133 not taken.
355 irGenerator->insertStore(result, resultPtr);
1765
1/4
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✗ Branch 95 → 96 not taken.
✗ Branch 95 → 124 not taken.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 104 → 105 taken 355 times.
✗ Branch 104 → 133 not taken.
355 irGenerator->updateAddress(anonymousSymbol, resultPtr);
1766 }
1767 }
1768
1769 // If the return type is reference, return the result value as refPtr
1770
6/8
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<1ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (1ul)*(2)> const&, unsigned long):
✓ Branch 96 → 97 taken 4 times.
✗ Branch 96 → 124 not taken.
✓ Branch 97 → 98 taken 2 times.
✓ Branch 97 → 99 taken 2 times.
spice::compiler::LLVMExprResult spice::compiler::OpRuleConversionManager::callOperatorOverloadFct<2ul>(spice::compiler::ASTNode const*, std::array<std::function<llvm::Value* ()> const, (2ul)*(2)> const&, unsigned long):
✓ Branch 105 → 106 taken 4415 times.
✗ Branch 105 → 133 not taken.
✓ Branch 106 → 107 taken 2459 times.
✓ Branch 106 → 108 taken 1956 times.
4419 if (opFct->returnType.isRef())
1771 2461 return {.ptr = result, .refPtr = resultPtr, .entry = anonymousSymbol};
1772
1773 // Otherwise as value
1774 1958 return {.value = result, .ptr = resultPtr, .entry = anonymousSymbol};
1775 5320 }
1776
1777 379 llvm::Value *OpRuleConversionManager::generateIToFp(const QualType &srcSTy, llvm::Value *srcV, llvm::Type *tgtT) const {
1778
2/2
✓ Branch 3 → 4 taken 367 times.
✓ Branch 3 → 8 taken 12 times.
379 if (srcSTy.isSigned())
1779
2/4
✓ Branch 4 → 5 taken 367 times.
✗ Branch 4 → 13 not taken.
✓ Branch 5 → 6 taken 367 times.
✗ Branch 5 → 13 not taken.
367 return builder.CreateSIToFP(srcV, tgtT);
1780 else
1781
2/4
✓ Branch 8 → 9 taken 12 times.
✗ Branch 8 → 14 not taken.
✓ Branch 9 → 10 taken 12 times.
✗ Branch 9 → 14 not taken.
12 return builder.CreateUIToFP(srcV, tgtT);
1782 }
1783
1784 197 llvm::Value *OpRuleConversionManager::generateSHR(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1785 llvm::Value *rhsV) const {
1786
2/2
✓ Branch 3 → 4 taken 25 times.
✓ Branch 3 → 8 taken 172 times.
197 if (lhsSTy.isSigned())
1787
2/4
✓ Branch 4 → 5 taken 25 times.
✗ Branch 4 → 13 not taken.
✓ Branch 5 → 6 taken 25 times.
✗ Branch 5 → 13 not taken.
25 return builder.CreateAShr(lhsV, rhsV);
1788 else
1789
2/4
✓ Branch 8 → 9 taken 172 times.
✗ Branch 8 → 14 not taken.
✓ Branch 9 → 10 taken 172 times.
✗ Branch 9 → 14 not taken.
172 return builder.CreateLShr(lhsV, rhsV);
1790 }
1791
1792 4061 llvm::Value *OpRuleConversionManager::generateLT(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1793 llvm::Value *rhsV) const {
1794
6/6
✓ Branch 3 → 4 taken 449 times.
✓ Branch 3 → 7 taken 3612 times.
✓ Branch 5 → 6 taken 374 times.
✓ Branch 5 → 7 taken 75 times.
✓ Branch 8 → 9 taken 374 times.
✓ Branch 8 → 13 taken 3687 times.
4061 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1795
2/4
✓ Branch 9 → 10 taken 374 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 374 times.
✗ Branch 10 → 18 not taken.
374 return builder.CreateICmpSLT(lhsV, rhsV);
1796 else
1797
2/4
✓ Branch 13 → 14 taken 3687 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 3687 times.
✗ Branch 14 → 19 not taken.
3687 return builder.CreateICmpULT(lhsV, rhsV);
1798 }
1799
1800 1114 llvm::Value *OpRuleConversionManager::generateLE(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1801 llvm::Value *rhsV) const {
1802
6/6
✓ Branch 3 → 4 taken 54 times.
✓ Branch 3 → 7 taken 1060 times.
✓ Branch 5 → 6 taken 43 times.
✓ Branch 5 → 7 taken 11 times.
✓ Branch 8 → 9 taken 43 times.
✓ Branch 8 → 13 taken 1071 times.
1114 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1803
2/4
✓ Branch 9 → 10 taken 43 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 43 times.
✗ Branch 10 → 18 not taken.
43 return builder.CreateICmpSLE(lhsV, rhsV);
1804 else
1805
2/4
✓ Branch 13 → 14 taken 1071 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 1071 times.
✗ Branch 14 → 19 not taken.
1071 return builder.CreateICmpULE(lhsV, rhsV);
1806 }
1807
1808 1598 llvm::Value *OpRuleConversionManager::generateGT(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1809 llvm::Value *rhsV) const {
1810
6/6
✓ Branch 3 → 4 taken 488 times.
✓ Branch 3 → 7 taken 1110 times.
✓ Branch 5 → 6 taken 91 times.
✓ Branch 5 → 7 taken 397 times.
✓ Branch 8 → 9 taken 91 times.
✓ Branch 8 → 13 taken 1507 times.
1598 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1811
2/4
✓ Branch 9 → 10 taken 91 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 91 times.
✗ Branch 10 → 18 not taken.
91 return builder.CreateICmpSGT(lhsV, rhsV);
1812 else
1813
2/4
✓ Branch 13 → 14 taken 1507 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 1507 times.
✗ Branch 14 → 19 not taken.
1507 return builder.CreateICmpUGT(lhsV, rhsV);
1814 }
1815
1816 1861 llvm::Value *OpRuleConversionManager::generateGE(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1817 llvm::Value *rhsV) const {
1818
6/6
✓ Branch 3 → 4 taken 202 times.
✓ Branch 3 → 7 taken 1659 times.
✓ Branch 5 → 6 taken 186 times.
✓ Branch 5 → 7 taken 16 times.
✓ Branch 8 → 9 taken 186 times.
✓ Branch 8 → 13 taken 1675 times.
1861 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1819
2/4
✓ Branch 9 → 10 taken 186 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 186 times.
✗ Branch 10 → 18 not taken.
186 return builder.CreateICmpSGE(lhsV, rhsV);
1820 else
1821
2/4
✓ Branch 13 → 14 taken 1675 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 1675 times.
✗ Branch 14 → 19 not taken.
1675 return builder.CreateICmpUGE(lhsV, rhsV);
1822 }
1823
1824 20 llvm::Value *OpRuleConversionManager::generateDiv(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1825 llvm::Value *rhsV) const {
1826
3/6
✓ Branch 3 → 4 taken 20 times.
✗ Branch 3 → 7 not taken.
✓ Branch 5 → 6 taken 20 times.
✗ Branch 5 → 7 not taken.
✓ Branch 8 → 9 taken 20 times.
✗ Branch 8 → 13 not taken.
20 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1827
2/4
✓ Branch 9 → 10 taken 20 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 20 times.
✗ Branch 10 → 18 not taken.
20 return builder.CreateSDiv(lhsV, rhsV);
1828 else
1829 return builder.CreateUDiv(lhsV, rhsV);
1830 }
1831
1832 161 llvm::Value *OpRuleConversionManager::generateRem(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1833 llvm::Value *rhsV) const {
1834
6/6
✓ Branch 3 → 4 taken 78 times.
✓ Branch 3 → 7 taken 83 times.
✓ Branch 5 → 6 taken 55 times.
✓ Branch 5 → 7 taken 23 times.
✓ Branch 8 → 9 taken 55 times.
✓ Branch 8 → 13 taken 106 times.
161 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1835
2/4
✓ Branch 9 → 10 taken 55 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 55 times.
✗ Branch 10 → 18 not taken.
55 return builder.CreateSRem(lhsV, rhsV);
1836 else
1837
2/4
✓ Branch 13 → 14 taken 106 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 106 times.
✗ Branch 14 → 19 not taken.
106 return builder.CreateURem(lhsV, rhsV);
1838 }
1839
1840 } // namespace spice::compiler
1841