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% 2650 / 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 2166 OpRuleConversionManager::OpRuleConversionManager(SourceFile *sourceFile, IRGenerator *irGenerator)
17 2166 : builder(sourceFile->builder), irGenerator(irGenerator), stdFunctionManager(irGenerator->stdFunctionManager) {}
18
19 1154 LLVMExprResult OpRuleConversionManager::getPlusEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
20 LLVMExprResult &rhs, QualType rhsSTy) {
21
1/2
✓ Branch 2 → 3 taken 1154 times.
✗ Branch 2 → 156 not taken.
1892 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
22
1/2
✓ Branch 3 → 4 taken 1154 times.
✗ Branch 3 → 157 not taken.
1902 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
23 1570 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
24 1560 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
25
1/2
✓ Branch 6 → 7 taken 1154 times.
✗ Branch 6 → 158 not taken.
1154 lhsSTy = lhsSTy.removeReferenceWrapper();
26
1/2
✓ Branch 7 → 8 taken 1154 times.
✗ Branch 7 → 159 not taken.
1154 rhsSTy = rhsSTy.removeReferenceWrapper();
27
1/2
✓ Branch 8 → 9 taken 1154 times.
✗ Branch 8 → 196 not taken.
1154 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
28
29 // Handle operator overloads
30
3/4
✓ Branch 9 → 10 taken 1154 times.
✗ Branch 9 → 196 not taken.
✓ Branch 10 → 11 taken 416 times.
✓ Branch 10 → 19 taken 738 times.
1154 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 738 times.
✗ Branch 19 → 196 not taken.
✓ Branch 20 → 21 taken 84 times.
✓ Branch 20 → 26 taken 61 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 402 times.
✓ Branch 20 → 115 taken 6 times.
✓ Branch 20 → 129 taken 166 times.
✗ Branch 20 → 142 not taken.
738 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 61 case COMB(TY_INT, TY_INT):
37
8/16
✓ Branch 26 → 27 taken 61 times.
✗ Branch 26 → 196 not taken.
✓ Branch 27 → 28 taken 61 times.
✗ Branch 27 → 31 not taken.
✓ Branch 28 → 29 taken 61 times.
✗ Branch 28 → 196 not taken.
✓ Branch 29 → 30 taken 61 times.
✗ Branch 29 → 31 not taken.
✓ Branch 32 → 33 taken 61 times.
✗ Branch 32 → 169 not taken.
✓ Branch 33 → 34 taken 61 times.
✗ Branch 33 → 169 not taken.
✓ Branch 34 → 35 taken 61 times.
✗ Branch 34 → 169 not taken.
✓ Branch 35 → 36 taken 61 times.
✗ Branch 35 → 169 not taken.
61 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 402 case COMB(TY_LONG, TY_LONG):
59
9/16
✓ Branch 104 → 105 taken 402 times.
✗ Branch 104 → 196 not taken.
✓ Branch 105 → 106 taken 18 times.
✓ Branch 105 → 109 taken 384 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 402 times.
✗ Branch 110 → 179 not taken.
✓ Branch 111 → 112 taken 402 times.
✗ Branch 111 → 179 not taken.
✓ Branch 112 → 113 taken 402 times.
✗ Branch 112 → 179 not taken.
✓ Branch 113 → 114 taken 402 times.
✗ Branch 113 → 179 not taken.
402 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.
1570 }
75
76 79 LLVMExprResult OpRuleConversionManager::getMinusEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
77 LLVMExprResult &rhs, QualType rhsSTy) {
78
1/2
✓ Branch 2 → 3 taken 79 times.
✗ Branch 2 → 158 not taken.
151 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
79
1/2
✓ Branch 3 → 4 taken 79 times.
✗ Branch 3 → 159 not taken.
158 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
80 86 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
81 79 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
82
1/2
✓ Branch 6 → 7 taken 79 times.
✗ Branch 6 → 160 not taken.
79 lhsSTy = lhsSTy.removeReferenceWrapper();
83
1/2
✓ Branch 7 → 8 taken 79 times.
✗ Branch 7 → 161 not taken.
79 rhsSTy = rhsSTy.removeReferenceWrapper();
84
1/2
✓ Branch 8 → 9 taken 79 times.
✗ Branch 8 → 199 not taken.
79 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
85
86 // Handle operator overloads
87
3/4
✓ Branch 9 → 10 taken 79 times.
✗ Branch 9 → 199 not taken.
✓ Branch 10 → 11 taken 7 times.
✓ Branch 10 → 19 taken 72 times.
79 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 72 times.
✗ Branch 19 → 199 not taken.
✓ Branch 20 → 21 taken 6 times.
✓ Branch 20 → 26 taken 18 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.
72 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 18 case COMB(TY_INT, TY_INT):
94
8/16
✓ Branch 26 → 27 taken 18 times.
✗ Branch 26 → 199 not taken.
✓ Branch 27 → 28 taken 18 times.
✗ Branch 27 → 31 not taken.
✓ Branch 28 → 29 taken 18 times.
✗ Branch 28 → 199 not taken.
✓ Branch 29 → 30 taken 18 times.
✗ Branch 29 → 31 not taken.
✓ Branch 32 → 33 taken 18 times.
✗ Branch 32 → 171 not taken.
✓ Branch 33 → 34 taken 18 times.
✗ Branch 33 → 171 not taken.
✓ Branch 34 → 35 taken 18 times.
✗ Branch 34 → 171 not taken.
✓ Branch 35 → 36 taken 18 times.
✗ Branch 35 → 171 not taken.
18 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.
86 }
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 653 LLVMExprResult OpRuleConversionManager::getXorEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
404 LLVMExprResult &rhs, QualType rhsSTy) {
405
1/2
✓ Branch 2 → 3 taken 653 times.
✗ Branch 2 → 52 not taken.
1306 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
406
1/2
✓ Branch 3 → 4 taken 653 times.
✗ Branch 3 → 53 not taken.
1306 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
407
1/2
✓ Branch 4 → 5 taken 653 times.
✗ Branch 4 → 54 not taken.
653 lhsSTy = lhsSTy.removeReferenceWrapper();
408
1/2
✓ Branch 5 → 6 taken 653 times.
✗ Branch 5 → 55 not taken.
653 rhsSTy = rhsSTy.removeReferenceWrapper();
409
1/2
✓ Branch 6 → 7 taken 653 times.
✗ Branch 6 → 72 not taken.
653 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
410
411
6/8
✓ Branch 7 → 8 taken 653 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 645 times.
✗ Branch 8 → 40 not taken.
653 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 645 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 645 times.
✗ Branch 35 → 62 not taken.
✓ Branch 36 → 37 taken 645 times.
✗ Branch 36 → 62 not taken.
✓ Branch 37 → 38 taken 645 times.
✗ Branch 37 → 62 not taken.
✓ Branch 38 → 39 taken 645 times.
✗ Branch 38 → 62 not taken.
645 return {.value = builder.CreateXor(lhsV(), rhsV())};
432 default: // GCOV_EXCL_LINE
433 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: ^="); // GCOV_EXCL_LINE
434 }
435 653 }
436
437 271 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 271 times.
✗ Branch 2 → 39 not taken.
540 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
440
1/2
✓ Branch 3 → 4 taken 271 times.
✗ Branch 3 → 40 not taken.
540 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
441 273 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
442 273 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
443
1/2
✓ Branch 6 → 7 taken 271 times.
✗ Branch 6 → 41 not taken.
271 lhsSTy = lhsSTy.removeReferenceWrapper();
444
1/2
✓ Branch 7 → 8 taken 271 times.
✗ Branch 7 → 42 not taken.
271 rhsSTy = rhsSTy.removeReferenceWrapper();
445
446 // Handle operator overloads
447
3/4
✓ Branch 8 → 9 taken 271 times.
✗ Branch 8 → 61 not taken.
✓ Branch 9 → 10 taken 4 times.
✓ Branch 9 → 18 taken 267 times.
271 if (callsOverloadedOpFct(node, opIdx))
448 4 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
449
450
2/4
✓ Branch 18 → 19 taken 267 times.
✗ Branch 18 → 61 not taken.
✓ Branch 19 → 20 taken 267 times.
✗ Branch 19 → 25 not taken.
267 switch (getTypeCombination(lhsSTy, rhsSTy)) {
451 267 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 267 times.
✗ Branch 20 → 51 not taken.
✓ Branch 21 → 22 taken 267 times.
✗ Branch 21 → 51 not taken.
✓ Branch 22 → 23 taken 267 times.
✗ Branch 22 → 51 not taken.
✓ Branch 23 → 24 taken 267 times.
✗ Branch 23 → 51 not taken.
267 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.
275 }
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 10320 LLVMExprResult OpRuleConversionManager::getEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
513 LLVMExprResult &rhs, QualType rhsSTy) {
514
1/2
✓ Branch 2 → 3 taken 10320 times.
✗ Branch 2 → 223 not taken.
19291 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
515
1/2
✓ Branch 3 → 4 taken 10320 times.
✗ Branch 3 → 224 not taken.
19675 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
516 11669 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
517 11285 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
518
1/2
✓ Branch 6 → 7 taken 10320 times.
✗ Branch 6 → 225 not taken.
10320 lhsSTy = lhsSTy.removeReferenceWrapper();
519
1/2
✓ Branch 7 → 8 taken 10320 times.
✗ Branch 7 → 226 not taken.
10320 rhsSTy = rhsSTy.removeReferenceWrapper();
520
1/2
✓ Branch 8 → 9 taken 10320 times.
✗ Branch 8 → 289 not taken.
10320 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
521
1/2
✓ Branch 9 → 10 taken 10320 times.
✗ Branch 9 → 289 not taken.
10320 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
522
523 // Handle operator overloads
524
3/4
✓ Branch 10 → 11 taken 10320 times.
✗ Branch 10 → 289 not taken.
✓ Branch 11 → 12 taken 1251 times.
✓ Branch 11 → 20 taken 9069 times.
10320 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
525 1251 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 2346 times.
✓ Branch 21 → 25 taken 6723 times.
✓ Branch 22 → 23 taken 2346 times.
✗ Branch 22 → 289 not taken.
✓ Branch 23 → 24 taken 1 time.
✓ Branch 23 → 25 taken 2345 times.
✓ Branch 26 → 27 taken 1 time.
✓ Branch 26 → 34 taken 9068 times.
9069 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 9068 times.
✗ Branch 34 → 289 not taken.
✓ Branch 35 → 36 taken 338 times.
✓ Branch 35 → 38 taken 8730 times.
✓ Branch 36 → 37 taken 338 times.
✗ Branch 36 → 289 not taken.
✓ Branch 37 → 38 taken 338 times.
✗ Branch 37 → 42 not taken.
✓ Branch 38 → 39 taken 9068 times.
✗ Branch 38 → 289 not taken.
✓ Branch 39 → 40 taken 858 times.
✓ Branch 39 → 43 taken 8210 times.
✓ Branch 40 → 41 taken 858 times.
✗ Branch 40 → 289 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 858 times.
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 53 taken 9068 times.
9068 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 9068 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 1518 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 475 times.
✓ Branch 54 → 150 taken 2778 times.
✓ Branch 54 → 155 taken 1 time.
✓ Branch 54 → 163 taken 78 times.
✓ Branch 54 → 168 taken 33 times.
✓ Branch 54 → 176 taken 1327 times.
✓ Branch 54 → 181 taken 338 times.
✓ Branch 54 → 189 taken 241 times.
✓ Branch 54 → 204 taken 2007 times.
✗ Branch 54 → 209 not taken.
9068 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 1518 case COMB(TY_INT, TY_INT):
556
4/8
✓ Branch 72 → 73 taken 1518 times.
✗ Branch 72 → 244 not taken.
✓ Branch 73 → 74 taken 1518 times.
✗ Branch 73 → 244 not taken.
✓ Branch 74 → 75 taken 1518 times.
✗ Branch 74 → 244 not taken.
✓ Branch 75 → 76 taken 1518 times.
✗ Branch 75 → 244 not taken.
1518 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 475 case COMB(TY_LONG, TY_INT): // fallthrough
592 case COMB(TY_LONG, TY_SHORT): {
593
5/10
✓ Branch 142 → 143 taken 475 times.
✗ Branch 142 → 260 not taken.
✓ Branch 143 → 144 taken 475 times.
✗ Branch 143 → 260 not taken.
✓ Branch 144 → 145 taken 475 times.
✗ Branch 144 → 260 not taken.
✓ Branch 145 → 146 taken 475 times.
✗ Branch 145 → 260 not taken.
✓ Branch 146 → 147 taken 475 times.
✗ Branch 146 → 261 not taken.
475 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
594
3/6
✓ Branch 146 → 147 taken 475 times.
✗ Branch 146 → 261 not taken.
✓ Branch 147 → 148 taken 475 times.
✗ Branch 147 → 261 not taken.
✓ Branch 148 → 149 taken 475 times.
✗ Branch 148 → 261 not taken.
475 return {.value = builder.CreateICmpEQ(lhsV(), rhsLong)};
595 }
596 2778 case COMB(TY_LONG, TY_LONG):
597
4/8
✓ Branch 150 → 151 taken 2778 times.
✗ Branch 150 → 262 not taken.
✓ Branch 151 → 152 taken 2778 times.
✗ Branch 151 → 262 not taken.
✓ Branch 152 → 153 taken 2778 times.
✗ Branch 152 → 262 not taken.
✓ Branch 153 → 154 taken 2778 times.
✗ Branch 153 → 262 not taken.
2778 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 1327 case COMB(TY_CHAR, TY_CHAR):
611
4/8
✓ Branch 176 → 177 taken 1327 times.
✗ Branch 176 → 268 not taken.
✓ Branch 177 → 178 taken 1327 times.
✗ Branch 177 → 268 not taken.
✓ Branch 178 → 179 taken 1327 times.
✗ Branch 178 → 268 not taken.
✓ Branch 179 → 180 taken 1327 times.
✗ Branch 179 → 268 not taken.
1327 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
612 338 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 338 times.
✗ Branch 181 → 289 not taken.
338 llvm::Function *opFct = stdFunctionManager.getStringIsRawEqualStringStringFct();
615
5/10
✓ Branch 182 → 183 taken 338 times.
✗ Branch 182 → 272 not taken.
✓ Branch 183 → 184 taken 338 times.
✗ Branch 183 → 270 not taken.
✓ Branch 184 → 185 taken 338 times.
✗ Branch 184 → 270 not taken.
✓ Branch 186 → 187 taken 338 times.
✗ Branch 186 → 269 not taken.
✓ Branch 187 → 188 taken 338 times.
✗ Branch 187 → 269 not taken.
338 llvm::Value *result = builder.CreateCall(opFct, {lhsV(), rhsV()});
616 338 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 2007 case COMB(TY_PTR, TY_PTR):
627
4/8
✓ Branch 204 → 205 taken 2007 times.
✗ Branch 204 → 279 not taken.
✓ Branch 205 → 206 taken 2007 times.
✗ Branch 205 → 279 not taken.
✓ Branch 206 → 207 taken 2007 times.
✗ Branch 206 → 279 not taken.
✓ Branch 207 → 208 taken 2007 times.
✗ Branch 207 → 279 not taken.
2007 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 1251 times.
✗ Branch 12 → 229 not taken.
✓ Branch 13 → 14 taken 1251 times.
✗ Branch 13 → 229 not taken.
✓ Branch 14 → 15 taken 1251 times.
✗ Branch 14 → 229 not taken.
✓ Branch 15 → 16 taken 1251 times.
✗ Branch 15 → 229 not taken.
✓ Branch 16 → 17 taken 1251 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.
11571 }
632
633 3371 LLVMExprResult OpRuleConversionManager::getNotEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
634 LLVMExprResult &rhs, QualType rhsSTy) {
635
1/2
✓ Branch 2 → 3 taken 3371 times.
✗ Branch 2 → 227 not taken.
6619 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
636
1/2
✓ Branch 3 → 4 taken 3371 times.
✗ Branch 3 → 228 not taken.
6619 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
637 3494 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
638 3494 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
639
1/2
✓ Branch 6 → 7 taken 3371 times.
✗ Branch 6 → 229 not taken.
3371 lhsSTy = lhsSTy.removeReferenceWrapper();
640
1/2
✓ Branch 7 → 8 taken 3371 times.
✗ Branch 7 → 230 not taken.
3371 rhsSTy = rhsSTy.removeReferenceWrapper();
641
1/2
✓ Branch 8 → 9 taken 3371 times.
✗ Branch 8 → 295 not taken.
3371 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
642
1/2
✓ Branch 9 → 10 taken 3371 times.
✗ Branch 9 → 295 not taken.
3371 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
643
644 // Handle operator overloads
645
3/4
✓ Branch 10 → 11 taken 3371 times.
✗ Branch 10 → 295 not taken.
✓ Branch 11 → 12 taken 71 times.
✓ Branch 11 → 20 taken 3300 times.
3371 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 685 times.
✓ Branch 21 → 25 taken 2615 times.
✓ Branch 22 → 23 taken 685 times.
✗ Branch 22 → 295 not taken.
✓ Branch 23 → 24 taken 1 time.
✓ Branch 23 → 25 taken 684 times.
✓ Branch 26 → 27 taken 1 time.
✓ Branch 26 → 34 taken 3299 times.
3300 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
12/18
✓ Branch 34 → 35 taken 3299 times.
✗ Branch 34 → 295 not taken.
✓ Branch 35 → 36 taken 16 times.
✓ Branch 35 → 38 taken 3283 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 3299 times.
✗ Branch 38 → 295 not taken.
✓ Branch 39 → 40 taken 23 times.
✓ Branch 39 → 43 taken 3276 times.
✓ Branch 40 → 41 taken 23 times.
✗ Branch 40 → 295 not taken.
✓ Branch 41 → 42 taken 23 times.
✗ Branch 41 → 43 not taken.
✓ Branch 44 → 45 taken 23 times.
✓ Branch 44 → 55 taken 3276 times.
3299 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 3276 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 367 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 1010 times.
✓ Branch 56 → 157 taken 1 time.
✓ Branch 56 → 165 taken 1 time.
✓ Branch 56 → 170 taken 18 times.
✓ Branch 56 → 178 taken 1079 times.
✓ Branch 56 → 183 taken 16 times.
✓ Branch 56 → 193 taken 52 times.
✓ Branch 56 → 208 taken 645 times.
✗ Branch 56 → 213 not taken.
3276 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 367 case COMB(TY_INT, TY_INT):
677
4/8
✓ Branch 74 → 75 taken 367 times.
✗ Branch 74 → 249 not taken.
✓ Branch 75 → 76 taken 367 times.
✗ Branch 75 → 249 not taken.
✓ Branch 76 → 77 taken 367 times.
✗ Branch 76 → 249 not taken.
✓ Branch 77 → 78 taken 367 times.
✗ Branch 77 → 249 not taken.
367 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 1010 case COMB(TY_LONG, TY_LONG):
718
4/8
✓ Branch 152 → 153 taken 1010 times.
✗ Branch 152 → 267 not taken.
✓ Branch 153 → 154 taken 1010 times.
✗ Branch 153 → 267 not taken.
✓ Branch 154 → 155 taken 1010 times.
✗ Branch 154 → 267 not taken.
✓ Branch 155 → 156 taken 1010 times.
✗ Branch 155 → 267 not taken.
1010 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 1079 case COMB(TY_CHAR, TY_CHAR):
732
4/8
✓ Branch 178 → 179 taken 1079 times.
✗ Branch 178 → 273 not taken.
✓ Branch 179 → 180 taken 1079 times.
✗ Branch 179 → 273 not taken.
✓ Branch 180 → 181 taken 1079 times.
✗ Branch 180 → 273 not taken.
✓ Branch 181 → 182 taken 1079 times.
✗ Branch 181 → 273 not taken.
1079 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 645 case COMB(TY_PTR, TY_PTR):
749
4/8
✓ Branch 208 → 209 taken 645 times.
✗ Branch 208 → 285 not taken.
✓ Branch 209 → 210 taken 645 times.
✗ Branch 209 → 285 not taken.
✓ Branch 210 → 211 taken 645 times.
✗ Branch 210 → 285 not taken.
✓ Branch 211 → 212 taken 645 times.
✗ Branch 211 → 285 not taken.
645 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.
3442 }
754
755 4070 LLVMExprResult OpRuleConversionManager::getLessInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
756 LLVMExprResult &rhs, QualType rhsSTy) {
757
1/2
✓ Branch 2 → 3 taken 4070 times.
✗ Branch 2 → 103 not taken.
8140 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
758
1/2
✓ Branch 3 → 4 taken 4070 times.
✗ Branch 3 → 104 not taken.
8140 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
759
1/2
✓ Branch 4 → 5 taken 4070 times.
✗ Branch 4 → 105 not taken.
4070 lhsSTy = lhsSTy.removeReferenceWrapper();
760
1/2
✓ Branch 5 → 6 taken 4070 times.
✗ Branch 5 → 106 not taken.
4070 rhsSTy = rhsSTy.removeReferenceWrapper();
761
1/2
✓ Branch 6 → 7 taken 4070 times.
✗ Branch 6 → 127 not taken.
4070 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
762
1/2
✓ Branch 7 → 8 taken 4070 times.
✗ Branch 7 → 127 not taken.
4070 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
763
764
15/17
✓ Branch 8 → 9 taken 4070 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 298 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 3601 times.
✓ Branch 9 → 86 taken 4 times.
✗ Branch 9 → 91 not taken.
4070 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 298 case COMB(TY_INT, TY_INT):
778
3/6
✓ Branch 27 → 28 taken 298 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 298 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 298 times.
✗ Branch 29 → 127 not taken.
298 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 3601 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 3601 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 3601 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 3601 times.
✗ Branch 84 → 127 not taken.
3601 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 4070 }
820
821 1642 LLVMExprResult OpRuleConversionManager::getGreaterInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
822 LLVMExprResult &rhs, QualType rhsSTy) {
823
1/2
✓ Branch 2 → 3 taken 1642 times.
✗ Branch 2 → 103 not taken.
3284 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
824
1/2
✓ Branch 3 → 4 taken 1642 times.
✗ Branch 3 → 104 not taken.
3284 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
825
1/2
✓ Branch 4 → 5 taken 1642 times.
✗ Branch 4 → 105 not taken.
1642 lhsSTy = lhsSTy.removeReferenceWrapper();
826
1/2
✓ Branch 5 → 6 taken 1642 times.
✗ Branch 5 → 106 not taken.
1642 rhsSTy = rhsSTy.removeReferenceWrapper();
827
1/2
✓ Branch 6 → 7 taken 1642 times.
✗ Branch 6 → 127 not taken.
1642 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
828
1/2
✓ Branch 7 → 8 taken 1642 times.
✗ Branch 7 → 127 not taken.
1642 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
829
830
15/17
✓ Branch 8 → 9 taken 1642 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 48 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 1368 times.
✓ Branch 9 → 86 taken 4 times.
✗ Branch 9 → 91 not taken.
1642 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 48 case COMB(TY_INT, TY_INT):
844
3/6
✓ Branch 27 → 28 taken 48 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 48 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 48 times.
✗ Branch 29 → 127 not taken.
48 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 1368 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 1368 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 1368 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 1368 times.
✗ Branch 84 → 127 not taken.
1368 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 1642 }
886
887 1159 LLVMExprResult OpRuleConversionManager::getLessEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
888 LLVMExprResult &rhs, QualType rhsSTy) {
889
1/2
✓ Branch 2 → 3 taken 1159 times.
✗ Branch 2 → 103 not taken.
2318 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
890
1/2
✓ Branch 3 → 4 taken 1159 times.
✗ Branch 3 → 104 not taken.
2318 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
891
1/2
✓ Branch 4 → 5 taken 1159 times.
✗ Branch 4 → 105 not taken.
1159 lhsSTy = lhsSTy.removeReferenceWrapper();
892
1/2
✓ Branch 5 → 6 taken 1159 times.
✗ Branch 5 → 106 not taken.
1159 rhsSTy = rhsSTy.removeReferenceWrapper();
893
1/2
✓ Branch 6 → 7 taken 1159 times.
✗ Branch 6 → 127 not taken.
1159 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
894
1/2
✓ Branch 7 → 8 taken 1159 times.
✗ Branch 7 → 127 not taken.
1159 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
895
896
15/17
✓ Branch 8 → 9 taken 1159 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 22 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 1062 times.
✓ Branch 9 → 86 taken 4 times.
✗ Branch 9 → 91 not taken.
1159 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 22 case COMB(TY_INT, TY_INT):
910
3/6
✓ Branch 27 → 28 taken 22 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 22 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 22 times.
✗ Branch 29 → 127 not taken.
22 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 1062 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 1062 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 1062 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 1062 times.
✗ Branch 84 → 127 not taken.
1062 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 1159 }
952
953 1951 LLVMExprResult OpRuleConversionManager::getGreaterEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
954 LLVMExprResult &rhs, QualType rhsSTy) {
955
1/2
✓ Branch 2 → 3 taken 1951 times.
✗ Branch 2 → 103 not taken.
3902 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
956
1/2
✓ Branch 3 → 4 taken 1951 times.
✗ Branch 3 → 104 not taken.
3902 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
957
1/2
✓ Branch 4 → 5 taken 1951 times.
✗ Branch 4 → 105 not taken.
1951 lhsSTy = lhsSTy.removeReferenceWrapper();
958
1/2
✓ Branch 5 → 6 taken 1951 times.
✗ Branch 5 → 106 not taken.
1951 rhsSTy = rhsSTy.removeReferenceWrapper();
959
1/2
✓ Branch 6 → 7 taken 1951 times.
✗ Branch 6 → 127 not taken.
1951 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
960
1/2
✓ Branch 7 → 8 taken 1951 times.
✗ Branch 7 → 127 not taken.
1951 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
961
962
15/17
✓ Branch 8 → 9 taken 1951 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 1623 times.
✓ Branch 9 → 86 taken 4 times.
✗ Branch 9 → 91 not taken.
1951 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 1623 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 1623 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 1623 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 1623 times.
✗ Branch 84 → 127 not taken.
1623 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 1951 }
1018
1019 2252 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 2252 times.
✗ Branch 2 → 79 not taken.
2303 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1022
1/2
✓ Branch 3 → 4 taken 2252 times.
✗ Branch 3 → 80 not taken.
3941 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1023 4453 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1024 2815 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1025
1/2
✓ Branch 6 → 7 taken 2252 times.
✗ Branch 6 → 81 not taken.
2252 lhsSTy = lhsSTy.removeReferenceWrapper();
1026
1/2
✓ Branch 7 → 8 taken 2252 times.
✗ Branch 7 → 82 not taken.
2252 rhsSTy = rhsSTy.removeReferenceWrapper();
1027
1/2
✓ Branch 8 → 9 taken 2252 times.
✗ Branch 8 → 110 not taken.
2252 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1028
1029 // Handle operator overloads
1030
3/4
✓ Branch 9 → 10 taken 2252 times.
✗ Branch 9 → 110 not taken.
✓ Branch 10 → 11 taken 2202 times.
✓ Branch 10 → 19 taken 50 times.
2252 if (callsOverloadedOpFct(node, opIdx))
1031 2202 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 2202 times.
✗ Branch 11 → 85 not taken.
✓ Branch 12 → 13 taken 2202 times.
✗ Branch 12 → 85 not taken.
✓ Branch 13 → 14 taken 2202 times.
✗ Branch 13 → 85 not taken.
✓ Branch 14 → 15 taken 2202 times.
✗ Branch 14 → 85 not taken.
✓ Branch 15 → 16 taken 2202 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.
4454 }
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 6449 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 6449 times.
✗ Branch 2 → 231 not taken.
12306 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1114
1/2
✓ Branch 3 → 4 taken 6449 times.
✗ Branch 3 → 232 not taken.
12306 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1115 7041 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1116 7041 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1117
1/2
✓ Branch 6 → 7 taken 6449 times.
✗ Branch 6 → 233 not taken.
6449 lhsSTy = lhsSTy.removeReferenceWrapper();
1118
1/2
✓ Branch 7 → 8 taken 6449 times.
✗ Branch 7 → 234 not taken.
6449 rhsSTy = rhsSTy.removeReferenceWrapper();
1119
1/2
✓ Branch 8 → 9 taken 6449 times.
✗ Branch 8 → 291 not taken.
6449 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1120
1/2
✓ Branch 9 → 10 taken 6449 times.
✗ Branch 9 → 291 not taken.
6449 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1121
1122 // Handle operator overloads
1123
3/4
✓ Branch 10 → 11 taken 6449 times.
✗ Branch 10 → 291 not taken.
✓ Branch 11 → 12 taken 593 times.
✓ Branch 11 → 20 taken 5856 times.
6449 if (callsOverloadedOpFct(node, opIdx))
1124 593 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1125
1126
16/21
✓ Branch 20 → 21 taken 5856 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 84 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 339 times.
✓ Branch 21 → 169 taken 3899 times.
✗ Branch 21 → 180 not taken.
✓ Branch 21 → 193 taken 1 time.
✓ Branch 21 → 204 taken 861 times.
✗ Branch 21 → 217 not taken.
5856 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 84 case COMB(TY_INT, TY_INT):
1140
9/16
✓ Branch 39 → 40 taken 84 times.
✗ Branch 39 → 291 not taken.
✓ Branch 40 → 41 taken 82 times.
✓ Branch 40 → 44 taken 2 times.
✓ Branch 41 → 42 taken 82 times.
✗ Branch 41 → 291 not taken.
✓ Branch 42 → 43 taken 82 times.
✗ Branch 42 → 44 not taken.
✓ Branch 45 → 46 taken 84 times.
✗ Branch 45 → 246 not taken.
✓ Branch 46 → 47 taken 84 times.
✗ Branch 46 → 246 not taken.
✓ Branch 47 → 48 taken 84 times.
✗ Branch 47 → 246 not taken.
✓ Branch 48 → 49 taken 84 times.
✗ Branch 48 → 246 not taken.
84 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 339 case COMB(TY_LONG, TY_INT): // fallthrough
1176 case COMB(TY_LONG, TY_SHORT): {
1177
5/10
✓ Branch 155 → 156 taken 339 times.
✗ Branch 155 → 268 not taken.
✓ Branch 156 → 157 taken 339 times.
✗ Branch 156 → 268 not taken.
✓ Branch 157 → 158 taken 339 times.
✗ Branch 157 → 268 not taken.
✓ Branch 158 → 159 taken 339 times.
✗ Branch 158 → 268 not taken.
✓ Branch 159 → 160 taken 339 times.
✗ Branch 159 → 291 not taken.
339 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1178
8/14
✓ Branch 159 → 160 taken 339 times.
✗ Branch 159 → 291 not taken.
✓ Branch 160 → 161 taken 183 times.
✓ Branch 160 → 164 taken 156 times.
✓ Branch 161 → 162 taken 183 times.
✗ Branch 161 → 291 not taken.
✓ Branch 162 → 163 taken 183 times.
✗ Branch 162 → 164 not taken.
✓ Branch 165 → 166 taken 339 times.
✗ Branch 165 → 269 not taken.
✓ Branch 166 → 167 taken 339 times.
✗ Branch 166 → 269 not taken.
✓ Branch 167 → 168 taken 339 times.
✗ Branch 167 → 269 not taken.
339 return {.value = builder.CreateAdd(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1179 }
1180 3899 case COMB(TY_LONG, TY_LONG):
1181
10/16
✓ Branch 169 → 170 taken 3899 times.
✗ Branch 169 → 291 not taken.
✓ Branch 170 → 171 taken 502 times.
✓ Branch 170 → 174 taken 3397 times.
✓ Branch 171 → 172 taken 502 times.
✗ Branch 171 → 291 not taken.
✓ Branch 172 → 173 taken 197 times.
✓ Branch 172 → 174 taken 305 times.
✓ Branch 175 → 176 taken 3899 times.
✗ Branch 175 → 270 not taken.
✓ Branch 176 → 177 taken 3899 times.
✗ Branch 176 → 270 not taken.
✓ Branch 177 → 178 taken 3899 times.
✗ Branch 177 → 270 not taken.
✓ Branch 178 → 179 taken 3899 times.
✗ Branch 178 → 270 not taken.
3899 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 861 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 861 times.
✗ Branch 204 → 277 not taken.
✓ Branch 205 → 206 taken 861 times.
✗ Branch 205 → 277 not taken.
✓ Branch 206 → 207 taken 861 times.
✗ Branch 206 → 277 not taken.
✓ Branch 207 → 208 taken 861 times.
✗ Branch 207 → 277 not taken.
✓ Branch 208 → 209 taken 861 times.
✗ Branch 208 → 277 not taken.
861 llvm::Value *rhsExt = builder.CreateIntCast(rhsV(), builder.getInt64Ty(), rhsSTy.isSigned());
1193
4/8
✓ Branch 212 → 213 taken 861 times.
✗ Branch 212 → 279 not taken.
✓ Branch 213 → 214 taken 861 times.
✗ Branch 213 → 278 not taken.
✓ Branch 214 → 215 taken 861 times.
✗ Branch 214 → 278 not taken.
✓ Branch 215 → 216 taken 861 times.
✗ Branch 215 → 278 not taken.
1722 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.
7042 }
1199
1200 3624 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 3624 times.
✗ Branch 2 → 233 not taken.
7248 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1203
1/2
✓ Branch 3 → 4 taken 3624 times.
✗ Branch 3 → 234 not taken.
7248 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1204 3624 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1205 3624 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1206
1/2
✓ Branch 6 → 7 taken 3624 times.
✗ Branch 6 → 235 not taken.
3624 lhsSTy = lhsSTy.removeReferenceWrapper();
1207
1/2
✓ Branch 7 → 8 taken 3624 times.
✗ Branch 7 → 236 not taken.
3624 rhsSTy = rhsSTy.removeReferenceWrapper();
1208
1/2
✓ Branch 8 → 9 taken 3624 times.
✗ Branch 8 → 294 not taken.
3624 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1209
1/2
✓ Branch 9 → 10 taken 3624 times.
✗ Branch 9 → 294 not taken.
3624 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1210
1211 // Handle operator overloads
1212
3/4
✓ Branch 10 → 11 taken 3624 times.
✗ Branch 10 → 294 not taken.
✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 20 taken 3623 times.
3624 if (callsOverloadedOpFct(node, opIdx))
1213 1 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1214
1215
16/21
✓ Branch 20 → 21 taken 3623 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 3264 times.
✗ Branch 21 → 180 not taken.
✓ Branch 21 → 193 taken 1 time.
✓ Branch 21 → 204 taken 3 times.
✗ Branch 21 → 219 not taken.
3623 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 3264 case COMB(TY_LONG, TY_LONG):
1270
10/16
✓ Branch 169 → 170 taken 3264 times.
✗ Branch 169 → 294 not taken.
✓ Branch 170 → 171 taken 495 times.
✓ Branch 170 → 174 taken 2769 times.
✓ Branch 171 → 172 taken 495 times.
✗ Branch 171 → 294 not taken.
✓ Branch 172 → 173 taken 197 times.
✓ Branch 172 → 174 taken 298 times.
✓ Branch 175 → 176 taken 3264 times.
✗ Branch 175 → 272 not taken.
✓ Branch 176 → 177 taken 3264 times.
✗ Branch 176 → 272 not taken.
✓ Branch 177 → 178 taken 3264 times.
✗ Branch 177 → 272 not taken.
✓ Branch 178 → 179 taken 3264 times.
✗ Branch 178 → 272 not taken.
3264 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.
3625 }
1289
1290 2334 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 2334 times.
✗ Branch 2 → 168 not taken.
4663 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1293
1/2
✓ Branch 3 → 4 taken 2334 times.
✗ Branch 3 → 169 not taken.
4665 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1294 2339 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1295 2337 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1296
1/2
✓ Branch 6 → 7 taken 2334 times.
✗ Branch 6 → 170 not taken.
2334 lhsSTy = lhsSTy.removeReferenceWrapper();
1297
1/2
✓ Branch 7 → 8 taken 2334 times.
✗ Branch 7 → 171 not taken.
2334 rhsSTy = rhsSTy.removeReferenceWrapper();
1298
1/2
✓ Branch 8 → 9 taken 2334 times.
✗ Branch 8 → 207 not taken.
2334 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1299
1/2
✓ Branch 9 → 10 taken 2334 times.
✗ Branch 9 → 207 not taken.
2334 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1300
1301 // Handle operator overloads
1302
3/4
✓ Branch 10 → 11 taken 2334 times.
✗ Branch 10 → 207 not taken.
✓ Branch 11 → 12 taken 9 times.
✓ Branch 11 → 20 taken 2325 times.
2334 if (callsOverloadedOpFct(node, opIdx))
1303 9 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1304
1305
14/16
✓ Branch 20 → 21 taken 2325 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 117 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 1076 times.
✓ Branch 21 → 143 taken 951 times.
✗ Branch 21 → 154 not taken.
2325 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 117 case COMB(TY_INT, TY_INT):
1319
10/16
✓ Branch 39 → 40 taken 117 times.
✗ Branch 39 → 207 not taken.
✓ Branch 40 → 41 taken 106 times.
✓ Branch 40 → 44 taken 11 times.
✓ Branch 41 → 42 taken 106 times.
✗ Branch 41 → 207 not taken.
✓ Branch 42 → 43 taken 59 times.
✓ Branch 42 → 44 taken 47 times.
✓ Branch 45 → 46 taken 117 times.
✗ Branch 45 → 183 not taken.
✓ Branch 46 → 47 taken 117 times.
✗ Branch 46 → 183 not taken.
✓ Branch 47 → 48 taken 117 times.
✗ Branch 47 → 183 not taken.
✓ Branch 48 → 49 taken 117 times.
✗ Branch 48 → 183 not taken.
117 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 1076 case COMB(TY_LONG, TY_INT): // fallthrough
1347 case COMB(TY_LONG, TY_SHORT): {
1348
5/10
✓ Branch 129 → 130 taken 1076 times.
✗ Branch 129 → 195 not taken.
✓ Branch 130 → 131 taken 1076 times.
✗ Branch 130 → 195 not taken.
✓ Branch 131 → 132 taken 1076 times.
✗ Branch 131 → 195 not taken.
✓ Branch 132 → 133 taken 1076 times.
✗ Branch 132 → 195 not taken.
✓ Branch 133 → 134 taken 1076 times.
✗ Branch 133 → 207 not taken.
1076 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1349
8/14
✓ Branch 133 → 134 taken 1076 times.
✗ Branch 133 → 207 not taken.
✓ Branch 134 → 135 taken 5 times.
✓ Branch 134 → 138 taken 1071 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 1076 times.
✗ Branch 139 → 196 not taken.
✓ Branch 140 → 141 taken 1076 times.
✗ Branch 140 → 196 not taken.
✓ Branch 141 → 142 taken 1076 times.
✗ Branch 141 → 196 not taken.
1076 return {.value = builder.CreateMul(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1350 }
1351 951 case COMB(TY_LONG, TY_LONG): // fallthrough
1352 case COMB(TY_BYTE, TY_BYTE):
1353
10/16
✓ Branch 143 → 144 taken 951 times.
✗ Branch 143 → 207 not taken.
✓ Branch 144 → 145 taken 243 times.
✓ Branch 144 → 148 taken 708 times.
✓ Branch 145 → 146 taken 243 times.
✗ Branch 145 → 207 not taken.
✓ Branch 146 → 147 taken 33 times.
✓ Branch 146 → 148 taken 210 times.
✓ Branch 149 → 150 taken 951 times.
✗ Branch 149 → 197 not taken.
✓ Branch 150 → 151 taken 951 times.
✗ Branch 150 → 197 not taken.
✓ Branch 151 → 152 taken 951 times.
✗ Branch 151 → 197 not taken.
✓ Branch 152 → 153 taken 951 times.
✗ Branch 152 → 197 not taken.
951 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.
2343 }
1358
1359 503 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 503 times.
✗ Branch 2 → 120 not taken.
1002 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1362
1/2
✓ Branch 3 → 4 taken 503 times.
✗ Branch 3 → 121 not taken.
1006 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1363 507 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1364 503 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1365
1/2
✓ Branch 6 → 7 taken 503 times.
✗ Branch 6 → 122 not taken.
503 lhsSTy = lhsSTy.removeReferenceWrapper();
1366
1/2
✓ Branch 7 → 8 taken 503 times.
✗ Branch 7 → 123 not taken.
503 rhsSTy = rhsSTy.removeReferenceWrapper();
1367
1/2
✓ Branch 8 → 9 taken 503 times.
✗ Branch 8 → 159 not taken.
503 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1368
1/2
✓ Branch 9 → 10 taken 503 times.
✗ Branch 9 → 159 not taken.
503 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1369
1370 // Handle operator overloads
1371
3/4
✓ Branch 10 → 11 taken 503 times.
✗ Branch 10 → 159 not taken.
✓ Branch 11 → 12 taken 5 times.
✓ Branch 11 → 20 taken 498 times.
503 if (callsOverloadedOpFct(node, opIdx))
1372 5 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1373
1374
14/16
✓ Branch 20 → 21 taken 498 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 195 times.
✗ Branch 21 → 106 not taken.
498 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 195 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 195 times.
✗ Branch 101 → 149 not taken.
✓ Branch 102 → 103 taken 195 times.
✗ Branch 102 → 149 not taken.
✓ Branch 103 → 104 taken 195 times.
✗ Branch 103 → 149 not taken.
✓ Branch 104 → 105 taken 195 times.
✗ Branch 104 → 149 not taken.
195 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.
508 }
1428
1429 126 LLVMExprResult OpRuleConversionManager::getRemInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
1430 QualType rhsSTy) const {
1431
1/2
✓ Branch 2 → 3 taken 126 times.
✗ Branch 2 → 77 not taken.
252 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1432
1/2
✓ Branch 3 → 4 taken 126 times.
✗ Branch 3 → 78 not taken.
252 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1433
1/2
✓ Branch 4 → 5 taken 126 times.
✗ Branch 4 → 79 not taken.
126 lhsSTy = lhsSTy.removeReferenceWrapper();
1434
1/2
✓ Branch 5 → 6 taken 126 times.
✗ Branch 5 → 80 not taken.
126 rhsSTy = rhsSTy.removeReferenceWrapper();
1435
1/2
✓ Branch 6 → 7 taken 126 times.
✗ Branch 6 → 96 not taken.
126 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1436
1/2
✓ Branch 7 → 8 taken 126 times.
✗ Branch 7 → 96 not taken.
126 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1437
1438
10/12
✓ Branch 8 → 9 taken 126 times.
✗ Branch 8 → 96 not taken.
✓ Branch 9 → 10 taken 1 time.
✓ Branch 9 → 18 taken 31 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.
126 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 31 case COMB(TY_INT, TY_INT):
1446
3/6
✓ Branch 18 → 19 taken 31 times.
✗ Branch 18 → 96 not taken.
✓ Branch 19 → 20 taken 31 times.
✗ Branch 19 → 96 not taken.
✓ Branch 20 → 21 taken 31 times.
✗ Branch 20 → 96 not taken.
31 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 126 }
1476
1477 1003 LLVMExprResult OpRuleConversionManager::getPrefixMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1478
1/2
✓ Branch 2 → 3 taken 1003 times.
✗ Branch 2 → 25 not taken.
2006 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1479
1/2
✓ Branch 3 → 4 taken 1003 times.
✗ Branch 3 → 26 not taken.
1003 lhsSTy = lhsSTy.removeReferenceWrapper();
1480
1481
3/5
✓ Branch 4 → 5 taken 1003 times.
✗ Branch 4 → 38 not taken.
✓ Branch 5 → 6 taken 283 times.
✓ Branch 5 → 10 taken 720 times.
✗ Branch 5 → 14 not taken.
1003 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 720 case TY_INT: // fallthrough
1485 case TY_SHORT: // fallthrough
1486 case TY_LONG:
1487
3/6
✓ Branch 10 → 11 taken 720 times.
✗ Branch 10 → 28 not taken.
✓ Branch 11 → 12 taken 720 times.
✗ Branch 11 → 28 not taken.
✓ Branch 12 → 13 taken 720 times.
✗ Branch 12 → 28 not taken.
720 return {.value = builder.CreateNeg(lhsV(), "")};
1488 default: // GCOV_EXCL_LINE
1489 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: -"); // GCOV_EXCL_LINE
1490 }
1491 1003 }
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 18 LLVMExprResult OpRuleConversionManager::getPrefixMinusMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1514
1/2
✓ Branch 2 → 3 taken 18 times.
✗ Branch 2 → 44 not taken.
36 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1515
1/2
✓ Branch 3 → 4 taken 18 times.
✗ Branch 3 → 45 not taken.
18 lhsSTy = lhsSTy.removeReferenceWrapper();
1516
1517
4/7
✓ Branch 4 → 5 taken 18 times.
✗ Branch 4 → 62 not taken.
✓ Branch 5 → 6 taken 4 times.
✓ Branch 5 → 12 taken 1 time.
✓ Branch 5 → 18 taken 13 times.
✗ Branch 5 → 24 not taken.
✗ Branch 5 → 33 not taken.
18 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 13 case TY_LONG:
1523
5/10
✓ Branch 18 → 19 taken 13 times.
✗ Branch 18 → 62 not taken.
✓ Branch 19 → 20 taken 13 times.
✗ Branch 19 → 48 not taken.
✓ Branch 20 → 21 taken 13 times.
✗ Branch 20 → 48 not taken.
✓ Branch 21 → 22 taken 13 times.
✗ Branch 21 → 48 not taken.
✓ Branch 22 → 23 taken 13 times.
✗ Branch 22 → 48 not taken.
13 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 18 }
1532
1533 3427 LLVMExprResult OpRuleConversionManager::getPrefixNotInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1534
1/2
✓ Branch 2 → 3 taken 3427 times.
✗ Branch 2 → 20 not taken.
6854 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1535
1/2
✓ Branch 3 → 4 taken 3427 times.
✗ Branch 3 → 21 not taken.
3427 lhsSTy = lhsSTy.removeReferenceWrapper();
1536
1537
2/4
✓ Branch 4 → 5 taken 3427 times.
✗ Branch 4 → 32 not taken.
✓ Branch 5 → 6 taken 3427 times.
✗ Branch 5 → 11 not taken.
3427 switch (lhsSTy.getSuperType()) {
1538 3427 case TY_BOOL:
1539
3/6
✓ Branch 6 → 7 taken 3427 times.
✗ Branch 6 → 22 not taken.
✓ Branch 7 → 8 taken 3427 times.
✗ Branch 7 → 22 not taken.
✓ Branch 8 → 9 taken 3427 times.
✗ Branch 8 → 22 not taken.
6854 return {.value = builder.CreateNot(lhsV())};
1540 default: // GCOV_EXCL_LINE
1541 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: !"); // GCOV_EXCL_LINE
1542 }
1543 3427 }
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 4404 LLVMExprResult OpRuleConversionManager::getPostfixPlusPlusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) {
1566
1/2
✓ Branch 2 → 3 taken 4404 times.
✗ Branch 2 → 54 not taken.
8799 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1567 4413 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1568
1/2
✓ Branch 4 → 5 taken 4404 times.
✗ Branch 4 → 55 not taken.
4404 lhsSTy = lhsSTy.removeReferenceWrapper();
1569
1570 // Handle operator overloads
1571
3/4
✓ Branch 5 → 6 taken 4404 times.
✗ Branch 5 → 80 not taken.
✓ Branch 6 → 7 taken 9 times.
✓ Branch 6 → 13 taken 4395 times.
4404 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 4395 times.
✗ Branch 13 → 80 not taken.
✓ Branch 14 → 15 taken 334 times.
✓ Branch 14 → 21 taken 21 times.
✓ Branch 14 → 27 taken 4015 times.
✓ Branch 14 → 33 taken 25 times.
✗ Branch 14 → 42 not taken.
4395 switch (lhsSTy.getSuperType()) {
1575 334 case TY_INT:
1576
5/10
✓ Branch 15 → 16 taken 334 times.
✗ Branch 15 → 80 not taken.
✓ Branch 16 → 17 taken 334 times.
✗ Branch 16 → 64 not taken.
✓ Branch 17 → 18 taken 334 times.
✗ Branch 17 → 64 not taken.
✓ Branch 18 → 19 taken 334 times.
✗ Branch 18 → 64 not taken.
✓ Branch 19 → 20 taken 334 times.
✗ Branch 19 → 64 not taken.
334 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 4015 case TY_LONG:
1580
5/10
✓ Branch 27 → 28 taken 4015 times.
✗ Branch 27 → 80 not taken.
✓ Branch 28 → 29 taken 4015 times.
✗ Branch 28 → 66 not taken.
✓ Branch 29 → 30 taken 4015 times.
✗ Branch 29 → 66 not taken.
✓ Branch 30 → 31 taken 4015 times.
✗ Branch 30 → 66 not taken.
✓ Branch 31 → 32 taken 4015 times.
✗ Branch 31 → 66 not taken.
4015 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.
4413 }
1589
1590 424 LLVMExprResult OpRuleConversionManager::getPostfixMinusMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) {
1591
1/2
✓ Branch 2 → 3 taken 424 times.
✗ Branch 2 → 54 not taken.
841 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1592 431 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1593
1/2
✓ Branch 4 → 5 taken 424 times.
✗ Branch 4 → 55 not taken.
424 lhsSTy = lhsSTy.removeReferenceWrapper();
1594
1595 // Handle operator overloads
1596
3/4
✓ Branch 5 → 6 taken 424 times.
✗ Branch 5 → 80 not taken.
✓ Branch 6 → 7 taken 7 times.
✓ Branch 6 → 13 taken 417 times.
424 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 417 times.
✗ Branch 13 → 80 not taken.
✓ Branch 14 → 15 taken 16 times.
✓ Branch 14 → 21 taken 5 times.
✓ Branch 14 → 27 taken 394 times.
✓ Branch 14 → 33 taken 2 times.
✗ Branch 14 → 42 not taken.
417 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 394 case TY_LONG:
1605
5/10
✓ Branch 27 → 28 taken 394 times.
✗ Branch 27 → 80 not taken.
✓ Branch 28 → 29 taken 394 times.
✗ Branch 28 → 66 not taken.
✓ Branch 29 → 30 taken 394 times.
✗ Branch 29 → 66 not taken.
✓ Branch 30 → 31 taken 394 times.
✗ Branch 30 → 66 not taken.
✓ Branch 31 → 32 taken 394 times.
✗ Branch 31 → 66 not taken.
394 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.
431 }
1614
1615 7814 LLVMExprResult OpRuleConversionManager::getCastInst(const ASTNode *node, QualType lhsSTy, LLVMExprResult &rhs,
1616 QualType rhsSTy) const {
1617
1/2
✓ Branch 2 → 3 taken 7814 times.
✗ Branch 2 → 153 not taken.
12901 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1618 7822 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1619
1/2
✓ Branch 4 → 5 taken 7814 times.
✗ Branch 4 → 154 not taken.
7814 lhsSTy = lhsSTy.removeReferenceWrapper();
1620
1/2
✓ Branch 5 → 6 taken 7814 times.
✗ Branch 5 → 155 not taken.
7814 rhsSTy = rhsSTy.removeReferenceWrapper();
1621
1/2
✓ Branch 6 → 7 taken 7814 times.
✗ Branch 6 → 194 not taken.
7814 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1622
1623 // Handle identity casts
1624
3/4
✓ Branch 7 → 8 taken 7814 times.
✗ Branch 7 → 194 not taken.
✓ Branch 8 → 9 taken 862 times.
✓ Branch 8 → 10 taken 6952 times.
7814 if (lhsSTy.matches(rhsSTy, false, true, false))
1625 862 return rhs;
1626
1627
13/18
✓ Branch 10 → 11 taken 6952 times.
✗ Branch 10 → 194 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 2324 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 1351 times.
✓ Branch 11 → 86 taken 46 times.
✓ Branch 11 → 88 taken 176 times.
✓ Branch 11 → 93 taken 1746 times.
✗ Branch 11 → 95 not taken.
✗ Branch 11 → 108 not taken.
✓ Branch 11 → 123 taken 8 times.
✗ Branch 11 → 141 not taken.
6952 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 2324 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 2324 times.
✗ Branch 13 → 156 not taken.
2324 const QualType lhsContained = lhsSTy.getContained();
1641
1/2
✓ Branch 14 → 15 taken 2324 times.
✗ Branch 14 → 156 not taken.
2324 const QualType rhsContained = rhsSTy.getContained();
1642
5/6
✓ Branch 15 → 16 taken 2324 times.
✗ Branch 15 → 156 not taken.
✓ Branch 16 → 17 taken 2319 times.
✓ Branch 16 → 19 taken 5 times.
✓ Branch 21 → 22 taken 467 times.
✓ Branch 21 → 25 taken 1857 times.
4643 if (lhsContained.matchesInterfaceImplementedByStruct(rhsContained) ||
1643
3/4
✓ Branch 17 → 18 taken 2319 times.
✗ Branch 17 → 156 not taken.
✓ Branch 18 → 19 taken 462 times.
✓ Branch 18 → 20 taken 1857 times.
2319 lhsContained.matchesComposedBaseOfStruct(rhsContained))
1644
2/4
✓ Branch 22 → 23 taken 467 times.
✗ Branch 22 → 156 not taken.
✓ Branch 23 → 24 taken 467 times.
✗ Branch 23 → 156 not taken.
467 return {.value = irGenerator->getUpcastedStructPtr(rhsV(), lhsSTy, rhsSTy)};
1645 1857 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 1351 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 1351 times.
✗ Branch 81 → 167 not taken.
✓ Branch 82 → 83 taken 1351 times.
✗ Branch 82 → 167 not taken.
✓ Branch 83 → 84 taken 1351 times.
✗ Branch 83 → 167 not taken.
✓ Branch 84 → 85 taken 1351 times.
✗ Branch 84 → 167 not taken.
1351 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 1746 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 1746 times.
✗ Branch 93 → 194 not taken.
1746 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 7814 }
1702
1703 62952 bool OpRuleConversionManager::callsOverloadedOpFct(const ASTNode *node, size_t opIdx) const {
1704 62952 const std::vector<const Function *> &opFctList = irGenerator->getOpFctPointers(node);
1705
4/4
✓ Branch 4 → 5 taken 61949 times.
✓ Branch 4 → 8 taken 1003 times.
✓ Branch 6 → 7 taken 5485 times.
✓ Branch 6 → 8 taken 56464 times.
62952 return opFctList.size() > opIdx && opFctList.at(opIdx) != nullptr;
1706 }
1707
1708 template <size_t N>
1709 5469 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 5469 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 5451 times.
✗ Branch 2 → 137 not taken.
5469 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 5451 times.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 5451 times.
✗ Branch 6 → 8 not taken.
5469 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 5451 times.
✗ Branch 9 → 137 not taken.
✓ Branch 11 → 12 taken 5451 times.
✗ Branch 11 → 16 not taken.
✓ Branch 12 → 13 taken 5451 times.
✗ Branch 12 → 137 not taken.
✓ Branch 14 → 15 taken 5451 times.
✗ Branch 14 → 16 not taken.
5469 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 5451 times.
✗ Branch 17 → 137 not taken.
✓ Branch 18 → 19 taken 5451 times.
✗ Branch 18 → 137 not taken.
5469 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 5451 times.
5469 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 5451 times.
✗ Branch 21 → 137 not taken.
5469 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 5451 times.
5469 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 5451 times.
✗ Branch 24 → 135 not taken.
5469 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 5451 times.
5469 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 5451 times.
✗ Branch 29 → 133 not taken.
✓ Branch 30 → 31 taken 5294 times.
✓ Branch 30 → 34 taken 157 times.
✓ Branch 32 → 33 taken 5294 times.
✗ Branch 32 → 133 not taken.
✓ Branch 35 → 36 taken 157 times.
✗ Branch 35 → 133 not taken.
5469 argValues[0] = paramTypes[0].isRef() ? opV[1]() : opV[0]();
1727 if constexpr (N == 2)
1728
5/8
✓ Branch 38 → 39 taken 5451 times.
✗ Branch 38 → 133 not taken.
✓ Branch 39 → 40 taken 2797 times.
✓ Branch 39 → 43 taken 2654 times.
✓ Branch 41 → 42 taken 2797 times.
✗ Branch 41 → 133 not taken.
✓ Branch 44 → 45 taken 2654 times.
✗ Branch 44 → 133 not taken.
5451 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 5451 times.
✗ Branch 47 → 113 not taken.
✓ Branch 48 → 49 taken 959 times.
✓ Branch 48 → 78 taken 4492 times.
5469 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 959 times.
✗ Branch 49 → 122 not taken.
972 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 959 times.
✗ Branch 50 → 122 not taken.
✓ Branch 51 → 52 taken 571 times.
✓ Branch 51 → 54 taken 388 times.
972 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 571 times.
✗ Branch 52 → 122 not taken.
572 returnType = opFct->returnType.toLLVMType(irGenerator->sourceFile);
1736
1737 // Get arg types
1738 972 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 959 times.
✗ Branch 54 → 117 not taken.
✓ Branch 70 → 57 taken 1918 times.
✓ Branch 70 → 71 taken 959 times.
3875 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 1918 times.
✗ Branch 59 → 114 not taken.
✓ Branch 60 → 61 taken 1918 times.
✗ Branch 60 → 114 not taken.
1931 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 959 times.
✗ Branch 73 → 118 not taken.
972 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 959 times.
✗ Branch 75 → 119 not taken.
972 irGenerator->module->getOrInsertFunction(mangledName, fctType);
1744 972 }
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 5451 times.
✗ Branch 79 → 123 not taken.
5469 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 5451 times.
5469 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 5451 times.
✗ Branch 82 → 126 not taken.
✓ Branch 84 → 85 taken 5451 times.
✗ Branch 84 → 124 not taken.
✓ Branch 85 → 86 taken 5451 times.
✗ Branch 85 → 124 not taken.
✓ Branch 86 → 87 taken 5451 times.
✗ Branch 86 → 133 not taken.
5469 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 896 times.
✓ Branch 89 → 92 taken 4555 times.
5469 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 896 times.
✗ Branch 90 → 133 not taken.
910 return {.constant = builder.getTrue()};
1756
1757 // Attach address to anonymous symbol to keep track of de-allocation
1758 4559 SymbolTableEntry *anonymousSymbol = nullptr;
1759 4559 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 4555 times.
✗ Branch 92 → 133 not taken.
✓ Branch 93 → 94 taken 621 times.
✓ Branch 93 → 105 taken 3934 times.
4559 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 anonymousSymbol->updateAddress(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 4555 times.
✗ Branch 105 → 133 not taken.
✓ Branch 106 → 107 taken 2610 times.
✓ Branch 106 → 108 taken 1945 times.
4559 if (opFct->returnType.isRef())
1771 2612 return {.ptr = result, .refPtr = resultPtr, .entry = anonymousSymbol};
1772
1773 // Otherwise as value
1774 1947 return {.value = result, .ptr = resultPtr, .entry = anonymousSymbol};
1775 5469 }
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 3981 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 447 times.
✓ Branch 3 → 7 taken 3534 times.
✓ Branch 5 → 6 taken 372 times.
✓ Branch 5 → 7 taken 75 times.
✓ Branch 8 → 9 taken 372 times.
✓ Branch 8 → 13 taken 3609 times.
3981 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1795
2/4
✓ Branch 9 → 10 taken 372 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 372 times.
✗ Branch 10 → 18 not taken.
372 return builder.CreateICmpSLT(lhsV, rhsV);
1796 else
1797
2/4
✓ Branch 13 → 14 taken 3609 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 3609 times.
✗ Branch 14 → 19 not taken.
3609 return builder.CreateICmpULT(lhsV, rhsV);
1798 }
1799
1800 1094 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 52 times.
✓ Branch 3 → 7 taken 1042 times.
✓ Branch 5 → 6 taken 41 times.
✓ Branch 5 → 7 taken 11 times.
✓ Branch 8 → 9 taken 41 times.
✓ Branch 8 → 13 taken 1053 times.
1094 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1803
2/4
✓ Branch 9 → 10 taken 41 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 41 times.
✗ Branch 10 → 18 not taken.
41 return builder.CreateICmpSLE(lhsV, rhsV);
1804 else
1805
2/4
✓ Branch 13 → 14 taken 1053 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 1053 times.
✗ Branch 14 → 19 not taken.
1053 return builder.CreateICmpULE(lhsV, rhsV);
1806 }
1807
1808 1569 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 483 times.
✓ Branch 3 → 7 taken 1086 times.
✓ Branch 5 → 6 taken 89 times.
✓ Branch 5 → 7 taken 394 times.
✓ Branch 8 → 9 taken 89 times.
✓ Branch 8 → 13 taken 1480 times.
1569 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1811
2/4
✓ Branch 9 → 10 taken 89 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 89 times.
✗ Branch 10 → 18 not taken.
89 return builder.CreateICmpSGT(lhsV, rhsV);
1812 else
1813
2/4
✓ Branch 13 → 14 taken 1480 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 1480 times.
✗ Branch 14 → 19 not taken.
1480 return builder.CreateICmpUGT(lhsV, rhsV);
1814 }
1815
1816 1838 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 1636 times.
✓ Branch 5 → 6 taken 186 times.
✓ Branch 5 → 7 taken 16 times.
✓ Branch 8 → 9 taken 186 times.
✓ Branch 8 → 13 taken 1652 times.
1838 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 1652 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 1652 times.
✗ Branch 14 → 19 not taken.
1652 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 159 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 76 times.
✓ Branch 3 → 7 taken 83 times.
✓ Branch 5 → 6 taken 53 times.
✓ Branch 5 → 7 taken 23 times.
✓ Branch 8 → 9 taken 53 times.
✓ Branch 8 → 13 taken 106 times.
159 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1835
2/4
✓ Branch 9 → 10 taken 53 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 53 times.
✗ Branch 10 → 18 not taken.
53 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