GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 96.9% 1206 / 68 / 1313
Functions: 94.4% 134 / 0 / 142
Branches: 51.6% 2693 / 136 / 5353

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 5791 OpRuleConversionManager::OpRuleConversionManager(SourceFile *sourceFile, IRGenerator *irGenerator)
17 5791 : builder(sourceFile->builder), irGenerator(irGenerator), stdFunctionManager(irGenerator->stdFunctionManager) {}
18
19 4187 LLVMExprResult OpRuleConversionManager::getPlusEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
20 LLVMExprResult &rhs, QualType rhsSTy) {
21
1/2
✓ Branch 2 → 3 taken 4187 times.
✗ Branch 2 → 156 not taken.
6752 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
22
1/2
✓ Branch 3 → 4 taken 4187 times.
✗ Branch 3 → 157 not taken.
6774 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
23 5809 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
24 5787 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
25
1/2
✓ Branch 6 → 7 taken 4187 times.
✗ Branch 6 → 158 not taken.
4187 lhsSTy = lhsSTy.removeReferenceWrapper();
26
1/2
✓ Branch 7 → 8 taken 4187 times.
✗ Branch 7 → 159 not taken.
4187 rhsSTy = rhsSTy.removeReferenceWrapper();
27
1/2
✓ Branch 8 → 9 taken 4187 times.
✗ Branch 8 → 196 not taken.
4187 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
28
29 // Handle operator overloads
30
3/4
✓ Branch 9 → 10 taken 4187 times.
✗ Branch 9 → 196 not taken.
✓ Branch 10 → 11 taken 1622 times.
✓ Branch 10 → 19 taken 2565 times.
4187 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
31 1622 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
32
33
11/13
✓ Branch 19 → 20 taken 2565 times.
✗ Branch 19 → 196 not taken.
✓ Branch 20 → 21 taken 186 times.
✓ Branch 20 → 26 taken 233 times.
✓ Branch 20 → 37 taken 18 times.
✓ Branch 20 → 51 taken 2 times.
✓ Branch 20 → 65 taken 2 times.
✓ Branch 20 → 76 taken 2 times.
✓ Branch 20 → 90 taken 14 times.
✓ Branch 20 → 104 taken 1760 times.
✓ Branch 20 → 115 taken 14 times.
✓ Branch 20 → 129 taken 334 times.
✗ Branch 20 → 142 not taken.
2565 switch (getTypeCombination(lhsSTy, rhsSTy)) {
34 186 case COMB(TY_DOUBLE, TY_DOUBLE):
35
4/8
✓ Branch 21 → 22 taken 186 times.
✗ Branch 21 → 168 not taken.
✓ Branch 22 → 23 taken 186 times.
✗ Branch 22 → 168 not taken.
✓ Branch 23 → 24 taken 186 times.
✗ Branch 23 → 168 not taken.
✓ Branch 24 → 25 taken 186 times.
✗ Branch 24 → 168 not taken.
186 return {.value = builder.CreateFAdd(lhsV(), rhsV())};
36 233 case COMB(TY_INT, TY_INT):
37
9/16
✓ Branch 26 → 27 taken 233 times.
✗ Branch 26 → 196 not taken.
✓ Branch 27 → 28 taken 151 times.
✓ Branch 27 → 31 taken 82 times.
✓ Branch 28 → 29 taken 151 times.
✗ Branch 28 → 196 not taken.
✓ Branch 29 → 30 taken 151 times.
✗ Branch 29 → 31 not taken.
✓ Branch 32 → 33 taken 233 times.
✗ Branch 32 → 169 not taken.
✓ Branch 33 → 34 taken 233 times.
✗ Branch 33 → 169 not taken.
✓ Branch 34 → 35 taken 233 times.
✗ Branch 34 → 169 not taken.
✓ Branch 35 → 36 taken 233 times.
✗ Branch 35 → 169 not taken.
233 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
38 18 case COMB(TY_INT, TY_SHORT): // fallthrough
39 case COMB(TY_INT, TY_LONG): {
40
5/10
✓ Branch 37 → 38 taken 18 times.
✗ Branch 37 → 170 not taken.
✓ Branch 38 → 39 taken 18 times.
✗ Branch 38 → 170 not taken.
✓ Branch 39 → 40 taken 18 times.
✗ Branch 39 → 170 not taken.
✓ Branch 40 → 41 taken 18 times.
✗ Branch 40 → 170 not taken.
✓ Branch 41 → 42 taken 18 times.
✗ Branch 41 → 196 not taken.
18 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
41
7/14
✓ Branch 41 → 42 taken 18 times.
✗ Branch 41 → 196 not taken.
✓ Branch 42 → 43 taken 18 times.
✗ Branch 42 → 46 not taken.
✓ Branch 43 → 44 taken 18 times.
✗ Branch 43 → 196 not taken.
✓ Branch 44 → 45 taken 18 times.
✗ Branch 44 → 46 not taken.
✓ Branch 47 → 48 taken 18 times.
✗ Branch 47 → 171 not taken.
✓ Branch 48 → 49 taken 18 times.
✗ Branch 48 → 171 not taken.
✓ Branch 49 → 50 taken 18 times.
✗ Branch 49 → 171 not taken.
18 return {.value = builder.CreateAdd(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
42 }
43 2 case COMB(TY_SHORT, TY_INT): {
44
5/10
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 172 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 172 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 172 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 172 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 196 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
45
7/14
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 196 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 60 not taken.
✓ Branch 57 → 58 taken 2 times.
✗ Branch 57 → 196 not taken.
✓ Branch 58 → 59 taken 2 times.
✗ Branch 58 → 60 not taken.
✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 173 not taken.
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 173 not taken.
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 173 not taken.
2 return {.value = builder.CreateAdd(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
46 }
47 2 case COMB(TY_SHORT, TY_SHORT):
48
8/16
✓ Branch 65 → 66 taken 2 times.
✗ Branch 65 → 196 not taken.
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 70 not taken.
✓ Branch 67 → 68 taken 2 times.
✗ Branch 67 → 196 not taken.
✓ Branch 68 → 69 taken 2 times.
✗ Branch 68 → 70 not taken.
✓ Branch 71 → 72 taken 2 times.
✗ Branch 71 → 174 not taken.
✓ Branch 72 → 73 taken 2 times.
✗ Branch 72 → 174 not taken.
✓ Branch 73 → 74 taken 2 times.
✗ Branch 73 → 174 not taken.
✓ Branch 74 → 75 taken 2 times.
✗ Branch 74 → 174 not taken.
2 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
49 2 case COMB(TY_SHORT, TY_LONG): {
50
5/10
✓ Branch 76 → 77 taken 2 times.
✗ Branch 76 → 175 not taken.
✓ Branch 77 → 78 taken 2 times.
✗ Branch 77 → 175 not taken.
✓ Branch 78 → 79 taken 2 times.
✗ Branch 78 → 175 not taken.
✓ Branch 79 → 80 taken 2 times.
✗ Branch 79 → 175 not taken.
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 196 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
51
7/14
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 196 not taken.
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 85 not taken.
✓ Branch 82 → 83 taken 2 times.
✗ Branch 82 → 196 not taken.
✓ Branch 83 → 84 taken 2 times.
✗ Branch 83 → 85 not taken.
✓ Branch 86 → 87 taken 2 times.
✗ Branch 86 → 176 not taken.
✓ Branch 87 → 88 taken 2 times.
✗ Branch 87 → 176 not taken.
✓ Branch 88 → 89 taken 2 times.
✗ Branch 88 → 176 not taken.
2 return {.value = builder.CreateAdd(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
52 }
53 14 case COMB(TY_LONG, TY_INT): // fallthrough
54 case COMB(TY_LONG, TY_SHORT): {
55
5/10
✓ Branch 90 → 91 taken 14 times.
✗ Branch 90 → 177 not taken.
✓ Branch 91 → 92 taken 14 times.
✗ Branch 91 → 177 not taken.
✓ Branch 92 → 93 taken 14 times.
✗ Branch 92 → 177 not taken.
✓ Branch 93 → 94 taken 14 times.
✗ Branch 93 → 177 not taken.
✓ Branch 94 → 95 taken 14 times.
✗ Branch 94 → 196 not taken.
14 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
56
9/14
✓ Branch 94 → 95 taken 14 times.
✗ Branch 94 → 196 not taken.
✓ Branch 95 → 96 taken 6 times.
✓ Branch 95 → 99 taken 8 times.
✓ Branch 96 → 97 taken 6 times.
✗ Branch 96 → 196 not taken.
✓ Branch 97 → 98 taken 4 times.
✓ Branch 97 → 99 taken 2 times.
✓ Branch 100 → 101 taken 14 times.
✗ Branch 100 → 178 not taken.
✓ Branch 101 → 102 taken 14 times.
✗ Branch 101 → 178 not taken.
✓ Branch 102 → 103 taken 14 times.
✗ Branch 102 → 178 not taken.
14 return {.value = builder.CreateAdd(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
57 }
58 1760 case COMB(TY_LONG, TY_LONG):
59
9/16
✓ Branch 104 → 105 taken 1760 times.
✗ Branch 104 → 196 not taken.
✓ Branch 105 → 106 taken 48 times.
✓ Branch 105 → 109 taken 1712 times.
✓ Branch 106 → 107 taken 48 times.
✗ Branch 106 → 196 not taken.
✓ Branch 107 → 108 taken 48 times.
✗ Branch 107 → 109 not taken.
✓ Branch 110 → 111 taken 1760 times.
✗ Branch 110 → 179 not taken.
✓ Branch 111 → 112 taken 1760 times.
✗ Branch 111 → 179 not taken.
✓ Branch 112 → 113 taken 1760 times.
✗ Branch 112 → 179 not taken.
✓ Branch 113 → 114 taken 1760 times.
✗ Branch 113 → 179 not taken.
1760 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
60 14 case COMB(TY_CHAR, TY_INT): {
61
5/10
✓ Branch 115 → 116 taken 14 times.
✗ Branch 115 → 180 not taken.
✓ Branch 116 → 117 taken 14 times.
✗ Branch 116 → 180 not taken.
✓ Branch 117 → 118 taken 14 times.
✗ Branch 117 → 180 not taken.
✓ Branch 118 → 119 taken 14 times.
✗ Branch 118 → 180 not taken.
✓ Branch 119 → 120 taken 14 times.
✗ Branch 119 → 196 not taken.
14 llvm::Value *rhsChar = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
62
5/14
✓ Branch 119 → 120 taken 14 times.
✗ Branch 119 → 196 not taken.
✗ Branch 120 → 121 not taken.
✓ Branch 120 → 124 taken 14 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 14 times.
✗ Branch 125 → 181 not taken.
✓ Branch 126 → 127 taken 14 times.
✗ Branch 126 → 181 not taken.
✓ Branch 127 → 128 taken 14 times.
✗ Branch 127 → 181 not taken.
14 return {.value = builder.CreateAdd(lhsV(), rhsChar, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
63 }
64 334 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 334 times.
✗ Branch 129 → 182 not taken.
✓ Branch 130 → 131 taken 334 times.
✗ Branch 130 → 182 not taken.
334 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
68
5/10
✓ Branch 131 → 132 taken 334 times.
✗ Branch 131 → 183 not taken.
✓ Branch 132 → 133 taken 334 times.
✗ Branch 132 → 183 not taken.
✓ Branch 133 → 134 taken 334 times.
✗ Branch 133 → 183 not taken.
✓ Branch 134 → 135 taken 334 times.
✗ Branch 134 → 183 not taken.
✓ Branch 135 → 136 taken 334 times.
✗ Branch 135 → 183 not taken.
334 llvm::Value *rhsVExt = builder.CreateIntCast(rhsV(), builder.getInt64Ty(), rhsSTy.isSigned());
69
2/4
✓ Branch 139 → 140 taken 334 times.
✗ Branch 139 → 184 not taken.
✓ Branch 140 → 141 taken 334 times.
✗ Branch 140 → 184 not taken.
668 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 1622 times.
✗ Branch 11 → 162 not taken.
✓ Branch 12 → 13 taken 1622 times.
✗ Branch 12 → 162 not taken.
✓ Branch 13 → 14 taken 1622 times.
✗ Branch 13 → 162 not taken.
✓ Branch 14 → 15 taken 1622 times.
✗ Branch 14 → 162 not taken.
✓ Branch 15 → 16 taken 1622 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.
5809 }
75
76 191 LLVMExprResult OpRuleConversionManager::getMinusEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
77 LLVMExprResult &rhs, QualType rhsSTy) {
78
1/2
✓ Branch 2 → 3 taken 191 times.
✗ Branch 2 → 158 not taken.
366 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
79
1/2
✓ Branch 3 → 4 taken 191 times.
✗ Branch 3 → 159 not taken.
382 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
80 207 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
81 191 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
82
1/2
✓ Branch 6 → 7 taken 191 times.
✗ Branch 6 → 160 not taken.
191 lhsSTy = lhsSTy.removeReferenceWrapper();
83
1/2
✓ Branch 7 → 8 taken 191 times.
✗ Branch 7 → 161 not taken.
191 rhsSTy = rhsSTy.removeReferenceWrapper();
84
1/2
✓ Branch 8 → 9 taken 191 times.
✗ Branch 8 → 199 not taken.
191 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
85
86 // Handle operator overloads
87
3/4
✓ Branch 9 → 10 taken 191 times.
✗ Branch 9 → 199 not taken.
✓ Branch 10 → 11 taken 16 times.
✓ Branch 10 → 19 taken 175 times.
191 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
88 16 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
89
90
11/13
✓ Branch 19 → 20 taken 175 times.
✗ Branch 19 → 199 not taken.
✓ Branch 20 → 21 taken 12 times.
✓ Branch 20 → 26 taken 47 times.
✓ Branch 20 → 37 taken 8 times.
✓ Branch 20 → 51 taken 2 times.
✓ Branch 20 → 65 taken 6 times.
✓ Branch 20 → 76 taken 2 times.
✓ Branch 20 → 90 taken 42 times.
✓ Branch 20 → 104 taken 32 times.
✓ Branch 20 → 115 taken 14 times.
✓ Branch 20 → 129 taken 10 times.
✗ Branch 20 → 144 not taken.
175 switch (getTypeCombination(lhsSTy, rhsSTy)) {
91 12 case COMB(TY_DOUBLE, TY_DOUBLE):
92
4/8
✓ Branch 21 → 22 taken 12 times.
✗ Branch 21 → 170 not taken.
✓ Branch 22 → 23 taken 12 times.
✗ Branch 22 → 170 not taken.
✓ Branch 23 → 24 taken 12 times.
✗ Branch 23 → 170 not taken.
✓ Branch 24 → 25 taken 12 times.
✗ Branch 24 → 170 not taken.
12 return {.value = builder.CreateFSub(lhsV(), rhsV())};
93 47 case COMB(TY_INT, TY_INT):
94
9/16
✓ Branch 26 → 27 taken 47 times.
✗ Branch 26 → 199 not taken.
✓ Branch 27 → 28 taken 39 times.
✓ Branch 27 → 31 taken 8 times.
✓ Branch 28 → 29 taken 39 times.
✗ Branch 28 → 199 not taken.
✓ Branch 29 → 30 taken 39 times.
✗ Branch 29 → 31 not taken.
✓ Branch 32 → 33 taken 47 times.
✗ Branch 32 → 171 not taken.
✓ Branch 33 → 34 taken 47 times.
✗ Branch 33 → 171 not taken.
✓ Branch 34 → 35 taken 47 times.
✗ Branch 34 → 171 not taken.
✓ Branch 35 → 36 taken 47 times.
✗ Branch 35 → 171 not taken.
47 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
95 8 case COMB(TY_INT, TY_SHORT): // fallthrough
96 case COMB(TY_INT, TY_LONG): {
97
5/10
✓ Branch 37 → 38 taken 8 times.
✗ Branch 37 → 172 not taken.
✓ Branch 38 → 39 taken 8 times.
✗ Branch 38 → 172 not taken.
✓ Branch 39 → 40 taken 8 times.
✗ Branch 39 → 172 not taken.
✓ Branch 40 → 41 taken 8 times.
✗ Branch 40 → 172 not taken.
✓ Branch 41 → 42 taken 8 times.
✗ Branch 41 → 199 not taken.
8 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
98
7/14
✓ Branch 41 → 42 taken 8 times.
✗ Branch 41 → 199 not taken.
✓ Branch 42 → 43 taken 8 times.
✗ Branch 42 → 46 not taken.
✓ Branch 43 → 44 taken 8 times.
✗ Branch 43 → 199 not taken.
✓ Branch 44 → 45 taken 8 times.
✗ Branch 44 → 46 not taken.
✓ Branch 47 → 48 taken 8 times.
✗ Branch 47 → 173 not taken.
✓ Branch 48 → 49 taken 8 times.
✗ Branch 48 → 173 not taken.
✓ Branch 49 → 50 taken 8 times.
✗ Branch 49 → 173 not taken.
8 return {.value = builder.CreateSub(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
99 }
100 2 case COMB(TY_SHORT, TY_INT): {
101
5/10
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 174 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 174 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 174 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 174 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 199 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
102
7/14
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 199 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 60 not taken.
✓ Branch 57 → 58 taken 2 times.
✗ Branch 57 → 199 not taken.
✓ Branch 58 → 59 taken 2 times.
✗ Branch 58 → 60 not taken.
✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 175 not taken.
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 175 not taken.
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 175 not taken.
2 return {.value = builder.CreateSub(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
103 }
104 6 case COMB(TY_SHORT, TY_SHORT):
105
8/16
✓ Branch 65 → 66 taken 6 times.
✗ Branch 65 → 199 not taken.
✓ Branch 66 → 67 taken 6 times.
✗ Branch 66 → 70 not taken.
✓ Branch 67 → 68 taken 6 times.
✗ Branch 67 → 199 not taken.
✓ Branch 68 → 69 taken 6 times.
✗ Branch 68 → 70 not taken.
✓ Branch 71 → 72 taken 6 times.
✗ Branch 71 → 176 not taken.
✓ Branch 72 → 73 taken 6 times.
✗ Branch 72 → 176 not taken.
✓ Branch 73 → 74 taken 6 times.
✗ Branch 73 → 176 not taken.
✓ Branch 74 → 75 taken 6 times.
✗ Branch 74 → 176 not taken.
6 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
106 2 case COMB(TY_SHORT, TY_LONG): {
107
5/10
✓ Branch 76 → 77 taken 2 times.
✗ Branch 76 → 177 not taken.
✓ Branch 77 → 78 taken 2 times.
✗ Branch 77 → 177 not taken.
✓ Branch 78 → 79 taken 2 times.
✗ Branch 78 → 177 not taken.
✓ Branch 79 → 80 taken 2 times.
✗ Branch 79 → 177 not taken.
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 199 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
108
7/14
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 199 not taken.
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 85 not taken.
✓ Branch 82 → 83 taken 2 times.
✗ Branch 82 → 199 not taken.
✓ Branch 83 → 84 taken 2 times.
✗ Branch 83 → 85 not taken.
✓ Branch 86 → 87 taken 2 times.
✗ Branch 86 → 178 not taken.
✓ Branch 87 → 88 taken 2 times.
✗ Branch 87 → 178 not taken.
✓ Branch 88 → 89 taken 2 times.
✗ Branch 88 → 178 not taken.
2 return {.value = builder.CreateSub(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
109 }
110 42 case COMB(TY_LONG, TY_INT): // fallthrough
111 case COMB(TY_LONG, TY_SHORT): {
112
5/10
✓ Branch 90 → 91 taken 42 times.
✗ Branch 90 → 179 not taken.
✓ Branch 91 → 92 taken 42 times.
✗ Branch 91 → 179 not taken.
✓ Branch 92 → 93 taken 42 times.
✗ Branch 92 → 179 not taken.
✓ Branch 93 → 94 taken 42 times.
✗ Branch 93 → 179 not taken.
✓ Branch 94 → 95 taken 42 times.
✗ Branch 94 → 199 not taken.
42 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
113
8/14
✓ Branch 94 → 95 taken 42 times.
✗ Branch 94 → 199 not taken.
✓ Branch 95 → 96 taken 34 times.
✓ Branch 95 → 99 taken 8 times.
✓ Branch 96 → 97 taken 34 times.
✗ Branch 96 → 199 not taken.
✓ Branch 97 → 98 taken 34 times.
✗ Branch 97 → 99 not taken.
✓ Branch 100 → 101 taken 42 times.
✗ Branch 100 → 180 not taken.
✓ Branch 101 → 102 taken 42 times.
✗ Branch 101 → 180 not taken.
✓ Branch 102 → 103 taken 42 times.
✗ Branch 102 → 180 not taken.
42 return {.value = builder.CreateSub(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
114 }
115 32 case COMB(TY_LONG, TY_LONG):
116
9/16
✓ Branch 104 → 105 taken 32 times.
✗ Branch 104 → 199 not taken.
✓ Branch 105 → 106 taken 18 times.
✓ Branch 105 → 109 taken 14 times.
✓ Branch 106 → 107 taken 18 times.
✗ Branch 106 → 199 not taken.
✓ Branch 107 → 108 taken 18 times.
✗ Branch 107 → 109 not taken.
✓ Branch 110 → 111 taken 32 times.
✗ Branch 110 → 181 not taken.
✓ Branch 111 → 112 taken 32 times.
✗ Branch 111 → 181 not taken.
✓ Branch 112 → 113 taken 32 times.
✗ Branch 112 → 181 not taken.
✓ Branch 113 → 114 taken 32 times.
✗ Branch 113 → 181 not taken.
32 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
117 14 case COMB(TY_CHAR, TY_INT): {
118
5/10
✓ Branch 115 → 116 taken 14 times.
✗ Branch 115 → 182 not taken.
✓ Branch 116 → 117 taken 14 times.
✗ Branch 116 → 182 not taken.
✓ Branch 117 → 118 taken 14 times.
✗ Branch 117 → 182 not taken.
✓ Branch 118 → 119 taken 14 times.
✗ Branch 118 → 182 not taken.
✓ Branch 119 → 120 taken 14 times.
✗ Branch 119 → 199 not taken.
14 llvm::Value *rhsChar = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
119
5/14
✓ Branch 119 → 120 taken 14 times.
✗ Branch 119 → 199 not taken.
✗ Branch 120 → 121 not taken.
✓ Branch 120 → 124 taken 14 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 14 times.
✗ Branch 125 → 183 not taken.
✓ Branch 126 → 127 taken 14 times.
✗ Branch 126 → 183 not taken.
✓ Branch 127 → 128 taken 14 times.
✗ Branch 127 → 183 not taken.
14 return {.value = builder.CreateSub(lhsV(), rhsChar, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
120 }
121 10 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 10 times.
✗ Branch 129 → 184 not taken.
✓ Branch 130 → 131 taken 10 times.
✗ Branch 130 → 184 not taken.
10 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
125
6/12
✓ Branch 131 → 132 taken 10 times.
✗ Branch 131 → 185 not taken.
✓ Branch 132 → 133 taken 10 times.
✗ Branch 132 → 185 not taken.
✓ Branch 133 → 134 taken 10 times.
✗ Branch 133 → 185 not taken.
✓ Branch 134 → 135 taken 10 times.
✗ Branch 134 → 185 not taken.
✓ Branch 135 → 136 taken 10 times.
✗ Branch 135 → 185 not taken.
✓ Branch 136 → 137 taken 10 times.
✗ Branch 136 → 186 not taken.
10 llvm::Value *rhsVExt = builder.CreateIntCast(rhsV(), builder.getInt64Ty(), rhsSTy.isSigned());
126
2/4
✓ Branch 136 → 137 taken 10 times.
✗ Branch 136 → 186 not taken.
✓ Branch 137 → 138 taken 10 times.
✗ Branch 137 → 186 not taken.
10 llvm::Value *rhsVNeg = builder.CreateNeg(rhsVExt);
127
2/4
✓ Branch 141 → 142 taken 10 times.
✗ Branch 141 → 187 not taken.
✓ Branch 142 → 143 taken 10 times.
✗ Branch 142 → 187 not taken.
20 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 16 times.
✗ Branch 11 → 164 not taken.
✓ Branch 12 → 13 taken 16 times.
✗ Branch 12 → 164 not taken.
✓ Branch 13 → 14 taken 16 times.
✗ Branch 13 → 164 not taken.
✓ Branch 14 → 15 taken 16 times.
✗ Branch 14 → 164 not taken.
✓ Branch 15 → 16 taken 16 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.
207 }
133
134 506 LLVMExprResult OpRuleConversionManager::getMulEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
135 LLVMExprResult &rhs, QualType rhsSTy) {
136
1/2
✓ Branch 2 → 3 taken 506 times.
✗ Branch 2 → 129 not taken.
1008 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
137
1/2
✓ Branch 3 → 4 taken 506 times.
✗ Branch 3 → 130 not taken.
1012 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
138 510 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
139 506 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
140
1/2
✓ Branch 6 → 7 taken 506 times.
✗ Branch 6 → 131 not taken.
506 lhsSTy = lhsSTy.removeReferenceWrapper();
141
1/2
✓ Branch 7 → 8 taken 506 times.
✗ Branch 7 → 132 not taken.
506 rhsSTy = rhsSTy.removeReferenceWrapper();
142
1/2
✓ Branch 8 → 9 taken 506 times.
✗ Branch 8 → 162 not taken.
506 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
143
144 // Handle operator overloads
145
3/4
✓ Branch 9 → 10 taken 506 times.
✗ Branch 9 → 162 not taken.
✓ Branch 10 → 11 taken 4 times.
✓ Branch 10 → 19 taken 502 times.
506 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
146 4 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
147
148
9/11
✓ Branch 19 → 20 taken 502 times.
✗ Branch 19 → 162 not taken.
✓ Branch 20 → 21 taken 186 times.
✓ Branch 20 → 26 taken 4 times.
✓ Branch 20 → 37 taken 8 times.
✓ Branch 20 → 51 taken 2 times.
✓ Branch 20 → 65 taken 2 times.
✓ Branch 20 → 76 taken 2 times.
✓ Branch 20 → 90 taken 4 times.
✓ Branch 20 → 104 taken 294 times.
✗ Branch 20 → 115 not taken.
502 switch (getTypeCombination(lhsSTy, rhsSTy)) {
149 186 case COMB(TY_DOUBLE, TY_DOUBLE):
150
4/8
✓ Branch 21 → 22 taken 186 times.
✗ Branch 21 → 141 not taken.
✓ Branch 22 → 23 taken 186 times.
✗ Branch 22 → 141 not taken.
✓ Branch 23 → 24 taken 186 times.
✗ Branch 23 → 141 not taken.
✓ Branch 24 → 25 taken 186 times.
✗ Branch 24 → 141 not taken.
186 return {.value = builder.CreateFMul(lhsV(), rhsV())};
151 4 case COMB(TY_INT, TY_INT):
152
8/16
✓ Branch 26 → 27 taken 4 times.
✗ Branch 26 → 162 not taken.
✓ Branch 27 → 28 taken 4 times.
✗ Branch 27 → 31 not taken.
✓ Branch 28 → 29 taken 4 times.
✗ Branch 28 → 162 not taken.
✓ Branch 29 → 30 taken 4 times.
✗ Branch 29 → 31 not taken.
✓ Branch 32 → 33 taken 4 times.
✗ Branch 32 → 142 not taken.
✓ Branch 33 → 34 taken 4 times.
✗ Branch 33 → 142 not taken.
✓ Branch 34 → 35 taken 4 times.
✗ Branch 34 → 142 not taken.
✓ Branch 35 → 36 taken 4 times.
✗ Branch 35 → 142 not taken.
4 return {.value = builder.CreateMul(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
153 8 case COMB(TY_INT, TY_SHORT): // fallthrough
154 case COMB(TY_INT, TY_LONG): {
155
5/10
✓ Branch 37 → 38 taken 8 times.
✗ Branch 37 → 143 not taken.
✓ Branch 38 → 39 taken 8 times.
✗ Branch 38 → 143 not taken.
✓ Branch 39 → 40 taken 8 times.
✗ Branch 39 → 143 not taken.
✓ Branch 40 → 41 taken 8 times.
✗ Branch 40 → 143 not taken.
✓ Branch 41 → 42 taken 8 times.
✗ Branch 41 → 162 not taken.
8 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
156
7/14
✓ Branch 41 → 42 taken 8 times.
✗ Branch 41 → 162 not taken.
✓ Branch 42 → 43 taken 8 times.
✗ Branch 42 → 46 not taken.
✓ Branch 43 → 44 taken 8 times.
✗ Branch 43 → 162 not taken.
✓ Branch 44 → 45 taken 8 times.
✗ Branch 44 → 46 not taken.
✓ Branch 47 → 48 taken 8 times.
✗ Branch 47 → 144 not taken.
✓ Branch 48 → 49 taken 8 times.
✗ Branch 48 → 144 not taken.
✓ Branch 49 → 50 taken 8 times.
✗ Branch 49 → 144 not taken.
8 return {.value = builder.CreateMul(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
157 }
158 2 case COMB(TY_SHORT, TY_INT): {
159
5/10
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 145 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 145 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 145 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 145 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 162 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
160
7/14
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 162 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 60 not taken.
✓ Branch 57 → 58 taken 2 times.
✗ Branch 57 → 162 not taken.
✓ Branch 58 → 59 taken 2 times.
✗ Branch 58 → 60 not taken.
✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 146 not taken.
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 146 not taken.
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 146 not taken.
2 return {.value = builder.CreateMul(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
161 }
162 2 case COMB(TY_SHORT, TY_SHORT):
163
8/16
✓ Branch 65 → 66 taken 2 times.
✗ Branch 65 → 162 not taken.
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 70 not taken.
✓ Branch 67 → 68 taken 2 times.
✗ Branch 67 → 162 not taken.
✓ Branch 68 → 69 taken 2 times.
✗ Branch 68 → 70 not taken.
✓ Branch 71 → 72 taken 2 times.
✗ Branch 71 → 147 not taken.
✓ Branch 72 → 73 taken 2 times.
✗ Branch 72 → 147 not taken.
✓ Branch 73 → 74 taken 2 times.
✗ Branch 73 → 147 not taken.
✓ Branch 74 → 75 taken 2 times.
✗ Branch 74 → 147 not taken.
2 return {.value = builder.CreateMul(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
164 2 case COMB(TY_SHORT, TY_LONG): {
165
5/10
✓ Branch 76 → 77 taken 2 times.
✗ Branch 76 → 148 not taken.
✓ Branch 77 → 78 taken 2 times.
✗ Branch 77 → 148 not taken.
✓ Branch 78 → 79 taken 2 times.
✗ Branch 78 → 148 not taken.
✓ Branch 79 → 80 taken 2 times.
✗ Branch 79 → 148 not taken.
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 162 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
166
7/14
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 162 not taken.
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 85 not taken.
✓ Branch 82 → 83 taken 2 times.
✗ Branch 82 → 162 not taken.
✓ Branch 83 → 84 taken 2 times.
✗ Branch 83 → 85 not taken.
✓ Branch 86 → 87 taken 2 times.
✗ Branch 86 → 149 not taken.
✓ Branch 87 → 88 taken 2 times.
✗ Branch 87 → 149 not taken.
✓ Branch 88 → 89 taken 2 times.
✗ Branch 88 → 149 not taken.
2 return {.value = builder.CreateMul(lhsV(), rhsShort, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
167 }
168 4 case COMB(TY_LONG, TY_INT): // fallthrough
169 case COMB(TY_LONG, TY_SHORT): {
170
5/10
✓ Branch 90 → 91 taken 4 times.
✗ Branch 90 → 150 not taken.
✓ Branch 91 → 92 taken 4 times.
✗ Branch 91 → 150 not taken.
✓ Branch 92 → 93 taken 4 times.
✗ Branch 92 → 150 not taken.
✓ Branch 93 → 94 taken 4 times.
✗ Branch 93 → 150 not taken.
✓ Branch 94 → 95 taken 4 times.
✗ Branch 94 → 162 not taken.
4 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
171
7/14
✓ Branch 94 → 95 taken 4 times.
✗ Branch 94 → 162 not taken.
✓ Branch 95 → 96 taken 4 times.
✗ Branch 95 → 99 not taken.
✓ Branch 96 → 97 taken 4 times.
✗ Branch 96 → 162 not taken.
✓ Branch 97 → 98 taken 4 times.
✗ Branch 97 → 99 not taken.
✓ Branch 100 → 101 taken 4 times.
✗ Branch 100 → 151 not taken.
✓ Branch 101 → 102 taken 4 times.
✗ Branch 101 → 151 not taken.
✓ Branch 102 → 103 taken 4 times.
✗ Branch 102 → 151 not taken.
4 return {.value = builder.CreateMul(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
172 }
173 294 case COMB(TY_LONG, TY_LONG):
174
9/16
✓ Branch 104 → 105 taken 294 times.
✗ Branch 104 → 162 not taken.
✓ Branch 105 → 106 taken 4 times.
✓ Branch 105 → 109 taken 290 times.
✓ Branch 106 → 107 taken 4 times.
✗ Branch 106 → 162 not taken.
✓ Branch 107 → 108 taken 4 times.
✗ Branch 107 → 109 not taken.
✓ Branch 110 → 111 taken 294 times.
✗ Branch 110 → 152 not taken.
✓ Branch 111 → 112 taken 294 times.
✗ Branch 111 → 152 not taken.
✓ Branch 112 → 113 taken 294 times.
✗ Branch 112 → 152 not taken.
✓ Branch 113 → 114 taken 294 times.
✗ Branch 113 → 152 not taken.
294 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 4 times.
✗ Branch 11 → 135 not taken.
✓ Branch 12 → 13 taken 4 times.
✗ Branch 12 → 135 not taken.
✓ Branch 13 → 14 taken 4 times.
✗ Branch 13 → 135 not taken.
✓ Branch 14 → 15 taken 4 times.
✗ Branch 14 → 135 not taken.
✓ Branch 15 → 16 taken 4 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.
510 }
179
180 224 LLVMExprResult OpRuleConversionManager::getDivEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
181 LLVMExprResult &rhs, QualType rhsSTy) {
182
1/2
✓ Branch 2 → 3 taken 224 times.
✗ Branch 2 → 81 not taken.
324 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
183
1/2
✓ Branch 3 → 4 taken 224 times.
✗ Branch 3 → 82 not taken.
448 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
184 348 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
185 224 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
186
1/2
✓ Branch 6 → 7 taken 224 times.
✗ Branch 6 → 83 not taken.
224 lhsSTy = lhsSTy.removeReferenceWrapper();
187
1/2
✓ Branch 7 → 8 taken 224 times.
✗ Branch 7 → 84 not taken.
224 rhsSTy = rhsSTy.removeReferenceWrapper();
188
1/2
✓ Branch 8 → 9 taken 224 times.
✗ Branch 8 → 108 not taken.
224 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
189
190 // Handle operator overloads
191
3/4
✓ Branch 9 → 10 taken 224 times.
✗ Branch 9 → 108 not taken.
✓ Branch 10 → 11 taken 124 times.
✓ Branch 10 → 19 taken 100 times.
224 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
192 124 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, DEFAULT_OP_IDX);
193
194
9/11
✓ Branch 19 → 20 taken 100 times.
✗ Branch 19 → 108 not taken.
✓ Branch 20 → 21 taken 46 times.
✓ Branch 20 → 26 taken 22 times.
✓ Branch 20 → 30 taken 8 times.
✓ Branch 20 → 37 taken 2 times.
✓ Branch 20 → 44 taken 2 times.
✓ Branch 20 → 49 taken 2 times.
✓ Branch 20 → 56 taken 4 times.
✓ Branch 20 → 63 taken 14 times.
✗ Branch 20 → 67 not taken.
100 switch (getTypeCombination(lhsSTy, rhsSTy)) {
195 46 case COMB(TY_DOUBLE, TY_DOUBLE):
196
4/8
✓ Branch 21 → 22 taken 46 times.
✗ Branch 21 → 93 not taken.
✓ Branch 22 → 23 taken 46 times.
✗ Branch 22 → 93 not taken.
✓ Branch 23 → 24 taken 46 times.
✗ Branch 23 → 93 not taken.
✓ Branch 24 → 25 taken 46 times.
✗ Branch 24 → 93 not taken.
46 return {.value = builder.CreateFDiv(lhsV(), rhsV())};
197 22 case COMB(TY_INT, TY_INT):
198
3/6
✓ Branch 26 → 27 taken 22 times.
✗ Branch 26 → 108 not taken.
✓ Branch 27 → 28 taken 22 times.
✗ Branch 27 → 108 not taken.
✓ Branch 28 → 29 taken 22 times.
✗ Branch 28 → 108 not taken.
22 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsV())};
199 8 case COMB(TY_INT, TY_SHORT): // fallthrough
200 case COMB(TY_INT, TY_LONG): {
201
5/10
✓ Branch 30 → 31 taken 8 times.
✗ Branch 30 → 94 not taken.
✓ Branch 31 → 32 taken 8 times.
✗ Branch 31 → 94 not taken.
✓ Branch 32 → 33 taken 8 times.
✗ Branch 32 → 94 not taken.
✓ Branch 33 → 34 taken 8 times.
✗ Branch 33 → 94 not taken.
✓ Branch 34 → 35 taken 8 times.
✗ Branch 34 → 108 not taken.
8 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
202
2/4
✓ Branch 34 → 35 taken 8 times.
✗ Branch 34 → 108 not taken.
✓ Branch 35 → 36 taken 8 times.
✗ Branch 35 → 108 not taken.
8 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsInt)};
203 }
204 2 case COMB(TY_SHORT, TY_INT): {
205
5/10
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 95 not taken.
✓ Branch 38 → 39 taken 2 times.
✗ Branch 38 → 95 not taken.
✓ Branch 39 → 40 taken 2 times.
✗ Branch 39 → 95 not taken.
✓ Branch 40 → 41 taken 2 times.
✗ Branch 40 → 95 not taken.
✓ Branch 41 → 42 taken 2 times.
✗ Branch 41 → 108 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
206
2/4
✓ Branch 41 → 42 taken 2 times.
✗ Branch 41 → 108 not taken.
✓ Branch 42 → 43 taken 2 times.
✗ Branch 42 → 108 not taken.
2 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsShort)};
207 }
208 2 case COMB(TY_SHORT, TY_SHORT):
209
4/8
✓ Branch 44 → 45 taken 2 times.
✗ Branch 44 → 96 not taken.
✓ Branch 45 → 46 taken 2 times.
✗ Branch 45 → 96 not taken.
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 96 not taken.
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 96 not taken.
2 return {.value = builder.CreateSDiv(lhsV(), rhsV())};
210 2 case COMB(TY_SHORT, TY_LONG): {
211
5/10
✓ Branch 49 → 50 taken 2 times.
✗ Branch 49 → 97 not taken.
✓ Branch 50 → 51 taken 2 times.
✗ Branch 50 → 97 not taken.
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 97 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 97 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 108 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
212
2/4
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 108 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 108 not taken.
2 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsShort)};
213 }
214 4 case COMB(TY_LONG, TY_INT): // fallthrough
215 case COMB(TY_LONG, TY_SHORT): {
216
5/10
✓ Branch 56 → 57 taken 4 times.
✗ Branch 56 → 98 not taken.
✓ Branch 57 → 58 taken 4 times.
✗ Branch 57 → 98 not taken.
✓ Branch 58 → 59 taken 4 times.
✗ Branch 58 → 98 not taken.
✓ Branch 59 → 60 taken 4 times.
✗ Branch 59 → 98 not taken.
✓ Branch 60 → 61 taken 4 times.
✗ Branch 60 → 108 not taken.
4 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
217
2/4
✓ Branch 60 → 61 taken 4 times.
✗ Branch 60 → 108 not taken.
✓ Branch 61 → 62 taken 4 times.
✗ Branch 61 → 108 not taken.
4 return {.value = generateDiv(lhsSTy, rhsSTy, lhsV(), rhsLong)};
218 }
219 14 case COMB(TY_LONG, TY_LONG):
220
3/6
✓ Branch 63 → 64 taken 14 times.
✗ Branch 63 → 108 not taken.
✓ Branch 64 → 65 taken 14 times.
✗ Branch 64 → 108 not taken.
✓ Branch 65 → 66 taken 14 times.
✗ Branch 65 → 108 not taken.
14 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 124 times.
✗ Branch 11 → 87 not taken.
✓ Branch 12 → 13 taken 124 times.
✗ Branch 12 → 87 not taken.
✓ Branch 13 → 14 taken 124 times.
✗ Branch 13 → 87 not taken.
✓ Branch 14 → 15 taken 124 times.
✗ Branch 14 → 87 not taken.
✓ Branch 15 → 16 taken 124 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.
348 }
225
226 96 LLVMExprResult OpRuleConversionManager::getRemEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
227 LLVMExprResult &rhs, QualType rhsSTy) {
228
1/2
✓ Branch 2 → 3 taken 96 times.
✗ Branch 2 → 72 not taken.
192 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
229
1/2
✓ Branch 3 → 4 taken 96 times.
✗ Branch 3 → 73 not taken.
192 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
230
1/2
✓ Branch 4 → 5 taken 96 times.
✗ Branch 4 → 74 not taken.
96 lhsSTy = lhsSTy.removeReferenceWrapper();
231
1/2
✓ Branch 5 → 6 taken 96 times.
✗ Branch 5 → 75 not taken.
96 rhsSTy = rhsSTy.removeReferenceWrapper();
232
1/2
✓ Branch 6 → 7 taken 96 times.
✗ Branch 6 → 93 not taken.
96 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
233
234
9/11
✓ Branch 7 → 8 taken 96 times.
✗ Branch 7 → 93 not taken.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 17 taken 4 times.
✓ Branch 8 → 22 taken 4 times.
✓ Branch 8 → 30 taken 2 times.
✓ Branch 8 → 37 taken 2 times.
✓ Branch 8 → 42 taken 2 times.
✓ Branch 8 → 49 taken 4 times.
✓ Branch 8 → 56 taken 76 times.
✗ Branch 8 → 60 not taken.
96 switch (getTypeCombination(lhsSTy, rhsSTy)) {
235 2 case COMB(TY_DOUBLE, TY_DOUBLE): {
236 // LLVM generates a call to fmod on Linux systems
237
1/2
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 12 not taken.
2 if (irGenerator->cliOptions.targetTriple.isOSLinux())
238
1/2
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 93 not taken.
2 irGenerator->resourceManager.linker.requestLibMathLinkage();
239
4/8
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 76 not taken.
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 76 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 76 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 76 not taken.
2 return {.value = builder.CreateFRem(lhsV(), rhsV())};
240 }
241 4 case COMB(TY_INT, TY_INT):
242
4/8
✓ Branch 17 → 18 taken 4 times.
✗ Branch 17 → 77 not taken.
✓ Branch 18 → 19 taken 4 times.
✗ Branch 18 → 77 not taken.
✓ Branch 19 → 20 taken 4 times.
✗ Branch 19 → 77 not taken.
✓ Branch 20 → 21 taken 4 times.
✗ Branch 20 → 77 not taken.
4 return {.value = builder.CreateSRem(lhsV(), rhsV())};
243 4 case COMB(TY_INT, TY_SHORT): // fallthrough
244 case COMB(TY_INT, TY_LONG): {
245
5/10
✓ Branch 22 → 23 taken 4 times.
✗ Branch 22 → 78 not taken.
✓ Branch 23 → 24 taken 4 times.
✗ Branch 23 → 78 not taken.
✓ Branch 24 → 25 taken 4 times.
✗ Branch 24 → 78 not taken.
✓ Branch 25 → 26 taken 4 times.
✗ Branch 25 → 78 not taken.
✓ Branch 26 → 27 taken 4 times.
✗ Branch 26 → 79 not taken.
4 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
246
3/6
✓ Branch 26 → 27 taken 4 times.
✗ Branch 26 → 79 not taken.
✓ Branch 27 → 28 taken 4 times.
✗ Branch 27 → 79 not taken.
✓ Branch 28 → 29 taken 4 times.
✗ Branch 28 → 79 not taken.
4 return {.value = builder.CreateSRem(lhsV(), rhsInt)};
247 }
248 2 case COMB(TY_SHORT, TY_INT): {
249
5/10
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 80 not taken.
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 80 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 80 not taken.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 80 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 93 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
250
2/4
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 93 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 93 not taken.
2 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsShort)};
251 }
252 2 case COMB(TY_SHORT, TY_SHORT):
253
4/8
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 81 not taken.
✓ Branch 38 → 39 taken 2 times.
✗ Branch 38 → 81 not taken.
✓ Branch 39 → 40 taken 2 times.
✗ Branch 39 → 81 not taken.
✓ Branch 40 → 41 taken 2 times.
✗ Branch 40 → 81 not taken.
2 return {.value = builder.CreateSRem(lhsV(), rhsV())};
254 2 case COMB(TY_SHORT, TY_LONG): {
255
5/10
✓ Branch 42 → 43 taken 2 times.
✗ Branch 42 → 82 not taken.
✓ Branch 43 → 44 taken 2 times.
✗ Branch 43 → 82 not taken.
✓ Branch 44 → 45 taken 2 times.
✗ Branch 44 → 82 not taken.
✓ Branch 45 → 46 taken 2 times.
✗ Branch 45 → 82 not taken.
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 93 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
256
2/4
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 93 not taken.
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 93 not taken.
2 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsShort)};
257 }
258 4 case COMB(TY_LONG, TY_INT): // fallthrough
259 case COMB(TY_LONG, TY_SHORT): {
260
5/10
✓ Branch 49 → 50 taken 4 times.
✗ Branch 49 → 83 not taken.
✓ Branch 50 → 51 taken 4 times.
✗ Branch 50 → 83 not taken.
✓ Branch 51 → 52 taken 4 times.
✗ Branch 51 → 83 not taken.
✓ Branch 52 → 53 taken 4 times.
✗ Branch 52 → 83 not taken.
✓ Branch 53 → 54 taken 4 times.
✗ Branch 53 → 93 not taken.
4 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
261
2/4
✓ Branch 53 → 54 taken 4 times.
✗ Branch 53 → 93 not taken.
✓ Branch 54 → 55 taken 4 times.
✗ Branch 54 → 93 not taken.
4 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsLong)};
262 }
263 76 case COMB(TY_LONG, TY_LONG): // fallthrough
264 case COMB(TY_BYTE, TY_BYTE):
265
3/6
✓ Branch 56 → 57 taken 76 times.
✗ Branch 56 → 93 not taken.
✓ Branch 57 → 58 taken 76 times.
✗ Branch 57 → 93 not taken.
✓ Branch 58 → 59 taken 76 times.
✗ Branch 58 → 93 not taken.
76 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsV())};
266 default: // GCOV_EXCL_LINE
267 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: %="); // GCOV_EXCL_LINE
268 }
269 96 }
270
271 22 LLVMExprResult OpRuleConversionManager::getSHLEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
272 LLVMExprResult &rhs, QualType rhsSTy) {
273
1/2
✓ Branch 2 → 3 taken 22 times.
✗ Branch 2 → 52 not taken.
44 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
274
1/2
✓ Branch 3 → 4 taken 22 times.
✗ Branch 3 → 53 not taken.
44 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
275
1/2
✓ Branch 4 → 5 taken 22 times.
✗ Branch 4 → 54 not taken.
22 lhsSTy = lhsSTy.removeReferenceWrapper();
276
1/2
✓ Branch 5 → 6 taken 22 times.
✗ Branch 5 → 55 not taken.
22 rhsSTy = rhsSTy.removeReferenceWrapper();
277
1/2
✓ Branch 6 → 7 taken 22 times.
✗ Branch 6 → 72 not taken.
22 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
278
279
6/8
✓ Branch 7 → 8 taken 22 times.
✗ Branch 7 → 72 not taken.
✓ Branch 8 → 9 taken 4 times.
✓ Branch 8 → 14 taken 6 times.
✓ Branch 8 → 22 taken 2 times.
✓ Branch 8 → 27 taken 6 times.
✓ Branch 8 → 35 taken 4 times.
✗ Branch 8 → 40 not taken.
22 switch (getTypeCombination(lhsSTy, rhsSTy)) {
280 4 case COMB(TY_INT, TY_INT):
281
4/8
✓ Branch 9 → 10 taken 4 times.
✗ Branch 9 → 56 not taken.
✓ Branch 10 → 11 taken 4 times.
✗ Branch 10 → 56 not taken.
✓ Branch 11 → 12 taken 4 times.
✗ Branch 11 → 56 not taken.
✓ Branch 12 → 13 taken 4 times.
✗ Branch 12 → 56 not taken.
4 return {.value = builder.CreateShl(lhsV(), rhsV())};
282 6 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 6 times.
✗ Branch 14 → 57 not taken.
✓ Branch 15 → 16 taken 6 times.
✗ Branch 15 → 57 not taken.
✓ Branch 16 → 17 taken 6 times.
✗ Branch 16 → 57 not taken.
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 57 not taken.
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 58 not taken.
6 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
286
3/6
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 58 not taken.
✓ Branch 19 → 20 taken 6 times.
✗ Branch 19 → 58 not taken.
✓ Branch 20 → 21 taken 6 times.
✗ Branch 20 → 58 not taken.
6 return {.value = builder.CreateShl(lhsV(), rhsInt)};
287 }
288 2 case COMB(TY_SHORT, TY_SHORT):
289
4/8
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 59 not taken.
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 59 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 59 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 59 not taken.
2 return {.value = builder.CreateShl(lhsV(), rhsV())};
290 6 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 6 times.
✗ Branch 27 → 60 not taken.
✓ Branch 28 → 29 taken 6 times.
✗ Branch 28 → 60 not taken.
✓ Branch 29 → 30 taken 6 times.
✗ Branch 29 → 60 not taken.
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 60 not taken.
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 61 not taken.
6 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
294
3/6
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 61 not taken.
✓ Branch 32 → 33 taken 6 times.
✗ Branch 32 → 61 not taken.
✓ Branch 33 → 34 taken 6 times.
✗ Branch 33 → 61 not taken.
6 return {.value = builder.CreateShl(lhsV(), rhsLong)};
295 }
296 4 case COMB(TY_LONG, TY_LONG): // fallthrough
297 case COMB(TY_BYTE, TY_BYTE):
298
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.CreateShl(lhsV(), rhsV())};
299 default: // GCOV_EXCL_LINE
300 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: <<="); // GCOV_EXCL_LINE
301 }
302 22 }
303
304 34 LLVMExprResult OpRuleConversionManager::getSHREqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
305 LLVMExprResult &rhs, QualType rhsSTy) {
306
1/2
✓ Branch 2 → 3 taken 34 times.
✗ Branch 2 → 48 not taken.
68 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
307
1/2
✓ Branch 3 → 4 taken 34 times.
✗ Branch 3 → 49 not taken.
68 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
308
1/2
✓ Branch 4 → 5 taken 34 times.
✗ Branch 4 → 50 not taken.
34 lhsSTy = lhsSTy.removeReferenceWrapper();
309
1/2
✓ Branch 5 → 6 taken 34 times.
✗ Branch 5 → 51 not taken.
34 rhsSTy = rhsSTy.removeReferenceWrapper();
310
1/2
✓ Branch 6 → 7 taken 34 times.
✗ Branch 6 → 64 not taken.
34 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
311
312
6/8
✓ Branch 7 → 8 taken 34 times.
✗ Branch 7 → 64 not taken.
✓ Branch 8 → 9 taken 12 times.
✓ Branch 8 → 13 taken 6 times.
✓ Branch 8 → 20 taken 2 times.
✓ Branch 8 → 25 taken 10 times.
✓ Branch 8 → 32 taken 4 times.
✗ Branch 8 → 36 not taken.
34 switch (getTypeCombination(lhsSTy, rhsSTy)) {
313 12 case COMB(TY_INT, TY_INT):
314
3/6
✓ Branch 9 → 10 taken 12 times.
✗ Branch 9 → 64 not taken.
✓ Branch 10 → 11 taken 12 times.
✗ Branch 10 → 64 not taken.
✓ Branch 11 → 12 taken 12 times.
✗ Branch 11 → 64 not taken.
12 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
315 6 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 6 times.
✗ Branch 13 → 52 not taken.
✓ Branch 14 → 15 taken 6 times.
✗ Branch 14 → 52 not taken.
✓ Branch 15 → 16 taken 6 times.
✗ Branch 15 → 52 not taken.
✓ Branch 16 → 17 taken 6 times.
✗ Branch 16 → 52 not taken.
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 64 not taken.
6 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
319
2/4
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 64 not taken.
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 64 not taken.
6 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsInt)};
320 }
321 2 case COMB(TY_SHORT, TY_SHORT):
322
4/8
✓ Branch 20 → 21 taken 2 times.
✗ Branch 20 → 53 not taken.
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 53 not taken.
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 53 not taken.
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 53 not taken.
2 return {.value = builder.CreateLShr(lhsV(), rhsV())};
323 10 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 10 times.
✗ Branch 25 → 54 not taken.
✓ Branch 26 → 27 taken 10 times.
✗ Branch 26 → 54 not taken.
✓ Branch 27 → 28 taken 10 times.
✗ Branch 27 → 54 not taken.
✓ Branch 28 → 29 taken 10 times.
✗ Branch 28 → 54 not taken.
✓ Branch 29 → 30 taken 10 times.
✗ Branch 29 → 64 not taken.
10 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
327
2/4
✓ Branch 29 → 30 taken 10 times.
✗ Branch 29 → 64 not taken.
✓ Branch 30 → 31 taken 10 times.
✗ Branch 30 → 64 not taken.
10 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsLong)};
328 }
329 4 case COMB(TY_LONG, TY_LONG): // fallthrough
330 case COMB(TY_BYTE, TY_BYTE):
331
3/6
✓ Branch 32 → 33 taken 4 times.
✗ Branch 32 → 64 not taken.
✓ Branch 33 → 34 taken 4 times.
✗ Branch 33 → 64 not taken.
✓ Branch 34 → 35 taken 4 times.
✗ Branch 34 → 64 not taken.
4 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
332 default: // GCOV_EXCL_LINE
333 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: >>="); // GCOV_EXCL_LINE
334 }
335 34 }
336
337 56 LLVMExprResult OpRuleConversionManager::getAndEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
338 LLVMExprResult &rhs, QualType rhsSTy) {
339
1/2
✓ Branch 2 → 3 taken 56 times.
✗ Branch 2 → 52 not taken.
112 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
340
1/2
✓ Branch 3 → 4 taken 56 times.
✗ Branch 3 → 53 not taken.
112 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
341
1/2
✓ Branch 4 → 5 taken 56 times.
✗ Branch 4 → 54 not taken.
56 lhsSTy = lhsSTy.removeReferenceWrapper();
342
1/2
✓ Branch 5 → 6 taken 56 times.
✗ Branch 5 → 55 not taken.
56 rhsSTy = rhsSTy.removeReferenceWrapper();
343
1/2
✓ Branch 6 → 7 taken 56 times.
✗ Branch 6 → 72 not taken.
56 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
344
345
6/8
✓ Branch 7 → 8 taken 56 times.
✗ Branch 7 → 72 not taken.
✓ Branch 8 → 9 taken 12 times.
✓ Branch 8 → 14 taken 6 times.
✓ Branch 8 → 22 taken 2 times.
✓ Branch 8 → 27 taken 6 times.
✓ Branch 8 → 35 taken 30 times.
✗ Branch 8 → 40 not taken.
56 switch (getTypeCombination(lhsSTy, rhsSTy)) {
346 12 case COMB(TY_INT, TY_INT):
347
4/8
✓ Branch 9 → 10 taken 12 times.
✗ Branch 9 → 56 not taken.
✓ Branch 10 → 11 taken 12 times.
✗ Branch 10 → 56 not taken.
✓ Branch 11 → 12 taken 12 times.
✗ Branch 11 → 56 not taken.
✓ Branch 12 → 13 taken 12 times.
✗ Branch 12 → 56 not taken.
12 return {.value = builder.CreateAnd(lhsV(), rhsV())};
348 6 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 6 times.
✗ Branch 14 → 57 not taken.
✓ Branch 15 → 16 taken 6 times.
✗ Branch 15 → 57 not taken.
✓ Branch 16 → 17 taken 6 times.
✗ Branch 16 → 57 not taken.
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 57 not taken.
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 58 not taken.
6 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
352
3/6
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 58 not taken.
✓ Branch 19 → 20 taken 6 times.
✗ Branch 19 → 58 not taken.
✓ Branch 20 → 21 taken 6 times.
✗ Branch 20 → 58 not taken.
6 return {.value = builder.CreateAnd(lhsV(), rhsInt)};
353 }
354 2 case COMB(TY_SHORT, TY_SHORT):
355
4/8
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 59 not taken.
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 59 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 59 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 59 not taken.
2 return {.value = builder.CreateAnd(lhsV(), rhsV())};
356 6 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 6 times.
✗ Branch 27 → 60 not taken.
✓ Branch 28 → 29 taken 6 times.
✗ Branch 28 → 60 not taken.
✓ Branch 29 → 30 taken 6 times.
✗ Branch 29 → 60 not taken.
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 60 not taken.
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 61 not taken.
6 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
360
3/6
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 61 not taken.
✓ Branch 32 → 33 taken 6 times.
✗ Branch 32 → 61 not taken.
✓ Branch 33 → 34 taken 6 times.
✗ Branch 33 → 61 not taken.
6 return {.value = builder.CreateAnd(lhsV(), rhsLong)};
361 }
362 30 case COMB(TY_LONG, TY_LONG): // fallthrough
363 case COMB(TY_BYTE, TY_BYTE):
364
4/8
✓ Branch 35 → 36 taken 30 times.
✗ Branch 35 → 62 not taken.
✓ Branch 36 → 37 taken 30 times.
✗ Branch 36 → 62 not taken.
✓ Branch 37 → 38 taken 30 times.
✗ Branch 37 → 62 not taken.
✓ Branch 38 → 39 taken 30 times.
✗ Branch 38 → 62 not taken.
30 return {.value = builder.CreateAnd(lhsV(), rhsV())};
365 default: // GCOV_EXCL_LINE
366 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: &="); // GCOV_EXCL_LINE
367 }
368 56 }
369
370 56 LLVMExprResult OpRuleConversionManager::getOrEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
371 LLVMExprResult &rhs, QualType rhsSTy) {
372
1/2
✓ Branch 2 → 3 taken 56 times.
✗ Branch 2 → 52 not taken.
112 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
373
1/2
✓ Branch 3 → 4 taken 56 times.
✗ Branch 3 → 53 not taken.
112 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
374
1/2
✓ Branch 4 → 5 taken 56 times.
✗ Branch 4 → 54 not taken.
56 lhsSTy = lhsSTy.removeReferenceWrapper();
375
1/2
✓ Branch 5 → 6 taken 56 times.
✗ Branch 5 → 55 not taken.
56 rhsSTy = rhsSTy.removeReferenceWrapper();
376
1/2
✓ Branch 6 → 7 taken 56 times.
✗ Branch 6 → 72 not taken.
56 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
377
378
6/8
✓ Branch 7 → 8 taken 56 times.
✗ Branch 7 → 72 not taken.
✓ Branch 8 → 9 taken 26 times.
✓ Branch 8 → 14 taken 6 times.
✓ Branch 8 → 22 taken 2 times.
✓ Branch 8 → 27 taken 6 times.
✓ Branch 8 → 35 taken 16 times.
✗ Branch 8 → 40 not taken.
56 switch (getTypeCombination(lhsSTy, rhsSTy)) {
379 26 case COMB(TY_INT, TY_INT):
380
4/8
✓ Branch 9 → 10 taken 26 times.
✗ Branch 9 → 56 not taken.
✓ Branch 10 → 11 taken 26 times.
✗ Branch 10 → 56 not taken.
✓ Branch 11 → 12 taken 26 times.
✗ Branch 11 → 56 not taken.
✓ Branch 12 → 13 taken 26 times.
✗ Branch 12 → 56 not taken.
26 return {.value = builder.CreateOr(lhsV(), rhsV())};
381 6 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 6 times.
✗ Branch 14 → 57 not taken.
✓ Branch 15 → 16 taken 6 times.
✗ Branch 15 → 57 not taken.
✓ Branch 16 → 17 taken 6 times.
✗ Branch 16 → 57 not taken.
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 57 not taken.
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 58 not taken.
6 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
385
3/6
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 58 not taken.
✓ Branch 19 → 20 taken 6 times.
✗ Branch 19 → 58 not taken.
✓ Branch 20 → 21 taken 6 times.
✗ Branch 20 → 58 not taken.
6 return {.value = builder.CreateOr(lhsV(), rhsInt)};
386 }
387 2 case COMB(TY_SHORT, TY_SHORT):
388
4/8
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 59 not taken.
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 59 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 59 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 59 not taken.
2 return {.value = builder.CreateOr(lhsV(), rhsV())};
389 6 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 6 times.
✗ Branch 27 → 60 not taken.
✓ Branch 28 → 29 taken 6 times.
✗ Branch 28 → 60 not taken.
✓ Branch 29 → 30 taken 6 times.
✗ Branch 29 → 60 not taken.
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 60 not taken.
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 61 not taken.
6 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
393
3/6
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 61 not taken.
✓ Branch 32 → 33 taken 6 times.
✗ Branch 32 → 61 not taken.
✓ Branch 33 → 34 taken 6 times.
✗ Branch 33 → 61 not taken.
6 return {.value = builder.CreateOr(lhsV(), rhsLong)};
394 }
395 16 case COMB(TY_LONG, TY_LONG): // fallthrough
396 case COMB(TY_BYTE, TY_BYTE):
397
4/8
✓ Branch 35 → 36 taken 16 times.
✗ Branch 35 → 62 not taken.
✓ Branch 36 → 37 taken 16 times.
✗ Branch 36 → 62 not taken.
✓ Branch 37 → 38 taken 16 times.
✗ Branch 37 → 62 not taken.
✓ Branch 38 → 39 taken 16 times.
✗ Branch 38 → 62 not taken.
16 return {.value = builder.CreateOr(lhsV(), rhsV())};
398 default: // GCOV_EXCL_LINE
399 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: |="); // GCOV_EXCL_LINE
400 }
401 56 }
402
403 683 LLVMExprResult OpRuleConversionManager::getXorEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
404 LLVMExprResult &rhs, QualType rhsSTy) {
405
1/2
✓ Branch 2 → 3 taken 683 times.
✗ Branch 2 → 52 not taken.
1366 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
406
1/2
✓ Branch 3 → 4 taken 683 times.
✗ Branch 3 → 53 not taken.
1366 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
407
1/2
✓ Branch 4 → 5 taken 683 times.
✗ Branch 4 → 54 not taken.
683 lhsSTy = lhsSTy.removeReferenceWrapper();
408
1/2
✓ Branch 5 → 6 taken 683 times.
✗ Branch 5 → 55 not taken.
683 rhsSTy = rhsSTy.removeReferenceWrapper();
409
1/2
✓ Branch 6 → 7 taken 683 times.
✗ Branch 6 → 72 not taken.
683 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
410
411
6/8
✓ Branch 7 → 8 taken 683 times.
✗ Branch 7 → 72 not taken.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 14 taken 6 times.
✓ Branch 8 → 22 taken 2 times.
✓ Branch 8 → 27 taken 6 times.
✓ Branch 8 → 35 taken 667 times.
✗ Branch 8 → 40 not taken.
683 switch (getTypeCombination(lhsSTy, rhsSTy)) {
412 2 case COMB(TY_INT, TY_INT):
413
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.CreateXor(lhsV(), rhsV())};
414 6 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 6 times.
✗ Branch 14 → 57 not taken.
✓ Branch 15 → 16 taken 6 times.
✗ Branch 15 → 57 not taken.
✓ Branch 16 → 17 taken 6 times.
✗ Branch 16 → 57 not taken.
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 57 not taken.
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 58 not taken.
6 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
418
3/6
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 58 not taken.
✓ Branch 19 → 20 taken 6 times.
✗ Branch 19 → 58 not taken.
✓ Branch 20 → 21 taken 6 times.
✗ Branch 20 → 58 not taken.
6 return {.value = builder.CreateXor(lhsV(), rhsInt)};
419 }
420 2 case COMB(TY_SHORT, TY_SHORT):
421
4/8
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 59 not taken.
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 59 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 59 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 59 not taken.
2 return {.value = builder.CreateXor(lhsV(), rhsV())};
422 6 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 6 times.
✗ Branch 27 → 60 not taken.
✓ Branch 28 → 29 taken 6 times.
✗ Branch 28 → 60 not taken.
✓ Branch 29 → 30 taken 6 times.
✗ Branch 29 → 60 not taken.
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 60 not taken.
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 61 not taken.
6 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
426
3/6
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 61 not taken.
✓ Branch 32 → 33 taken 6 times.
✗ Branch 32 → 61 not taken.
✓ Branch 33 → 34 taken 6 times.
✗ Branch 33 → 61 not taken.
6 return {.value = builder.CreateXor(lhsV(), rhsLong)};
427 }
428 667 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 667 times.
✗ Branch 35 → 62 not taken.
✓ Branch 36 → 37 taken 667 times.
✗ Branch 36 → 62 not taken.
✓ Branch 37 → 38 taken 667 times.
✗ Branch 37 → 62 not taken.
✓ Branch 38 → 39 taken 667 times.
✗ Branch 38 → 62 not taken.
667 return {.value = builder.CreateXor(lhsV(), rhsV())};
432 default: // GCOV_EXCL_LINE
433 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: ^="); // GCOV_EXCL_LINE
434 }
435 683 }
436
437 780 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 780 times.
✗ Branch 2 → 39 not taken.
1556 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
440
1/2
✓ Branch 3 → 4 taken 780 times.
✗ Branch 3 → 40 not taken.
1556 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
441 784 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
442 784 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
443
1/2
✓ Branch 6 → 7 taken 780 times.
✗ Branch 6 → 41 not taken.
780 lhsSTy = lhsSTy.removeReferenceWrapper();
444
1/2
✓ Branch 7 → 8 taken 780 times.
✗ Branch 7 → 42 not taken.
780 rhsSTy = rhsSTy.removeReferenceWrapper();
445
446 // Handle operator overloads
447
3/4
✓ Branch 8 → 9 taken 780 times.
✗ Branch 8 → 61 not taken.
✓ Branch 9 → 10 taken 8 times.
✓ Branch 9 → 18 taken 772 times.
780 if (callsOverloadedOpFct(node, opIdx))
448 8 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
449
450
2/4
✓ Branch 18 → 19 taken 772 times.
✗ Branch 18 → 61 not taken.
✓ Branch 19 → 20 taken 772 times.
✗ Branch 19 → 25 not taken.
772 switch (getTypeCombination(lhsSTy, rhsSTy)) {
451 772 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 772 times.
✗ Branch 20 → 51 not taken.
✓ Branch 21 → 22 taken 772 times.
✗ Branch 21 → 51 not taken.
✓ Branch 22 → 23 taken 772 times.
✗ Branch 22 → 51 not taken.
✓ Branch 23 → 24 taken 772 times.
✗ Branch 23 → 51 not taken.
772 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 8 times.
✗ Branch 10 → 45 not taken.
✓ Branch 11 → 12 taken 8 times.
✗ Branch 11 → 45 not taken.
✓ Branch 12 → 13 taken 8 times.
✗ Branch 12 → 45 not taken.
✓ Branch 13 → 14 taken 8 times.
✗ Branch 13 → 45 not taken.
✓ Branch 14 → 15 taken 8 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.
788 }
461
462 147 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 147 times.
✗ Branch 2 → 39 not taken.
290 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
465
1/2
✓ Branch 3 → 4 taken 147 times.
✗ Branch 3 → 40 not taken.
290 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
466 151 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
467 151 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
468
1/2
✓ Branch 6 → 7 taken 147 times.
✗ Branch 6 → 41 not taken.
147 lhsSTy = lhsSTy.removeReferenceWrapper();
469
1/2
✓ Branch 7 → 8 taken 147 times.
✗ Branch 7 → 42 not taken.
147 rhsSTy = rhsSTy.removeReferenceWrapper();
470
471 // Handle operator overloads
472
3/4
✓ Branch 8 → 9 taken 147 times.
✗ Branch 8 → 61 not taken.
✓ Branch 9 → 10 taken 6 times.
✓ Branch 9 → 18 taken 141 times.
147 if (callsOverloadedOpFct(node, opIdx))
473 6 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
474
475
2/4
✓ Branch 18 → 19 taken 141 times.
✗ Branch 18 → 61 not taken.
✓ Branch 19 → 20 taken 141 times.
✗ Branch 19 → 25 not taken.
141 switch (getTypeCombination(lhsSTy, rhsSTy)) {
476 141 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 141 times.
✗ Branch 20 → 51 not taken.
✓ Branch 21 → 22 taken 141 times.
✗ Branch 21 → 51 not taken.
✓ Branch 22 → 23 taken 141 times.
✗ Branch 22 → 51 not taken.
✓ Branch 23 → 24 taken 141 times.
✗ Branch 23 → 51 not taken.
141 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 6 times.
✗ Branch 10 → 45 not taken.
✓ Branch 11 → 12 taken 6 times.
✗ Branch 11 → 45 not taken.
✓ Branch 12 → 13 taken 6 times.
✗ Branch 12 → 45 not taken.
✓ Branch 13 → 14 taken 6 times.
✗ Branch 13 → 45 not taken.
✓ Branch 14 → 15 taken 6 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.
153 }
486
487 670 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 670 times.
✗ Branch 2 → 39 not taken.
1336 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
490
1/2
✓ Branch 3 → 4 taken 670 times.
✗ Branch 3 → 40 not taken.
1336 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
491 674 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
492 674 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
493
1/2
✓ Branch 6 → 7 taken 670 times.
✗ Branch 6 → 41 not taken.
670 lhsSTy = lhsSTy.removeReferenceWrapper();
494
1/2
✓ Branch 7 → 8 taken 670 times.
✗ Branch 7 → 42 not taken.
670 rhsSTy = rhsSTy.removeReferenceWrapper();
495
496 // Handle operator overloads
497
3/4
✓ Branch 8 → 9 taken 670 times.
✗ Branch 8 → 61 not taken.
✓ Branch 9 → 10 taken 8 times.
✓ Branch 9 → 18 taken 662 times.
670 if (callsOverloadedOpFct(node, opIdx))
498 8 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
499
500
2/4
✓ Branch 18 → 19 taken 662 times.
✗ Branch 18 → 61 not taken.
✓ Branch 19 → 20 taken 662 times.
✗ Branch 19 → 25 not taken.
662 switch (getTypeCombination(lhsSTy, rhsSTy)) {
501 662 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 662 times.
✗ Branch 20 → 51 not taken.
✓ Branch 21 → 22 taken 662 times.
✗ Branch 21 → 51 not taken.
✓ Branch 22 → 23 taken 662 times.
✗ Branch 22 → 51 not taken.
✓ Branch 23 → 24 taken 662 times.
✗ Branch 23 → 51 not taken.
662 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 8 times.
✗ Branch 10 → 45 not taken.
✓ Branch 11 → 12 taken 8 times.
✗ Branch 11 → 45 not taken.
✓ Branch 12 → 13 taken 8 times.
✗ Branch 12 → 45 not taken.
✓ Branch 13 → 14 taken 8 times.
✗ Branch 13 → 45 not taken.
✓ Branch 14 → 15 taken 8 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.
678 }
511
512 39147 LLVMExprResult OpRuleConversionManager::getEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
513 LLVMExprResult &rhs, QualType rhsSTy) {
514
1/2
✓ Branch 2 → 3 taken 39147 times.
✗ Branch 2 → 223 not taken.
74920 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
515
1/2
✓ Branch 3 → 4 taken 39147 times.
✗ Branch 3 → 224 not taken.
75973 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
516 42521 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
517 41468 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
518
1/2
✓ Branch 6 → 7 taken 39147 times.
✗ Branch 6 → 225 not taken.
39147 lhsSTy = lhsSTy.removeReferenceWrapper();
519
1/2
✓ Branch 7 → 8 taken 39147 times.
✗ Branch 7 → 226 not taken.
39147 rhsSTy = rhsSTy.removeReferenceWrapper();
520
1/2
✓ Branch 8 → 9 taken 39147 times.
✗ Branch 8 → 289 not taken.
39147 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
521
1/2
✓ Branch 9 → 10 taken 39147 times.
✗ Branch 9 → 289 not taken.
39147 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
522
523 // Handle operator overloads
524
3/4
✓ Branch 10 → 11 taken 39147 times.
✗ Branch 10 → 289 not taken.
✓ Branch 11 → 12 taken 3244 times.
✓ Branch 11 → 20 taken 35903 times.
39147 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
525 3244 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 7720 times.
✓ Branch 21 → 25 taken 28183 times.
✓ Branch 22 → 23 taken 7720 times.
✗ Branch 22 → 289 not taken.
✓ Branch 23 → 24 taken 2 times.
✓ Branch 23 → 25 taken 7718 times.
✓ Branch 26 → 27 taken 2 times.
✓ Branch 26 → 34 taken 35901 times.
35903 if (lhsT->isPointerTy() && rhsT->isIntegerTy(64)) {
529
4/8
✓ Branch 27 → 28 taken 2 times.
✗ Branch 27 → 235 not taken.
✓ Branch 28 → 29 taken 2 times.
✗ Branch 28 → 235 not taken.
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 235 not taken.
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 236 not taken.
2 llvm::Value *lhsInt = builder.CreatePtrToInt(lhsV(), rhsT);
530
3/6
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 236 not taken.
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 236 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 236 not taken.
2 return {.value = builder.CreateICmpEQ(lhsInt, rhsV())};
531 }
532
533 // Check if one value is a string and the other one is a char*
534
13/18
✓ Branch 34 → 35 taken 35901 times.
✗ Branch 34 → 289 not taken.
✓ Branch 35 → 36 taken 781 times.
✓ Branch 35 → 38 taken 35120 times.
✓ Branch 36 → 37 taken 781 times.
✗ Branch 36 → 289 not taken.
✓ Branch 37 → 38 taken 781 times.
✗ Branch 37 → 42 not taken.
✓ Branch 38 → 39 taken 35901 times.
✗ Branch 38 → 289 not taken.
✓ Branch 39 → 40 taken 3946 times.
✓ Branch 39 → 43 taken 31955 times.
✓ Branch 40 → 41 taken 3946 times.
✗ Branch 40 → 289 not taken.
✓ Branch 41 → 42 taken 2 times.
✓ Branch 41 → 43 taken 3944 times.
✓ Branch 44 → 45 taken 2 times.
✓ Branch 44 → 53 taken 35899 times.
35901 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
1/2
✓ Branch 45 → 46 taken 2 times.
✗ Branch 45 → 289 not taken.
2 llvm::Function *opFct = stdFunctionManager.getStringIsRawEqualStringStringFct();
537
5/10
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 240 not taken.
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 238 not taken.
✓ Branch 48 → 49 taken 2 times.
✗ Branch 48 → 238 not taken.
✓ Branch 50 → 51 taken 2 times.
✗ Branch 50 → 237 not taken.
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 237 not taken.
2 llvm::Value *result = builder.CreateCall(opFct, {lhsV(), rhsV()});
538 2 return {.value = result};
539 }
540
541 // Check for primitive type combinations
542
23/25
✓ Branch 53 → 54 taken 35899 times.
✗ Branch 53 → 289 not taken.
✓ Branch 54 → 55 taken 315 times.
✓ Branch 54 → 60 taken 6 times.
✓ Branch 54 → 66 taken 42 times.
✓ Branch 54 → 72 taken 5495 times.
✓ Branch 54 → 77 taken 2 times.
✓ Branch 54 → 85 taken 2 times.
✓ Branch 54 → 93 taken 2 times.
✓ Branch 54 → 101 taken 2 times.
✓ Branch 54 → 107 taken 24 times.
✓ Branch 54 → 115 taken 228 times.
✓ Branch 54 → 120 taken 2 times.
✓ Branch 54 → 128 taken 2 times.
✓ Branch 54 → 136 taken 2 times.
✓ Branch 54 → 142 taken 1012 times.
✓ Branch 54 → 150 taken 13823 times.
✓ Branch 54 → 155 taken 2 times.
✓ Branch 54 → 163 taken 178 times.
✓ Branch 54 → 168 taken 70 times.
✓ Branch 54 → 176 taken 6486 times.
✓ Branch 54 → 181 taken 781 times.
✓ Branch 54 → 189 taken 488 times.
✓ Branch 54 → 204 taken 6935 times.
✗ Branch 54 → 209 not taken.
35899 switch (getTypeCombination(lhsSTy, rhsSTy)) {
543 315 case COMB(TY_DOUBLE, TY_DOUBLE):
544
4/8
✓ Branch 55 → 56 taken 315 times.
✗ Branch 55 → 241 not taken.
✓ Branch 56 → 57 taken 315 times.
✗ Branch 56 → 241 not taken.
✓ Branch 57 → 58 taken 315 times.
✗ Branch 57 → 241 not taken.
✓ Branch 58 → 59 taken 315 times.
✗ Branch 58 → 241 not taken.
315 return {.value = builder.CreateFCmpOEQ(lhsV(), rhsV())};
545 6 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 6 times.
✗ Branch 60 → 289 not taken.
✓ Branch 61 → 62 taken 6 times.
✗ Branch 61 → 289 not taken.
6 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
549
3/6
✓ Branch 62 → 63 taken 6 times.
✗ Branch 62 → 242 not taken.
✓ Branch 63 → 64 taken 6 times.
✗ Branch 63 → 242 not taken.
✓ Branch 64 → 65 taken 6 times.
✗ Branch 64 → 242 not taken.
6 return {.value = builder.CreateFCmpOEQ(lhsV(), rhsFP)};
550 }
551 42 case COMB(TY_INT, TY_DOUBLE): {
552
2/4
✓ Branch 66 → 67 taken 42 times.
✗ Branch 66 → 289 not taken.
✓ Branch 67 → 68 taken 42 times.
✗ Branch 67 → 289 not taken.
42 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
553
3/6
✓ Branch 68 → 69 taken 42 times.
✗ Branch 68 → 243 not taken.
✓ Branch 69 → 70 taken 42 times.
✗ Branch 69 → 243 not taken.
✓ Branch 70 → 71 taken 42 times.
✗ Branch 70 → 243 not taken.
42 return {.value = builder.CreateFCmpOEQ(lhsFP, rhsV())};
554 }
555 5495 case COMB(TY_INT, TY_INT):
556
4/8
✓ Branch 72 → 73 taken 5495 times.
✗ Branch 72 → 244 not taken.
✓ Branch 73 → 74 taken 5495 times.
✗ Branch 73 → 244 not taken.
✓ Branch 74 → 75 taken 5495 times.
✗ Branch 74 → 244 not taken.
✓ Branch 75 → 76 taken 5495 times.
✗ Branch 75 → 244 not taken.
5495 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
557 2 case COMB(TY_INT, TY_SHORT): {
558
5/10
✓ Branch 77 → 78 taken 2 times.
✗ Branch 77 → 245 not taken.
✓ Branch 78 → 79 taken 2 times.
✗ Branch 78 → 245 not taken.
✓ Branch 79 → 80 taken 2 times.
✗ Branch 79 → 245 not taken.
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 245 not taken.
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 246 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
559
3/6
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 246 not taken.
✓ Branch 82 → 83 taken 2 times.
✗ Branch 82 → 246 not taken.
✓ Branch 83 → 84 taken 2 times.
✗ Branch 83 → 246 not taken.
2 return {.value = builder.CreateICmpEQ(lhsV(), rhsInt)};
560 }
561 2 case COMB(TY_INT, TY_LONG): {
562
5/10
✓ Branch 85 → 86 taken 2 times.
✗ Branch 85 → 247 not taken.
✓ Branch 86 → 87 taken 2 times.
✗ Branch 86 → 247 not taken.
✓ Branch 87 → 88 taken 2 times.
✗ Branch 87 → 247 not taken.
✓ Branch 88 → 89 taken 2 times.
✗ Branch 88 → 247 not taken.
✓ Branch 89 → 90 taken 2 times.
✗ Branch 89 → 248 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
563
3/6
✓ Branch 89 → 90 taken 2 times.
✗ Branch 89 → 248 not taken.
✓ Branch 90 → 91 taken 2 times.
✗ Branch 90 → 248 not taken.
✓ Branch 91 → 92 taken 2 times.
✗ Branch 91 → 248 not taken.
2 return {.value = builder.CreateICmpEQ(lhsLong, rhsV())};
564 }
565 2 case COMB(TY_INT, TY_CHAR): {
566
5/10
✓ Branch 93 → 94 taken 2 times.
✗ Branch 93 → 249 not taken.
✓ Branch 94 → 95 taken 2 times.
✗ Branch 94 → 249 not taken.
✓ Branch 95 → 96 taken 2 times.
✗ Branch 95 → 249 not taken.
✓ Branch 96 → 97 taken 2 times.
✗ Branch 96 → 249 not taken.
✓ Branch 97 → 98 taken 2 times.
✗ Branch 97 → 250 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
567
3/6
✓ Branch 97 → 98 taken 2 times.
✗ Branch 97 → 250 not taken.
✓ Branch 98 → 99 taken 2 times.
✗ Branch 98 → 250 not taken.
✓ Branch 99 → 100 taken 2 times.
✗ Branch 99 → 250 not taken.
2 return {.value = builder.CreateICmpEQ(lhsV(), rhsInt)};
568 }
569 2 case COMB(TY_SHORT, TY_DOUBLE): {
570
2/4
✓ Branch 101 → 102 taken 2 times.
✗ Branch 101 → 289 not taken.
✓ Branch 102 → 103 taken 2 times.
✗ Branch 102 → 289 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
571
3/6
✓ Branch 103 → 104 taken 2 times.
✗ Branch 103 → 251 not taken.
✓ Branch 104 → 105 taken 2 times.
✗ Branch 104 → 251 not taken.
✓ Branch 105 → 106 taken 2 times.
✗ Branch 105 → 251 not taken.
2 return {.value = builder.CreateFCmpOEQ(lhsFP, rhsV())};
572 }
573 24 case COMB(TY_SHORT, TY_INT): {
574
5/10
✓ Branch 107 → 108 taken 24 times.
✗ Branch 107 → 252 not taken.
✓ Branch 108 → 109 taken 24 times.
✗ Branch 108 → 252 not taken.
✓ Branch 109 → 110 taken 24 times.
✗ Branch 109 → 252 not taken.
✓ Branch 110 → 111 taken 24 times.
✗ Branch 110 → 252 not taken.
✓ Branch 111 → 112 taken 24 times.
✗ Branch 111 → 253 not taken.
24 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
575
3/6
✓ Branch 111 → 112 taken 24 times.
✗ Branch 111 → 253 not taken.
✓ Branch 112 → 113 taken 24 times.
✗ Branch 112 → 253 not taken.
✓ Branch 113 → 114 taken 24 times.
✗ Branch 113 → 253 not taken.
24 return {.value = builder.CreateICmpEQ(lhsInt, rhsV())};
576 }
577 228 case COMB(TY_SHORT, TY_SHORT):
578
4/8
✓ Branch 115 → 116 taken 228 times.
✗ Branch 115 → 254 not taken.
✓ Branch 116 → 117 taken 228 times.
✗ Branch 116 → 254 not taken.
✓ Branch 117 → 118 taken 228 times.
✗ Branch 117 → 254 not taken.
✓ Branch 118 → 119 taken 228 times.
✗ Branch 118 → 254 not taken.
228 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
579 2 case COMB(TY_SHORT, TY_LONG): {
580
5/10
✓ Branch 120 → 121 taken 2 times.
✗ Branch 120 → 255 not taken.
✓ Branch 121 → 122 taken 2 times.
✗ Branch 121 → 255 not taken.
✓ Branch 122 → 123 taken 2 times.
✗ Branch 122 → 255 not taken.
✓ Branch 123 → 124 taken 2 times.
✗ Branch 123 → 255 not taken.
✓ Branch 124 → 125 taken 2 times.
✗ Branch 124 → 256 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
581
3/6
✓ Branch 124 → 125 taken 2 times.
✗ Branch 124 → 256 not taken.
✓ Branch 125 → 126 taken 2 times.
✗ Branch 125 → 256 not taken.
✓ Branch 126 → 127 taken 2 times.
✗ Branch 126 → 256 not taken.
2 return {.value = builder.CreateICmpEQ(lhsLong, rhsV())};
582 }
583 2 case COMB(TY_SHORT, TY_CHAR): {
584
5/10
✓ Branch 128 → 129 taken 2 times.
✗ Branch 128 → 257 not taken.
✓ Branch 129 → 130 taken 2 times.
✗ Branch 129 → 257 not taken.
✓ Branch 130 → 131 taken 2 times.
✗ Branch 130 → 257 not taken.
✓ Branch 131 → 132 taken 2 times.
✗ Branch 131 → 257 not taken.
✓ Branch 132 → 133 taken 2 times.
✗ Branch 132 → 258 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
585
3/6
✓ Branch 132 → 133 taken 2 times.
✗ Branch 132 → 258 not taken.
✓ Branch 133 → 134 taken 2 times.
✗ Branch 133 → 258 not taken.
✓ Branch 134 → 135 taken 2 times.
✗ Branch 134 → 258 not taken.
2 return {.value = builder.CreateICmpEQ(lhsV(), rhsShort)};
586 }
587 2 case COMB(TY_LONG, TY_DOUBLE): {
588
2/4
✓ Branch 136 → 137 taken 2 times.
✗ Branch 136 → 289 not taken.
✓ Branch 137 → 138 taken 2 times.
✗ Branch 137 → 289 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
589
3/6
✓ Branch 138 → 139 taken 2 times.
✗ Branch 138 → 259 not taken.
✓ Branch 139 → 140 taken 2 times.
✗ Branch 139 → 259 not taken.
✓ Branch 140 → 141 taken 2 times.
✗ Branch 140 → 259 not taken.
2 return {.value = builder.CreateFCmpOEQ(lhsFP, rhsV())};
590 }
591 1012 case COMB(TY_LONG, TY_INT): // fallthrough
592 case COMB(TY_LONG, TY_SHORT): {
593
5/10
✓ Branch 142 → 143 taken 1012 times.
✗ Branch 142 → 260 not taken.
✓ Branch 143 → 144 taken 1012 times.
✗ Branch 143 → 260 not taken.
✓ Branch 144 → 145 taken 1012 times.
✗ Branch 144 → 260 not taken.
✓ Branch 145 → 146 taken 1012 times.
✗ Branch 145 → 260 not taken.
✓ Branch 146 → 147 taken 1012 times.
✗ Branch 146 → 261 not taken.
1012 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
594
3/6
✓ Branch 146 → 147 taken 1012 times.
✗ Branch 146 → 261 not taken.
✓ Branch 147 → 148 taken 1012 times.
✗ Branch 147 → 261 not taken.
✓ Branch 148 → 149 taken 1012 times.
✗ Branch 148 → 261 not taken.
1012 return {.value = builder.CreateICmpEQ(lhsV(), rhsLong)};
595 }
596 13823 case COMB(TY_LONG, TY_LONG):
597
4/8
✓ Branch 150 → 151 taken 13823 times.
✗ Branch 150 → 262 not taken.
✓ Branch 151 → 152 taken 13823 times.
✗ Branch 151 → 262 not taken.
✓ Branch 152 → 153 taken 13823 times.
✗ Branch 152 → 262 not taken.
✓ Branch 153 → 154 taken 13823 times.
✗ Branch 153 → 262 not taken.
13823 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
598 2 case COMB(TY_LONG, TY_CHAR): {
599
5/10
✓ Branch 155 → 156 taken 2 times.
✗ Branch 155 → 263 not taken.
✓ Branch 156 → 157 taken 2 times.
✗ Branch 156 → 263 not taken.
✓ Branch 157 → 158 taken 2 times.
✗ Branch 157 → 263 not taken.
✓ Branch 158 → 159 taken 2 times.
✗ Branch 158 → 263 not taken.
✓ Branch 159 → 160 taken 2 times.
✗ Branch 159 → 264 not taken.
2 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
600
3/6
✓ Branch 159 → 160 taken 2 times.
✗ Branch 159 → 264 not taken.
✓ Branch 160 → 161 taken 2 times.
✗ Branch 160 → 264 not taken.
✓ Branch 161 → 162 taken 2 times.
✗ Branch 161 → 264 not taken.
2 return {.value = builder.CreateICmpEQ(lhsV(), rhsLong)};
601 }
602 178 case COMB(TY_BYTE, TY_BYTE):
603
4/8
✓ Branch 163 → 164 taken 178 times.
✗ Branch 163 → 265 not taken.
✓ Branch 164 → 165 taken 178 times.
✗ Branch 164 → 265 not taken.
✓ Branch 165 → 166 taken 178 times.
✗ Branch 165 → 265 not taken.
✓ Branch 166 → 167 taken 178 times.
✗ Branch 166 → 265 not taken.
178 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
604 70 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 70 times.
✗ Branch 168 → 266 not taken.
✓ Branch 169 → 170 taken 70 times.
✗ Branch 169 → 266 not taken.
✓ Branch 170 → 171 taken 70 times.
✗ Branch 170 → 266 not taken.
✓ Branch 171 → 172 taken 70 times.
✗ Branch 171 → 266 not taken.
✓ Branch 172 → 173 taken 70 times.
✗ Branch 172 → 267 not taken.
70 llvm::Value *lhsCasted = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
608
3/6
✓ Branch 172 → 173 taken 70 times.
✗ Branch 172 → 267 not taken.
✓ Branch 173 → 174 taken 70 times.
✗ Branch 173 → 267 not taken.
✓ Branch 174 → 175 taken 70 times.
✗ Branch 174 → 267 not taken.
70 return {.value = builder.CreateICmpEQ(lhsCasted, rhsV())};
609 }
610 6486 case COMB(TY_CHAR, TY_CHAR):
611
4/8
✓ Branch 176 → 177 taken 6486 times.
✗ Branch 176 → 268 not taken.
✓ Branch 177 → 178 taken 6486 times.
✗ Branch 177 → 268 not taken.
✓ Branch 178 → 179 taken 6486 times.
✗ Branch 178 → 268 not taken.
✓ Branch 179 → 180 taken 6486 times.
✗ Branch 179 → 268 not taken.
6486 return {.value = builder.CreateICmpEQ(lhsV(), rhsV())};
612 781 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 781 times.
✗ Branch 181 → 289 not taken.
781 llvm::Function *opFct = stdFunctionManager.getStringIsRawEqualStringStringFct();
615
5/10
✓ Branch 182 → 183 taken 781 times.
✗ Branch 182 → 272 not taken.
✓ Branch 183 → 184 taken 781 times.
✗ Branch 183 → 270 not taken.
✓ Branch 184 → 185 taken 781 times.
✗ Branch 184 → 270 not taken.
✓ Branch 186 → 187 taken 781 times.
✗ Branch 186 → 269 not taken.
✓ Branch 187 → 188 taken 781 times.
✗ Branch 187 → 269 not taken.
781 llvm::Value *result = builder.CreateCall(opFct, {lhsV(), rhsV()});
616 781 return {.value = result};
617 }
618 488 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 488 times.
✗ Branch 190 → 273 not taken.
✓ Branch 191 → 192 taken 488 times.
✗ Branch 191 → 273 not taken.
488 const uint64_t typeSize = irGenerator->module->getDataLayout().getTypeSizeInBits(lhsT) / 8;
622
1/2
✓ Branch 192 → 193 taken 488 times.
✗ Branch 192 → 289 not taken.
488 llvm::Function *memcmpFct = stdFunctionManager.getMemcmpFct();
623
7/14
✓ Branch 193 → 194 taken 488 times.
✗ Branch 193 → 277 not taken.
✓ Branch 194 → 195 taken 488 times.
✗ Branch 194 → 275 not taken.
✓ Branch 195 → 196 taken 488 times.
✗ Branch 195 → 275 not taken.
✓ Branch 196 → 197 taken 488 times.
✗ Branch 196 → 275 not taken.
✓ Branch 198 → 199 taken 488 times.
✗ Branch 198 → 274 not taken.
✓ Branch 199 → 200 taken 488 times.
✗ Branch 199 → 274 not taken.
✓ Branch 200 → 201 taken 488 times.
✗ Branch 200 → 278 not taken.
488 llvm::Value *memcmpResult = builder.CreateCall(memcmpFct, {lhsP(), rhsP(), builder.getInt64(typeSize)});
624
3/6
✓ Branch 200 → 201 taken 488 times.
✗ Branch 200 → 278 not taken.
✓ Branch 201 → 202 taken 488 times.
✗ Branch 201 → 278 not taken.
✓ Branch 202 → 203 taken 488 times.
✗ Branch 202 → 278 not taken.
488 return {.value = builder.CreateICmpEQ(memcmpResult, builder.getInt32(0))};
625 }
626 6935 case COMB(TY_PTR, TY_PTR):
627
4/8
✓ Branch 204 → 205 taken 6935 times.
✗ Branch 204 → 279 not taken.
✓ Branch 205 → 206 taken 6935 times.
✗ Branch 205 → 279 not taken.
✓ Branch 206 → 207 taken 6935 times.
✗ Branch 206 → 279 not taken.
✓ Branch 207 → 208 taken 6935 times.
✗ Branch 207 → 279 not taken.
6935 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 3244 times.
✗ Branch 12 → 229 not taken.
✓ Branch 13 → 14 taken 3244 times.
✗ Branch 13 → 229 not taken.
✓ Branch 14 → 15 taken 3244 times.
✗ Branch 14 → 229 not taken.
✓ Branch 15 → 16 taken 3244 times.
✗ Branch 15 → 229 not taken.
✓ Branch 16 → 17 taken 3244 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.
42391 }
632
633 7761 LLVMExprResult OpRuleConversionManager::getNotEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
634 LLVMExprResult &rhs, QualType rhsSTy) {
635
1/2
✓ Branch 2 → 3 taken 7761 times.
✗ Branch 2 → 227 not taken.
15262 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
636
1/2
✓ Branch 3 → 4 taken 7761 times.
✗ Branch 3 → 228 not taken.
15262 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
637 8021 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
638 8021 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
639
1/2
✓ Branch 6 → 7 taken 7761 times.
✗ Branch 6 → 229 not taken.
7761 lhsSTy = lhsSTy.removeReferenceWrapper();
640
1/2
✓ Branch 7 → 8 taken 7761 times.
✗ Branch 7 → 230 not taken.
7761 rhsSTy = rhsSTy.removeReferenceWrapper();
641
1/2
✓ Branch 8 → 9 taken 7761 times.
✗ Branch 8 → 295 not taken.
7761 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
642
1/2
✓ Branch 9 → 10 taken 7761 times.
✗ Branch 9 → 295 not taken.
7761 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
643
644 // Handle operator overloads
645
3/4
✓ Branch 10 → 11 taken 7761 times.
✗ Branch 10 → 295 not taken.
✓ Branch 11 → 12 taken 156 times.
✓ Branch 11 → 20 taken 7605 times.
7761 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
646 156 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 1819 times.
✓ Branch 21 → 25 taken 5786 times.
✓ Branch 22 → 23 taken 1819 times.
✗ Branch 22 → 295 not taken.
✓ Branch 23 → 24 taken 2 times.
✓ Branch 23 → 25 taken 1817 times.
✓ Branch 26 → 27 taken 2 times.
✓ Branch 26 → 34 taken 7603 times.
7605 if (lhsT->isPointerTy() && rhsT->isIntegerTy(64)) {
650
4/8
✓ Branch 27 → 28 taken 2 times.
✗ Branch 27 → 239 not taken.
✓ Branch 28 → 29 taken 2 times.
✗ Branch 28 → 239 not taken.
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 239 not taken.
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 240 not taken.
2 llvm::Value *lhsInt = builder.CreatePtrToInt(lhsV(), rhsT);
651
3/6
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 240 not taken.
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 240 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 240 not taken.
2 return {.value = builder.CreateICmpNE(lhsInt, rhsV())};
652 }
653
654 // Check if one value is a string and the other one is a char*
655
13/18
✓ Branch 34 → 35 taken 7603 times.
✗ Branch 34 → 295 not taken.
✓ Branch 35 → 36 taken 118 times.
✓ Branch 35 → 38 taken 7485 times.
✓ Branch 36 → 37 taken 118 times.
✗ Branch 36 → 295 not taken.
✓ Branch 37 → 38 taken 118 times.
✗ Branch 37 → 42 not taken.
✓ Branch 38 → 39 taken 7603 times.
✗ Branch 38 → 295 not taken.
✓ Branch 39 → 40 taken 360 times.
✓ Branch 39 → 43 taken 7243 times.
✓ Branch 40 → 41 taken 360 times.
✗ Branch 40 → 295 not taken.
✓ Branch 41 → 42 taken 2 times.
✓ Branch 41 → 43 taken 358 times.
✓ Branch 44 → 45 taken 2 times.
✓ Branch 44 → 55 taken 7601 times.
7603 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 2 times.
✗ Branch 45 → 295 not taken.
2 llvm::Function *opFct = stdFunctionManager.getStringIsRawEqualStringStringFct();
658
6/12
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 244 not taken.
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 242 not taken.
✓ Branch 48 → 49 taken 2 times.
✗ Branch 48 → 242 not taken.
✓ Branch 50 → 51 taken 2 times.
✗ Branch 50 → 241 not taken.
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 241 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 245 not taken.
2 llvm::Value *result = builder.CreateCall(opFct, {lhsV(), rhsV()});
659 // Negate the result
660
2/4
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 245 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 245 not taken.
2 return {.value = builder.CreateNot(result)};
661 }
662
663
23/25
✓ Branch 55 → 56 taken 7601 times.
✗ Branch 55 → 295 not taken.
✓ Branch 56 → 57 taken 122 times.
✓ Branch 56 → 62 taken 6 times.
✓ Branch 56 → 68 taken 2 times.
✓ Branch 56 → 74 taken 1204 times.
✓ Branch 56 → 79 taken 2 times.
✓ Branch 56 → 87 taken 18 times.
✓ Branch 56 → 95 taken 2 times.
✓ Branch 56 → 103 taken 2 times.
✓ Branch 56 → 109 taken 2 times.
✓ Branch 56 → 117 taken 6 times.
✓ Branch 56 → 122 taken 2 times.
✓ Branch 56 → 130 taken 2 times.
✓ Branch 56 → 138 taken 2 times.
✓ Branch 56 → 144 taken 18 times.
✓ Branch 56 → 152 taken 2311 times.
✓ Branch 56 → 157 taken 2 times.
✓ Branch 56 → 165 taken 2 times.
✓ Branch 56 → 170 taken 38 times.
✓ Branch 56 → 178 taken 1939 times.
✓ Branch 56 → 183 taken 118 times.
✓ Branch 56 → 193 taken 104 times.
✓ Branch 56 → 208 taken 1697 times.
✗ Branch 56 → 213 not taken.
7601 switch (getTypeCombination(lhsSTy, rhsSTy)) {
664 122 case COMB(TY_DOUBLE, TY_DOUBLE):
665
4/8
✓ Branch 57 → 58 taken 122 times.
✗ Branch 57 → 246 not taken.
✓ Branch 58 → 59 taken 122 times.
✗ Branch 58 → 246 not taken.
✓ Branch 59 → 60 taken 122 times.
✗ Branch 59 → 246 not taken.
✓ Branch 60 → 61 taken 122 times.
✗ Branch 60 → 246 not taken.
122 return {.value = builder.CreateFCmpONE(lhsV(), rhsV())};
666 6 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 6 times.
✗ Branch 62 → 295 not taken.
✓ Branch 63 → 64 taken 6 times.
✗ Branch 63 → 295 not taken.
6 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
670
3/6
✓ Branch 64 → 65 taken 6 times.
✗ Branch 64 → 247 not taken.
✓ Branch 65 → 66 taken 6 times.
✗ Branch 65 → 247 not taken.
✓ Branch 66 → 67 taken 6 times.
✗ Branch 66 → 247 not taken.
6 return {.value = builder.CreateFCmpONE(lhsV(), rhsFP)};
671 }
672 2 case COMB(TY_INT, TY_DOUBLE): {
673
2/4
✓ Branch 68 → 69 taken 2 times.
✗ Branch 68 → 295 not taken.
✓ Branch 69 → 70 taken 2 times.
✗ Branch 69 → 295 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
674
3/6
✓ Branch 70 → 71 taken 2 times.
✗ Branch 70 → 248 not taken.
✓ Branch 71 → 72 taken 2 times.
✗ Branch 71 → 248 not taken.
✓ Branch 72 → 73 taken 2 times.
✗ Branch 72 → 248 not taken.
2 return {.value = builder.CreateFCmpONE(lhsFP, rhsV())};
675 }
676 1204 case COMB(TY_INT, TY_INT):
677
4/8
✓ Branch 74 → 75 taken 1204 times.
✗ Branch 74 → 249 not taken.
✓ Branch 75 → 76 taken 1204 times.
✗ Branch 75 → 249 not taken.
✓ Branch 76 → 77 taken 1204 times.
✗ Branch 76 → 249 not taken.
✓ Branch 77 → 78 taken 1204 times.
✗ Branch 77 → 249 not taken.
1204 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
678 2 case COMB(TY_INT, TY_SHORT): {
679
5/10
✓ Branch 79 → 80 taken 2 times.
✗ Branch 79 → 250 not taken.
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 250 not taken.
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 250 not taken.
✓ Branch 82 → 83 taken 2 times.
✗ Branch 82 → 250 not taken.
✓ Branch 83 → 84 taken 2 times.
✗ Branch 83 → 251 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
680
3/6
✓ Branch 83 → 84 taken 2 times.
✗ Branch 83 → 251 not taken.
✓ Branch 84 → 85 taken 2 times.
✗ Branch 84 → 251 not taken.
✓ Branch 85 → 86 taken 2 times.
✗ Branch 85 → 251 not taken.
2 return {.value = builder.CreateICmpNE(lhsV(), rhsInt)};
681 }
682 18 case COMB(TY_INT, TY_LONG): {
683
5/10
✓ Branch 87 → 88 taken 18 times.
✗ Branch 87 → 252 not taken.
✓ Branch 88 → 89 taken 18 times.
✗ Branch 88 → 252 not taken.
✓ Branch 89 → 90 taken 18 times.
✗ Branch 89 → 252 not taken.
✓ Branch 90 → 91 taken 18 times.
✗ Branch 90 → 252 not taken.
✓ Branch 91 → 92 taken 18 times.
✗ Branch 91 → 253 not taken.
18 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
684
3/6
✓ Branch 91 → 92 taken 18 times.
✗ Branch 91 → 253 not taken.
✓ Branch 92 → 93 taken 18 times.
✗ Branch 92 → 253 not taken.
✓ Branch 93 → 94 taken 18 times.
✗ Branch 93 → 253 not taken.
18 return {.value = builder.CreateICmpNE(lhsLong, rhsV())};
685 }
686 2 case COMB(TY_INT, TY_CHAR): {
687
5/10
✓ Branch 95 → 96 taken 2 times.
✗ Branch 95 → 254 not taken.
✓ Branch 96 → 97 taken 2 times.
✗ Branch 96 → 254 not taken.
✓ Branch 97 → 98 taken 2 times.
✗ Branch 97 → 254 not taken.
✓ Branch 98 → 99 taken 2 times.
✗ Branch 98 → 254 not taken.
✓ Branch 99 → 100 taken 2 times.
✗ Branch 99 → 255 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
688
3/6
✓ Branch 99 → 100 taken 2 times.
✗ Branch 99 → 255 not taken.
✓ Branch 100 → 101 taken 2 times.
✗ Branch 100 → 255 not taken.
✓ Branch 101 → 102 taken 2 times.
✗ Branch 101 → 255 not taken.
2 return {.value = builder.CreateICmpNE(lhsV(), rhsInt)};
689 }
690 2 case COMB(TY_SHORT, TY_DOUBLE): {
691
2/4
✓ Branch 103 → 104 taken 2 times.
✗ Branch 103 → 295 not taken.
✓ Branch 104 → 105 taken 2 times.
✗ Branch 104 → 295 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
692
3/6
✓ Branch 105 → 106 taken 2 times.
✗ Branch 105 → 256 not taken.
✓ Branch 106 → 107 taken 2 times.
✗ Branch 106 → 256 not taken.
✓ Branch 107 → 108 taken 2 times.
✗ Branch 107 → 256 not taken.
2 return {.value = builder.CreateFCmpONE(lhsFP, rhsV())};
693 }
694 2 case COMB(TY_SHORT, TY_INT): {
695
5/10
✓ Branch 109 → 110 taken 2 times.
✗ Branch 109 → 257 not taken.
✓ Branch 110 → 111 taken 2 times.
✗ Branch 110 → 257 not taken.
✓ Branch 111 → 112 taken 2 times.
✗ Branch 111 → 257 not taken.
✓ Branch 112 → 113 taken 2 times.
✗ Branch 112 → 257 not taken.
✓ Branch 113 → 114 taken 2 times.
✗ Branch 113 → 258 not taken.
2 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
696
3/6
✓ Branch 113 → 114 taken 2 times.
✗ Branch 113 → 258 not taken.
✓ Branch 114 → 115 taken 2 times.
✗ Branch 114 → 258 not taken.
✓ Branch 115 → 116 taken 2 times.
✗ Branch 115 → 258 not taken.
2 return {.value = builder.CreateICmpNE(lhsInt, rhsV())};
697 }
698 6 case COMB(TY_SHORT, TY_SHORT):
699
4/8
✓ Branch 117 → 118 taken 6 times.
✗ Branch 117 → 259 not taken.
✓ Branch 118 → 119 taken 6 times.
✗ Branch 118 → 259 not taken.
✓ Branch 119 → 120 taken 6 times.
✗ Branch 119 → 259 not taken.
✓ Branch 120 → 121 taken 6 times.
✗ Branch 120 → 259 not taken.
6 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
700 2 case COMB(TY_SHORT, TY_LONG): {
701
5/10
✓ Branch 122 → 123 taken 2 times.
✗ Branch 122 → 260 not taken.
✓ Branch 123 → 124 taken 2 times.
✗ Branch 123 → 260 not taken.
✓ Branch 124 → 125 taken 2 times.
✗ Branch 124 → 260 not taken.
✓ Branch 125 → 126 taken 2 times.
✗ Branch 125 → 260 not taken.
✓ Branch 126 → 127 taken 2 times.
✗ Branch 126 → 261 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
702
3/6
✓ Branch 126 → 127 taken 2 times.
✗ Branch 126 → 261 not taken.
✓ Branch 127 → 128 taken 2 times.
✗ Branch 127 → 261 not taken.
✓ Branch 128 → 129 taken 2 times.
✗ Branch 128 → 261 not taken.
2 return {.value = builder.CreateICmpNE(lhsLong, rhsV())};
703 }
704 2 case COMB(TY_SHORT, TY_CHAR): {
705
5/10
✓ Branch 130 → 131 taken 2 times.
✗ Branch 130 → 262 not taken.
✓ Branch 131 → 132 taken 2 times.
✗ Branch 131 → 262 not taken.
✓ Branch 132 → 133 taken 2 times.
✗ Branch 132 → 262 not taken.
✓ Branch 133 → 134 taken 2 times.
✗ Branch 133 → 262 not taken.
✓ Branch 134 → 135 taken 2 times.
✗ Branch 134 → 263 not taken.
2 llvm::Value *rhsShort = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
706
3/6
✓ Branch 134 → 135 taken 2 times.
✗ Branch 134 → 263 not taken.
✓ Branch 135 → 136 taken 2 times.
✗ Branch 135 → 263 not taken.
✓ Branch 136 → 137 taken 2 times.
✗ Branch 136 → 263 not taken.
2 return {.value = builder.CreateICmpNE(lhsV(), rhsShort)};
707 }
708 2 case COMB(TY_LONG, TY_DOUBLE): {
709
2/4
✓ Branch 138 → 139 taken 2 times.
✗ Branch 138 → 295 not taken.
✓ Branch 139 → 140 taken 2 times.
✗ Branch 139 → 295 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
710
3/6
✓ Branch 140 → 141 taken 2 times.
✗ Branch 140 → 264 not taken.
✓ Branch 141 → 142 taken 2 times.
✗ Branch 141 → 264 not taken.
✓ Branch 142 → 143 taken 2 times.
✗ Branch 142 → 264 not taken.
2 return {.value = builder.CreateFCmpONE(lhsFP, rhsV())};
711 }
712 18 case COMB(TY_LONG, TY_INT): // fallthrough
713 case COMB(TY_LONG, TY_SHORT): {
714
5/10
✓ Branch 144 → 145 taken 18 times.
✗ Branch 144 → 265 not taken.
✓ Branch 145 → 146 taken 18 times.
✗ Branch 145 → 265 not taken.
✓ Branch 146 → 147 taken 18 times.
✗ Branch 146 → 265 not taken.
✓ Branch 147 → 148 taken 18 times.
✗ Branch 147 → 265 not taken.
✓ Branch 148 → 149 taken 18 times.
✗ Branch 148 → 266 not taken.
18 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
715
3/6
✓ Branch 148 → 149 taken 18 times.
✗ Branch 148 → 266 not taken.
✓ Branch 149 → 150 taken 18 times.
✗ Branch 149 → 266 not taken.
✓ Branch 150 → 151 taken 18 times.
✗ Branch 150 → 266 not taken.
18 return {.value = builder.CreateICmpNE(lhsV(), rhsLong)};
716 }
717 2311 case COMB(TY_LONG, TY_LONG):
718
4/8
✓ Branch 152 → 153 taken 2311 times.
✗ Branch 152 → 267 not taken.
✓ Branch 153 → 154 taken 2311 times.
✗ Branch 153 → 267 not taken.
✓ Branch 154 → 155 taken 2311 times.
✗ Branch 154 → 267 not taken.
✓ Branch 155 → 156 taken 2311 times.
✗ Branch 155 → 267 not taken.
2311 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
719 2 case COMB(TY_LONG, TY_CHAR): {
720
5/10
✓ Branch 157 → 158 taken 2 times.
✗ Branch 157 → 268 not taken.
✓ Branch 158 → 159 taken 2 times.
✗ Branch 158 → 268 not taken.
✓ Branch 159 → 160 taken 2 times.
✗ Branch 159 → 268 not taken.
✓ Branch 160 → 161 taken 2 times.
✗ Branch 160 → 268 not taken.
✓ Branch 161 → 162 taken 2 times.
✗ Branch 161 → 269 not taken.
2 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
721
3/6
✓ Branch 161 → 162 taken 2 times.
✗ Branch 161 → 269 not taken.
✓ Branch 162 → 163 taken 2 times.
✗ Branch 162 → 269 not taken.
✓ Branch 163 → 164 taken 2 times.
✗ Branch 163 → 269 not taken.
2 return {.value = builder.CreateICmpNE(lhsV(), rhsLong)};
722 }
723 2 case COMB(TY_BYTE, TY_BYTE):
724
4/8
✓ Branch 165 → 166 taken 2 times.
✗ Branch 165 → 270 not taken.
✓ Branch 166 → 167 taken 2 times.
✗ Branch 166 → 270 not taken.
✓ Branch 167 → 168 taken 2 times.
✗ Branch 167 → 270 not taken.
✓ Branch 168 → 169 taken 2 times.
✗ Branch 168 → 270 not taken.
2 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
725 38 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 38 times.
✗ Branch 170 → 271 not taken.
✓ Branch 171 → 172 taken 38 times.
✗ Branch 171 → 271 not taken.
✓ Branch 172 → 173 taken 38 times.
✗ Branch 172 → 271 not taken.
✓ Branch 173 → 174 taken 38 times.
✗ Branch 173 → 271 not taken.
✓ Branch 174 → 175 taken 38 times.
✗ Branch 174 → 272 not taken.
38 llvm::Value *lhsCasted = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
729
3/6
✓ Branch 174 → 175 taken 38 times.
✗ Branch 174 → 272 not taken.
✓ Branch 175 → 176 taken 38 times.
✗ Branch 175 → 272 not taken.
✓ Branch 176 → 177 taken 38 times.
✗ Branch 176 → 272 not taken.
38 return {.value = builder.CreateICmpNE(lhsCasted, rhsV())};
730 }
731 1939 case COMB(TY_CHAR, TY_CHAR):
732
4/8
✓ Branch 178 → 179 taken 1939 times.
✗ Branch 178 → 273 not taken.
✓ Branch 179 → 180 taken 1939 times.
✗ Branch 179 → 273 not taken.
✓ Branch 180 → 181 taken 1939 times.
✗ Branch 180 → 273 not taken.
✓ Branch 181 → 182 taken 1939 times.
✗ Branch 181 → 273 not taken.
1939 return {.value = builder.CreateICmpNE(lhsV(), rhsV())};
733 118 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 118 times.
✗ Branch 183 → 295 not taken.
118 llvm::Function *opFct = stdFunctionManager.getStringIsRawEqualStringStringFct();
736
6/12
✓ Branch 184 → 185 taken 118 times.
✗ Branch 184 → 277 not taken.
✓ Branch 185 → 186 taken 118 times.
✗ Branch 185 → 275 not taken.
✓ Branch 186 → 187 taken 118 times.
✗ Branch 186 → 275 not taken.
✓ Branch 188 → 189 taken 118 times.
✗ Branch 188 → 274 not taken.
✓ Branch 189 → 190 taken 118 times.
✗ Branch 189 → 274 not taken.
✓ Branch 190 → 191 taken 118 times.
✗ Branch 190 → 278 not taken.
118 llvm::Value *result = builder.CreateCall(opFct, {lhsV(), rhsV()});
737 // Negate the result
738
2/4
✓ Branch 190 → 191 taken 118 times.
✗ Branch 190 → 278 not taken.
✓ Branch 191 → 192 taken 118 times.
✗ Branch 191 → 278 not taken.
118 return {.value = builder.CreateNot(result)};
739 }
740 104 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 104 times.
✗ Branch 194 → 279 not taken.
✓ Branch 195 → 196 taken 104 times.
✗ Branch 195 → 279 not taken.
104 const uint64_t typeSize = irGenerator->module->getDataLayout().getTypeSizeInBits(lhsT) / 8;
744
1/2
✓ Branch 196 → 197 taken 104 times.
✗ Branch 196 → 295 not taken.
104 llvm::Function *memcmpFct = stdFunctionManager.getMemcmpFct();
745
7/14
✓ Branch 197 → 198 taken 104 times.
✗ Branch 197 → 283 not taken.
✓ Branch 198 → 199 taken 104 times.
✗ Branch 198 → 281 not taken.
✓ Branch 199 → 200 taken 104 times.
✗ Branch 199 → 281 not taken.
✓ Branch 200 → 201 taken 104 times.
✗ Branch 200 → 281 not taken.
✓ Branch 202 → 203 taken 104 times.
✗ Branch 202 → 280 not taken.
✓ Branch 203 → 204 taken 104 times.
✗ Branch 203 → 280 not taken.
✓ Branch 204 → 205 taken 104 times.
✗ Branch 204 → 284 not taken.
104 llvm::Value *memcmpResult = builder.CreateCall(memcmpFct, {lhsP(), rhsP(), builder.getInt64(typeSize)});
746
3/6
✓ Branch 204 → 205 taken 104 times.
✗ Branch 204 → 284 not taken.
✓ Branch 205 → 206 taken 104 times.
✗ Branch 205 → 284 not taken.
✓ Branch 206 → 207 taken 104 times.
✗ Branch 206 → 284 not taken.
104 return {.value = builder.CreateICmpNE(memcmpResult, builder.getInt32(0))};
747 }
748 1697 case COMB(TY_PTR, TY_PTR):
749
4/8
✓ Branch 208 → 209 taken 1697 times.
✗ Branch 208 → 285 not taken.
✓ Branch 209 → 210 taken 1697 times.
✗ Branch 209 → 285 not taken.
✓ Branch 210 → 211 taken 1697 times.
✗ Branch 210 → 285 not taken.
✓ Branch 211 → 212 taken 1697 times.
✗ Branch 211 → 285 not taken.
1697 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 156 times.
✗ Branch 12 → 233 not taken.
✓ Branch 13 → 14 taken 156 times.
✗ Branch 13 → 233 not taken.
✓ Branch 14 → 15 taken 156 times.
✗ Branch 14 → 233 not taken.
✓ Branch 15 → 16 taken 156 times.
✗ Branch 15 → 233 not taken.
✓ Branch 16 → 17 taken 156 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.
7917 }
754
755 11475 LLVMExprResult OpRuleConversionManager::getLessInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
756 LLVMExprResult &rhs, QualType rhsSTy) {
757
1/2
✓ Branch 2 → 3 taken 11475 times.
✗ Branch 2 → 103 not taken.
22950 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
758
1/2
✓ Branch 3 → 4 taken 11475 times.
✗ Branch 3 → 104 not taken.
22950 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
759
1/2
✓ Branch 4 → 5 taken 11475 times.
✗ Branch 4 → 105 not taken.
11475 lhsSTy = lhsSTy.removeReferenceWrapper();
760
1/2
✓ Branch 5 → 6 taken 11475 times.
✗ Branch 5 → 106 not taken.
11475 rhsSTy = rhsSTy.removeReferenceWrapper();
761
1/2
✓ Branch 6 → 7 taken 11475 times.
✗ Branch 6 → 127 not taken.
11475 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
762
1/2
✓ Branch 7 → 8 taken 11475 times.
✗ Branch 7 → 127 not taken.
11475 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
763
764
15/17
✓ Branch 8 → 9 taken 11475 times.
✗ Branch 8 → 127 not taken.
✓ Branch 9 → 10 taken 132 times.
✓ Branch 9 → 15 taken 62 times.
✓ Branch 9 → 21 taken 2 times.
✓ Branch 9 → 27 taken 1686 times.
✓ Branch 9 → 31 taken 2 times.
✓ Branch 9 → 38 taken 54 times.
✓ Branch 9 → 45 taken 2 times.
✓ Branch 9 → 51 taken 8 times.
✓ Branch 9 → 58 taken 58 times.
✓ Branch 9 → 62 taken 2 times.
✓ Branch 9 → 69 taken 2 times.
✓ Branch 9 → 75 taken 65 times.
✓ Branch 9 → 82 taken 9392 times.
✓ Branch 9 → 86 taken 8 times.
✗ Branch 9 → 91 not taken.
11475 switch (getTypeCombination(lhsSTy, rhsSTy)) {
765 132 case COMB(TY_DOUBLE, TY_DOUBLE):
766
4/8
✓ Branch 10 → 11 taken 132 times.
✗ Branch 10 → 107 not taken.
✓ Branch 11 → 12 taken 132 times.
✗ Branch 11 → 107 not taken.
✓ Branch 12 → 13 taken 132 times.
✗ Branch 12 → 107 not taken.
✓ Branch 13 → 14 taken 132 times.
✗ Branch 13 → 107 not taken.
132 return {.value = builder.CreateFCmpOLT(lhsV(), rhsV())};
767 62 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 62 times.
✗ Branch 15 → 127 not taken.
✓ Branch 16 → 17 taken 62 times.
✗ Branch 16 → 127 not taken.
62 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
771
3/6
✓ Branch 17 → 18 taken 62 times.
✗ Branch 17 → 108 not taken.
✓ Branch 18 → 19 taken 62 times.
✗ Branch 18 → 108 not taken.
✓ Branch 19 → 20 taken 62 times.
✗ Branch 19 → 108 not taken.
62 return {.value = builder.CreateFCmpOLT(lhsV(), rhsFP)};
772 }
773 2 case COMB(TY_INT, TY_DOUBLE): {
774
2/4
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 127 not taken.
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
775
3/6
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 109 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 109 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 109 not taken.
2 return {.value = builder.CreateFCmpOLT(lhsFP, rhsV())};
776 }
777 1686 case COMB(TY_INT, TY_INT):
778
3/6
✓ Branch 27 → 28 taken 1686 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 1686 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 1686 times.
✗ Branch 29 → 127 not taken.
1686 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsV())};
779 2 case COMB(TY_INT, TY_SHORT): {
780
5/10
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 110 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 110 not taken.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 110 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 110 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 127 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
781
2/4
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 127 not taken.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 127 not taken.
2 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsInt)};
782 }
783 54 case COMB(TY_INT, TY_LONG): {
784
5/10
✓ Branch 38 → 39 taken 54 times.
✗ Branch 38 → 111 not taken.
✓ Branch 39 → 40 taken 54 times.
✗ Branch 39 → 111 not taken.
✓ Branch 40 → 41 taken 54 times.
✗ Branch 40 → 111 not taken.
✓ Branch 41 → 42 taken 54 times.
✗ Branch 41 → 111 not taken.
✓ Branch 42 → 43 taken 54 times.
✗ Branch 42 → 127 not taken.
54 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
785
2/4
✓ Branch 42 → 43 taken 54 times.
✗ Branch 42 → 127 not taken.
✓ Branch 43 → 44 taken 54 times.
✗ Branch 43 → 127 not taken.
54 return {.value = generateLT(lhsSTy, rhsSTy, lhsLong, rhsV())};
786 }
787 2 case COMB(TY_SHORT, TY_DOUBLE): {
788
2/4
✓ Branch 45 → 46 taken 2 times.
✗ Branch 45 → 127 not taken.
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
789
3/6
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 112 not taken.
✓ Branch 48 → 49 taken 2 times.
✗ Branch 48 → 112 not taken.
✓ Branch 49 → 50 taken 2 times.
✗ Branch 49 → 112 not taken.
2 return {.value = builder.CreateFCmpOLT(lhsFP, rhsV())};
790 }
791 8 case COMB(TY_SHORT, TY_INT): {
792
5/10
✓ Branch 51 → 52 taken 8 times.
✗ Branch 51 → 113 not taken.
✓ Branch 52 → 53 taken 8 times.
✗ Branch 52 → 113 not taken.
✓ Branch 53 → 54 taken 8 times.
✗ Branch 53 → 113 not taken.
✓ Branch 54 → 55 taken 8 times.
✗ Branch 54 → 113 not taken.
✓ Branch 55 → 56 taken 8 times.
✗ Branch 55 → 127 not taken.
8 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
793
2/4
✓ Branch 55 → 56 taken 8 times.
✗ Branch 55 → 127 not taken.
✓ Branch 56 → 57 taken 8 times.
✗ Branch 56 → 127 not taken.
8 return {.value = generateLT(lhsSTy, rhsSTy, lhsInt, rhsV())};
794 }
795 58 case COMB(TY_SHORT, TY_SHORT):
796
3/6
✓ Branch 58 → 59 taken 58 times.
✗ Branch 58 → 127 not taken.
✓ Branch 59 → 60 taken 58 times.
✗ Branch 59 → 127 not taken.
✓ Branch 60 → 61 taken 58 times.
✗ Branch 60 → 127 not taken.
58 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsV())};
797 2 case COMB(TY_SHORT, TY_LONG): {
798
5/10
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 114 not taken.
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 114 not taken.
✓ Branch 64 → 65 taken 2 times.
✗ Branch 64 → 114 not taken.
✓ Branch 65 → 66 taken 2 times.
✗ Branch 65 → 114 not taken.
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 127 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
799
2/4
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 127 not taken.
✓ Branch 67 → 68 taken 2 times.
✗ Branch 67 → 127 not taken.
2 return {.value = generateLT(lhsSTy, rhsSTy, lhsLong, rhsV())};
800 }
801 2 case COMB(TY_LONG, TY_DOUBLE): {
802
2/4
✓ Branch 69 → 70 taken 2 times.
✗ Branch 69 → 127 not taken.
✓ Branch 70 → 71 taken 2 times.
✗ Branch 70 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
803
3/6
✓ Branch 71 → 72 taken 2 times.
✗ Branch 71 → 115 not taken.
✓ Branch 72 → 73 taken 2 times.
✗ Branch 72 → 115 not taken.
✓ Branch 73 → 74 taken 2 times.
✗ Branch 73 → 115 not taken.
2 return {.value = builder.CreateFCmpOLT(lhsFP, rhsV())};
804 }
805 65 case COMB(TY_LONG, TY_INT): // fallthrough
806 case COMB(TY_LONG, TY_SHORT): {
807
5/10
✓ Branch 75 → 76 taken 65 times.
✗ Branch 75 → 116 not taken.
✓ Branch 76 → 77 taken 65 times.
✗ Branch 76 → 116 not taken.
✓ Branch 77 → 78 taken 65 times.
✗ Branch 77 → 116 not taken.
✓ Branch 78 → 79 taken 65 times.
✗ Branch 78 → 116 not taken.
✓ Branch 79 → 80 taken 65 times.
✗ Branch 79 → 127 not taken.
65 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
808
2/4
✓ Branch 79 → 80 taken 65 times.
✗ Branch 79 → 127 not taken.
✓ Branch 80 → 81 taken 65 times.
✗ Branch 80 → 127 not taken.
65 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsLong)};
809 }
810 9392 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 9392 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 9392 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 9392 times.
✗ Branch 84 → 127 not taken.
9392 return {.value = generateLT(lhsSTy, rhsSTy, lhsV(), rhsV())};
814 8 case COMB(TY_PTR, TY_PTR):
815
4/8
✓ Branch 86 → 87 taken 8 times.
✗ Branch 86 → 117 not taken.
✓ Branch 87 → 88 taken 8 times.
✗ Branch 87 → 117 not taken.
✓ Branch 88 → 89 taken 8 times.
✗ Branch 88 → 117 not taken.
✓ Branch 89 → 90 taken 8 times.
✗ Branch 89 → 117 not taken.
8 return {.value = builder.CreateICmpULT(lhsV(), rhsV())};
816 default: // GCOV_EXCL_LINE
817 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: <"); // GCOV_EXCL_LINE
818 }
819 11475 }
820
821 6460 LLVMExprResult OpRuleConversionManager::getGreaterInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
822 LLVMExprResult &rhs, QualType rhsSTy) {
823
1/2
✓ Branch 2 → 3 taken 6460 times.
✗ Branch 2 → 103 not taken.
12920 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
824
1/2
✓ Branch 3 → 4 taken 6460 times.
✗ Branch 3 → 104 not taken.
12920 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
825
1/2
✓ Branch 4 → 5 taken 6460 times.
✗ Branch 4 → 105 not taken.
6460 lhsSTy = lhsSTy.removeReferenceWrapper();
826
1/2
✓ Branch 5 → 6 taken 6460 times.
✗ Branch 5 → 106 not taken.
6460 rhsSTy = rhsSTy.removeReferenceWrapper();
827
1/2
✓ Branch 6 → 7 taken 6460 times.
✗ Branch 6 → 127 not taken.
6460 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
828
1/2
✓ Branch 7 → 8 taken 6460 times.
✗ Branch 7 → 127 not taken.
6460 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
829
830
15/17
✓ Branch 8 → 9 taken 6460 times.
✗ Branch 8 → 127 not taken.
✓ Branch 9 → 10 taken 128 times.
✓ Branch 9 → 15 taken 16 times.
✓ Branch 9 → 21 taken 2 times.
✓ Branch 9 → 27 taken 1043 times.
✓ Branch 9 → 31 taken 2 times.
✓ Branch 9 → 38 taken 110 times.
✓ Branch 9 → 45 taken 2 times.
✓ Branch 9 → 51 taken 22 times.
✓ Branch 9 → 58 taken 8 times.
✓ Branch 9 → 62 taken 2 times.
✓ Branch 9 → 69 taken 2 times.
✓ Branch 9 → 75 taken 182 times.
✓ Branch 9 → 82 taken 4933 times.
✓ Branch 9 → 86 taken 8 times.
✗ Branch 9 → 91 not taken.
6460 switch (getTypeCombination(lhsSTy, rhsSTy)) {
831 128 case COMB(TY_DOUBLE, TY_DOUBLE):
832
4/8
✓ Branch 10 → 11 taken 128 times.
✗ Branch 10 → 107 not taken.
✓ Branch 11 → 12 taken 128 times.
✗ Branch 11 → 107 not taken.
✓ Branch 12 → 13 taken 128 times.
✗ Branch 12 → 107 not taken.
✓ Branch 13 → 14 taken 128 times.
✗ Branch 13 → 107 not taken.
128 return {.value = builder.CreateFCmpOGT(lhsV(), rhsV())};
833 16 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 16 times.
✗ Branch 15 → 127 not taken.
✓ Branch 16 → 17 taken 16 times.
✗ Branch 16 → 127 not taken.
16 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
837
3/6
✓ Branch 17 → 18 taken 16 times.
✗ Branch 17 → 108 not taken.
✓ Branch 18 → 19 taken 16 times.
✗ Branch 18 → 108 not taken.
✓ Branch 19 → 20 taken 16 times.
✗ Branch 19 → 108 not taken.
16 return {.value = builder.CreateFCmpOGT(lhsV(), rhsFP)};
838 }
839 2 case COMB(TY_INT, TY_DOUBLE): {
840
2/4
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 127 not taken.
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
841
3/6
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 109 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 109 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 109 not taken.
2 return {.value = builder.CreateFCmpOGT(lhsFP, rhsV())};
842 }
843 1043 case COMB(TY_INT, TY_INT):
844
3/6
✓ Branch 27 → 28 taken 1043 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 1043 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 1043 times.
✗ Branch 29 → 127 not taken.
1043 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsV())};
845 2 case COMB(TY_INT, TY_SHORT): {
846
5/10
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 110 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 110 not taken.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 110 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 110 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 127 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
847
2/4
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 127 not taken.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 127 not taken.
2 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsInt)};
848 }
849 110 case COMB(TY_INT, TY_LONG): {
850
5/10
✓ Branch 38 → 39 taken 110 times.
✗ Branch 38 → 111 not taken.
✓ Branch 39 → 40 taken 110 times.
✗ Branch 39 → 111 not taken.
✓ Branch 40 → 41 taken 110 times.
✗ Branch 40 → 111 not taken.
✓ Branch 41 → 42 taken 110 times.
✗ Branch 41 → 111 not taken.
✓ Branch 42 → 43 taken 110 times.
✗ Branch 42 → 127 not taken.
110 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
851
2/4
✓ Branch 42 → 43 taken 110 times.
✗ Branch 42 → 127 not taken.
✓ Branch 43 → 44 taken 110 times.
✗ Branch 43 → 127 not taken.
110 return {.value = generateGT(lhsSTy, rhsSTy, lhsLong, rhsV())};
852 }
853 2 case COMB(TY_SHORT, TY_DOUBLE): {
854
2/4
✓ Branch 45 → 46 taken 2 times.
✗ Branch 45 → 127 not taken.
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
855
3/6
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 112 not taken.
✓ Branch 48 → 49 taken 2 times.
✗ Branch 48 → 112 not taken.
✓ Branch 49 → 50 taken 2 times.
✗ Branch 49 → 112 not taken.
2 return {.value = builder.CreateFCmpOGT(lhsFP, rhsV())};
856 }
857 22 case COMB(TY_SHORT, TY_INT): {
858
5/10
✓ Branch 51 → 52 taken 22 times.
✗ Branch 51 → 113 not taken.
✓ Branch 52 → 53 taken 22 times.
✗ Branch 52 → 113 not taken.
✓ Branch 53 → 54 taken 22 times.
✗ Branch 53 → 113 not taken.
✓ Branch 54 → 55 taken 22 times.
✗ Branch 54 → 113 not taken.
✓ Branch 55 → 56 taken 22 times.
✗ Branch 55 → 127 not taken.
22 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
859
2/4
✓ Branch 55 → 56 taken 22 times.
✗ Branch 55 → 127 not taken.
✓ Branch 56 → 57 taken 22 times.
✗ Branch 56 → 127 not taken.
22 return {.value = generateGT(lhsSTy, rhsSTy, lhsInt, rhsV())};
860 }
861 8 case COMB(TY_SHORT, TY_SHORT):
862
3/6
✓ Branch 58 → 59 taken 8 times.
✗ Branch 58 → 127 not taken.
✓ Branch 59 → 60 taken 8 times.
✗ Branch 59 → 127 not taken.
✓ Branch 60 → 61 taken 8 times.
✗ Branch 60 → 127 not taken.
8 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsV())};
863 2 case COMB(TY_SHORT, TY_LONG): {
864
5/10
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 114 not taken.
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 114 not taken.
✓ Branch 64 → 65 taken 2 times.
✗ Branch 64 → 114 not taken.
✓ Branch 65 → 66 taken 2 times.
✗ Branch 65 → 114 not taken.
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 127 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
865
2/4
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 127 not taken.
✓ Branch 67 → 68 taken 2 times.
✗ Branch 67 → 127 not taken.
2 return {.value = generateGT(lhsSTy, rhsSTy, lhsLong, rhsV())};
866 }
867 2 case COMB(TY_LONG, TY_DOUBLE): {
868
2/4
✓ Branch 69 → 70 taken 2 times.
✗ Branch 69 → 127 not taken.
✓ Branch 70 → 71 taken 2 times.
✗ Branch 70 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
869
3/6
✓ Branch 71 → 72 taken 2 times.
✗ Branch 71 → 115 not taken.
✓ Branch 72 → 73 taken 2 times.
✗ Branch 72 → 115 not taken.
✓ Branch 73 → 74 taken 2 times.
✗ Branch 73 → 115 not taken.
2 return {.value = builder.CreateFCmpOGT(lhsFP, rhsV())};
870 }
871 182 case COMB(TY_LONG, TY_INT): // fallthrough
872 case COMB(TY_LONG, TY_SHORT): {
873
5/10
✓ Branch 75 → 76 taken 182 times.
✗ Branch 75 → 116 not taken.
✓ Branch 76 → 77 taken 182 times.
✗ Branch 76 → 116 not taken.
✓ Branch 77 → 78 taken 182 times.
✗ Branch 77 → 116 not taken.
✓ Branch 78 → 79 taken 182 times.
✗ Branch 78 → 116 not taken.
✓ Branch 79 → 80 taken 182 times.
✗ Branch 79 → 127 not taken.
182 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
874
2/4
✓ Branch 79 → 80 taken 182 times.
✗ Branch 79 → 127 not taken.
✓ Branch 80 → 81 taken 182 times.
✗ Branch 80 → 127 not taken.
182 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsLong)};
875 }
876 4933 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 4933 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 4933 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 4933 times.
✗ Branch 84 → 127 not taken.
4933 return {.value = generateGT(lhsSTy, rhsSTy, lhsV(), rhsV())};
880 8 case COMB(TY_PTR, TY_PTR):
881
4/8
✓ Branch 86 → 87 taken 8 times.
✗ Branch 86 → 117 not taken.
✓ Branch 87 → 88 taken 8 times.
✗ Branch 87 → 117 not taken.
✓ Branch 88 → 89 taken 8 times.
✗ Branch 88 → 117 not taken.
✓ Branch 89 → 90 taken 8 times.
✗ Branch 89 → 117 not taken.
8 return {.value = builder.CreateICmpUGT(lhsV(), rhsV())};
882 default: // GCOV_EXCL_LINE
883 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: >"); // GCOV_EXCL_LINE
884 }
885 6460 }
886
887 3648 LLVMExprResult OpRuleConversionManager::getLessEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
888 LLVMExprResult &rhs, QualType rhsSTy) {
889
1/2
✓ Branch 2 → 3 taken 3648 times.
✗ Branch 2 → 103 not taken.
7296 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
890
1/2
✓ Branch 3 → 4 taken 3648 times.
✗ Branch 3 → 104 not taken.
7296 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
891
1/2
✓ Branch 4 → 5 taken 3648 times.
✗ Branch 4 → 105 not taken.
3648 lhsSTy = lhsSTy.removeReferenceWrapper();
892
1/2
✓ Branch 5 → 6 taken 3648 times.
✗ Branch 5 → 106 not taken.
3648 rhsSTy = rhsSTy.removeReferenceWrapper();
893
1/2
✓ Branch 6 → 7 taken 3648 times.
✗ Branch 6 → 127 not taken.
3648 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
894
1/2
✓ Branch 7 → 8 taken 3648 times.
✗ Branch 7 → 127 not taken.
3648 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
895
896
15/17
✓ Branch 8 → 9 taken 3648 times.
✗ Branch 8 → 127 not taken.
✓ Branch 9 → 10 taken 126 times.
✓ Branch 9 → 15 taken 6 times.
✓ Branch 9 → 21 taken 2 times.
✓ Branch 9 → 27 taken 52 times.
✓ Branch 9 → 31 taken 2 times.
✓ Branch 9 → 38 taken 2 times.
✓ Branch 9 → 45 taken 2 times.
✓ Branch 9 → 51 taken 2 times.
✓ Branch 9 → 58 taken 6 times.
✓ Branch 9 → 62 taken 2 times.
✓ Branch 9 → 69 taken 2 times.
✓ Branch 9 → 75 taken 6 times.
✓ Branch 9 → 82 taken 3430 times.
✓ Branch 9 → 86 taken 8 times.
✗ Branch 9 → 91 not taken.
3648 switch (getTypeCombination(lhsSTy, rhsSTy)) {
897 126 case COMB(TY_DOUBLE, TY_DOUBLE):
898
4/8
✓ Branch 10 → 11 taken 126 times.
✗ Branch 10 → 107 not taken.
✓ Branch 11 → 12 taken 126 times.
✗ Branch 11 → 107 not taken.
✓ Branch 12 → 13 taken 126 times.
✗ Branch 12 → 107 not taken.
✓ Branch 13 → 14 taken 126 times.
✗ Branch 13 → 107 not taken.
126 return {.value = builder.CreateFCmpOLE(lhsV(), rhsV())};
899 6 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 6 times.
✗ Branch 15 → 127 not taken.
✓ Branch 16 → 17 taken 6 times.
✗ Branch 16 → 127 not taken.
6 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
903
3/6
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 108 not taken.
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 108 not taken.
✓ Branch 19 → 20 taken 6 times.
✗ Branch 19 → 108 not taken.
6 return {.value = builder.CreateFCmpOLE(lhsV(), rhsFP)};
904 }
905 2 case COMB(TY_INT, TY_DOUBLE): {
906
2/4
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 127 not taken.
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
907
3/6
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 109 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 109 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 109 not taken.
2 return {.value = builder.CreateFCmpOLE(lhsFP, rhsV())};
908 }
909 52 case COMB(TY_INT, TY_INT):
910
3/6
✓ Branch 27 → 28 taken 52 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 52 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 52 times.
✗ Branch 29 → 127 not taken.
52 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsV())};
911 2 case COMB(TY_INT, TY_SHORT): {
912
5/10
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 110 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 110 not taken.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 110 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 110 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 127 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
913
2/4
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 127 not taken.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 127 not taken.
2 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsInt)};
914 }
915 2 case COMB(TY_INT, TY_LONG): {
916
5/10
✓ Branch 38 → 39 taken 2 times.
✗ Branch 38 → 111 not taken.
✓ Branch 39 → 40 taken 2 times.
✗ Branch 39 → 111 not taken.
✓ Branch 40 → 41 taken 2 times.
✗ Branch 40 → 111 not taken.
✓ Branch 41 → 42 taken 2 times.
✗ Branch 41 → 111 not taken.
✓ Branch 42 → 43 taken 2 times.
✗ Branch 42 → 127 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
917
2/4
✓ Branch 42 → 43 taken 2 times.
✗ Branch 42 → 127 not taken.
✓ Branch 43 → 44 taken 2 times.
✗ Branch 43 → 127 not taken.
2 return {.value = generateLE(lhsSTy, rhsSTy, lhsLong, rhsV())};
918 }
919 2 case COMB(TY_SHORT, TY_DOUBLE): {
920
2/4
✓ Branch 45 → 46 taken 2 times.
✗ Branch 45 → 127 not taken.
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
921
3/6
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 112 not taken.
✓ Branch 48 → 49 taken 2 times.
✗ Branch 48 → 112 not taken.
✓ Branch 49 → 50 taken 2 times.
✗ Branch 49 → 112 not taken.
2 return {.value = builder.CreateFCmpOLE(lhsFP, rhsV())};
922 }
923 2 case COMB(TY_SHORT, TY_INT): {
924
5/10
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 113 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 113 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 113 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 113 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 127 not taken.
2 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
925
2/4
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 127 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 127 not taken.
2 return {.value = generateLE(lhsSTy, rhsSTy, lhsInt, rhsV())};
926 }
927 6 case COMB(TY_SHORT, TY_SHORT):
928
3/6
✓ Branch 58 → 59 taken 6 times.
✗ Branch 58 → 127 not taken.
✓ Branch 59 → 60 taken 6 times.
✗ Branch 59 → 127 not taken.
✓ Branch 60 → 61 taken 6 times.
✗ Branch 60 → 127 not taken.
6 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsV())};
929 2 case COMB(TY_SHORT, TY_LONG): {
930
5/10
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 114 not taken.
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 114 not taken.
✓ Branch 64 → 65 taken 2 times.
✗ Branch 64 → 114 not taken.
✓ Branch 65 → 66 taken 2 times.
✗ Branch 65 → 114 not taken.
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 127 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
931
2/4
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 127 not taken.
✓ Branch 67 → 68 taken 2 times.
✗ Branch 67 → 127 not taken.
2 return {.value = generateLE(lhsSTy, rhsSTy, lhsLong, rhsV())};
932 }
933 2 case COMB(TY_LONG, TY_DOUBLE): {
934
2/4
✓ Branch 69 → 70 taken 2 times.
✗ Branch 69 → 127 not taken.
✓ Branch 70 → 71 taken 2 times.
✗ Branch 70 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
935
3/6
✓ Branch 71 → 72 taken 2 times.
✗ Branch 71 → 115 not taken.
✓ Branch 72 → 73 taken 2 times.
✗ Branch 72 → 115 not taken.
✓ Branch 73 → 74 taken 2 times.
✗ Branch 73 → 115 not taken.
2 return {.value = builder.CreateFCmpOLE(lhsFP, rhsV())};
936 }
937 6 case COMB(TY_LONG, TY_INT): // fallthrough
938 case COMB(TY_LONG, TY_SHORT): {
939
5/10
✓ Branch 75 → 76 taken 6 times.
✗ Branch 75 → 116 not taken.
✓ Branch 76 → 77 taken 6 times.
✗ Branch 76 → 116 not taken.
✓ Branch 77 → 78 taken 6 times.
✗ Branch 77 → 116 not taken.
✓ Branch 78 → 79 taken 6 times.
✗ Branch 78 → 116 not taken.
✓ Branch 79 → 80 taken 6 times.
✗ Branch 79 → 127 not taken.
6 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
940
2/4
✓ Branch 79 → 80 taken 6 times.
✗ Branch 79 → 127 not taken.
✓ Branch 80 → 81 taken 6 times.
✗ Branch 80 → 127 not taken.
6 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsLong)};
941 }
942 3430 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 3430 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 3430 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 3430 times.
✗ Branch 84 → 127 not taken.
3430 return {.value = generateLE(lhsSTy, rhsSTy, lhsV(), rhsV())};
946 8 case COMB(TY_PTR, TY_PTR):
947
4/8
✓ Branch 86 → 87 taken 8 times.
✗ Branch 86 → 117 not taken.
✓ Branch 87 → 88 taken 8 times.
✗ Branch 87 → 117 not taken.
✓ Branch 88 → 89 taken 8 times.
✗ Branch 88 → 117 not taken.
✓ Branch 89 → 90 taken 8 times.
✗ Branch 89 → 117 not taken.
8 return {.value = builder.CreateICmpULE(lhsV(), rhsV())};
948 default: // GCOV_EXCL_LINE
949 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: <="); // GCOV_EXCL_LINE
950 }
951 3648 }
952
953 6617 LLVMExprResult OpRuleConversionManager::getGreaterEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy,
954 LLVMExprResult &rhs, QualType rhsSTy) {
955
1/2
✓ Branch 2 → 3 taken 6617 times.
✗ Branch 2 → 103 not taken.
13234 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
956
1/2
✓ Branch 3 → 4 taken 6617 times.
✗ Branch 3 → 104 not taken.
13234 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
957
1/2
✓ Branch 4 → 5 taken 6617 times.
✗ Branch 4 → 105 not taken.
6617 lhsSTy = lhsSTy.removeReferenceWrapper();
958
1/2
✓ Branch 5 → 6 taken 6617 times.
✗ Branch 5 → 106 not taken.
6617 rhsSTy = rhsSTy.removeReferenceWrapper();
959
1/2
✓ Branch 6 → 7 taken 6617 times.
✗ Branch 6 → 127 not taken.
6617 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
960
1/2
✓ Branch 7 → 8 taken 6617 times.
✗ Branch 7 → 127 not taken.
6617 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
961
962
15/17
✓ Branch 8 → 9 taken 6617 times.
✗ Branch 8 → 127 not taken.
✓ Branch 9 → 10 taken 212 times.
✓ Branch 9 → 15 taken 30 times.
✓ Branch 9 → 21 taken 2 times.
✓ Branch 9 → 27 taken 228 times.
✓ Branch 9 → 31 taken 2 times.
✓ Branch 9 → 38 taken 38 times.
✓ Branch 9 → 45 taken 2 times.
✓ Branch 9 → 51 taken 104 times.
✓ Branch 9 → 58 taken 20 times.
✓ Branch 9 → 62 taken 2 times.
✓ Branch 9 → 69 taken 2 times.
✓ Branch 9 → 75 taken 128 times.
✓ Branch 9 → 82 taken 5839 times.
✓ Branch 9 → 86 taken 8 times.
✗ Branch 9 → 91 not taken.
6617 switch (getTypeCombination(lhsSTy, rhsSTy)) {
963 212 case COMB(TY_DOUBLE, TY_DOUBLE):
964
4/8
✓ Branch 10 → 11 taken 212 times.
✗ Branch 10 → 107 not taken.
✓ Branch 11 → 12 taken 212 times.
✗ Branch 11 → 107 not taken.
✓ Branch 12 → 13 taken 212 times.
✗ Branch 12 → 107 not taken.
✓ Branch 13 → 14 taken 212 times.
✗ Branch 13 → 107 not taken.
212 return {.value = builder.CreateFCmpOGE(lhsV(), rhsV())};
965 30 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 30 times.
✗ Branch 15 → 127 not taken.
✓ Branch 16 → 17 taken 30 times.
✗ Branch 16 → 127 not taken.
30 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
969
3/6
✓ Branch 17 → 18 taken 30 times.
✗ Branch 17 → 108 not taken.
✓ Branch 18 → 19 taken 30 times.
✗ Branch 18 → 108 not taken.
✓ Branch 19 → 20 taken 30 times.
✗ Branch 19 → 108 not taken.
30 return {.value = builder.CreateFCmpOGE(lhsV(), rhsFP)};
970 }
971 2 case COMB(TY_INT, TY_DOUBLE): {
972
2/4
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 127 not taken.
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
973
3/6
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 109 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 109 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 109 not taken.
2 return {.value = builder.CreateFCmpOGE(lhsFP, rhsV())};
974 }
975 228 case COMB(TY_INT, TY_INT):
976
3/6
✓ Branch 27 → 28 taken 228 times.
✗ Branch 27 → 127 not taken.
✓ Branch 28 → 29 taken 228 times.
✗ Branch 28 → 127 not taken.
✓ Branch 29 → 30 taken 228 times.
✗ Branch 29 → 127 not taken.
228 return {.value = generateGE(lhsSTy, rhsSTy, lhsV(), rhsV())};
977 2 case COMB(TY_INT, TY_SHORT): {
978
5/10
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 110 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 110 not taken.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 110 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 110 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 127 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
979
2/4
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 127 not taken.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 127 not taken.
2 return {.value = generateGE(lhsSTy, rhsSTy, lhsV(), rhsInt)};
980 }
981 38 case COMB(TY_INT, TY_LONG): {
982
5/10
✓ Branch 38 → 39 taken 38 times.
✗ Branch 38 → 111 not taken.
✓ Branch 39 → 40 taken 38 times.
✗ Branch 39 → 111 not taken.
✓ Branch 40 → 41 taken 38 times.
✗ Branch 40 → 111 not taken.
✓ Branch 41 → 42 taken 38 times.
✗ Branch 41 → 111 not taken.
✓ Branch 42 → 43 taken 38 times.
✗ Branch 42 → 127 not taken.
38 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
983
2/4
✓ Branch 42 → 43 taken 38 times.
✗ Branch 42 → 127 not taken.
✓ Branch 43 → 44 taken 38 times.
✗ Branch 43 → 127 not taken.
38 return {.value = generateGE(lhsSTy, rhsSTy, lhsLong, rhsV())};
984 }
985 2 case COMB(TY_SHORT, TY_DOUBLE): {
986
2/4
✓ Branch 45 → 46 taken 2 times.
✗ Branch 45 → 127 not taken.
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
987
3/6
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 112 not taken.
✓ Branch 48 → 49 taken 2 times.
✗ Branch 48 → 112 not taken.
✓ Branch 49 → 50 taken 2 times.
✗ Branch 49 → 112 not taken.
2 return {.value = builder.CreateFCmpOGE(lhsFP, rhsV())};
988 }
989 104 case COMB(TY_SHORT, TY_INT): {
990
5/10
✓ Branch 51 → 52 taken 104 times.
✗ Branch 51 → 113 not taken.
✓ Branch 52 → 53 taken 104 times.
✗ Branch 52 → 113 not taken.
✓ Branch 53 → 54 taken 104 times.
✗ Branch 53 → 113 not taken.
✓ Branch 54 → 55 taken 104 times.
✗ Branch 54 → 113 not taken.
✓ Branch 55 → 56 taken 104 times.
✗ Branch 55 → 127 not taken.
104 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
991
2/4
✓ Branch 55 → 56 taken 104 times.
✗ Branch 55 → 127 not taken.
✓ Branch 56 → 57 taken 104 times.
✗ Branch 56 → 127 not taken.
104 return {.value = generateGE(lhsSTy, rhsSTy, lhsInt, rhsV())};
992 }
993 20 case COMB(TY_SHORT, TY_SHORT):
994
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 = generateGE(lhsSTy, rhsSTy, lhsV(), rhsV())};
995 2 case COMB(TY_SHORT, TY_LONG): {
996
5/10
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 114 not taken.
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 114 not taken.
✓ Branch 64 → 65 taken 2 times.
✗ Branch 64 → 114 not taken.
✓ Branch 65 → 66 taken 2 times.
✗ Branch 65 → 114 not taken.
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 127 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
997
2/4
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 127 not taken.
✓ Branch 67 → 68 taken 2 times.
✗ Branch 67 → 127 not taken.
2 return {.value = generateGE(lhsSTy, rhsSTy, lhsLong, rhsV())};
998 }
999 2 case COMB(TY_LONG, TY_DOUBLE): {
1000
2/4
✓ Branch 69 → 70 taken 2 times.
✗ Branch 69 → 127 not taken.
✓ Branch 70 → 71 taken 2 times.
✗ Branch 70 → 127 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1001
3/6
✓ Branch 71 → 72 taken 2 times.
✗ Branch 71 → 115 not taken.
✓ Branch 72 → 73 taken 2 times.
✗ Branch 72 → 115 not taken.
✓ Branch 73 → 74 taken 2 times.
✗ Branch 73 → 115 not taken.
2 return {.value = builder.CreateFCmpOGE(lhsFP, rhsV())};
1002 }
1003 128 case COMB(TY_LONG, TY_INT): // fallthrough
1004 case COMB(TY_LONG, TY_SHORT): {
1005
5/10
✓ Branch 75 → 76 taken 128 times.
✗ Branch 75 → 116 not taken.
✓ Branch 76 → 77 taken 128 times.
✗ Branch 76 → 116 not taken.
✓ Branch 77 → 78 taken 128 times.
✗ Branch 77 → 116 not taken.
✓ Branch 78 → 79 taken 128 times.
✗ Branch 78 → 116 not taken.
✓ Branch 79 → 80 taken 128 times.
✗ Branch 79 → 127 not taken.
128 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1006
2/4
✓ Branch 79 → 80 taken 128 times.
✗ Branch 79 → 127 not taken.
✓ Branch 80 → 81 taken 128 times.
✗ Branch 80 → 127 not taken.
128 return {.value = generateGE(lhsSTy, rhsSTy, lhsV(), rhsLong)};
1007 }
1008 5839 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 5839 times.
✗ Branch 82 → 127 not taken.
✓ Branch 83 → 84 taken 5839 times.
✗ Branch 83 → 127 not taken.
✓ Branch 84 → 85 taken 5839 times.
✗ Branch 84 → 127 not taken.
5839 return {.value = generateGE(lhsSTy, rhsSTy, lhsV(), rhsV())};
1012 8 case COMB(TY_PTR, TY_PTR):
1013
4/8
✓ Branch 86 → 87 taken 8 times.
✗ Branch 86 → 117 not taken.
✓ Branch 87 → 88 taken 8 times.
✗ Branch 87 → 117 not taken.
✓ Branch 88 → 89 taken 8 times.
✗ Branch 88 → 117 not taken.
✓ Branch 89 → 90 taken 8 times.
✗ Branch 89 → 117 not taken.
8 return {.value = builder.CreateICmpUGE(lhsV(), rhsV())};
1014 default: // GCOV_EXCL_LINE
1015 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: >="); // GCOV_EXCL_LINE
1016 }
1017 6617 }
1018
1019 4565 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 4565 times.
✗ Branch 2 → 79 not taken.
4794 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1022
1/2
✓ Branch 3 → 4 taken 4565 times.
✗ Branch 3 → 80 not taken.
8082 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1023 8901 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1024 5613 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1025
1/2
✓ Branch 6 → 7 taken 4565 times.
✗ Branch 6 → 81 not taken.
4565 lhsSTy = lhsSTy.removeReferenceWrapper();
1026
1/2
✓ Branch 7 → 8 taken 4565 times.
✗ Branch 7 → 82 not taken.
4565 rhsSTy = rhsSTy.removeReferenceWrapper();
1027
1/2
✓ Branch 8 → 9 taken 4565 times.
✗ Branch 8 → 110 not taken.
4565 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1028
1029 // Handle operator overloads
1030
3/4
✓ Branch 9 → 10 taken 4565 times.
✗ Branch 9 → 110 not taken.
✓ Branch 10 → 11 taken 4338 times.
✓ Branch 10 → 19 taken 227 times.
4565 if (callsOverloadedOpFct(node, opIdx))
1031 4338 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1032
1033
8/10
✓ Branch 19 → 20 taken 227 times.
✗ Branch 19 → 110 not taken.
✓ Branch 20 → 21 taken 100 times.
✓ Branch 20 → 26 taken 6 times.
✓ Branch 20 → 34 taken 2 times.
✓ Branch 20 → 39 taken 28 times.
✓ Branch 20 → 47 taken 83 times.
✓ Branch 20 → 52 taken 6 times.
✓ Branch 20 → 60 taken 2 times.
✗ Branch 20 → 65 not taken.
227 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1034 100 case COMB(TY_INT, TY_INT):
1035
4/8
✓ Branch 21 → 22 taken 100 times.
✗ Branch 21 → 91 not taken.
✓ Branch 22 → 23 taken 100 times.
✗ Branch 22 → 91 not taken.
✓ Branch 23 → 24 taken 100 times.
✗ Branch 23 → 91 not taken.
✓ Branch 24 → 25 taken 100 times.
✗ Branch 24 → 91 not taken.
100 return {.value = builder.CreateShl(lhsV(), rhsV())};
1036 6 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 6 times.
✗ Branch 26 → 92 not taken.
✓ Branch 27 → 28 taken 6 times.
✗ Branch 27 → 92 not taken.
✓ Branch 28 → 29 taken 6 times.
✗ Branch 28 → 92 not taken.
✓ Branch 29 → 30 taken 6 times.
✗ Branch 29 → 92 not taken.
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 93 not taken.
6 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1040
3/6
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 93 not taken.
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 93 not taken.
✓ Branch 32 → 33 taken 6 times.
✗ Branch 32 → 93 not taken.
6 return {.value = builder.CreateShl(lhsV(), rhsInt)};
1041 }
1042 2 case COMB(TY_SHORT, TY_SHORT):
1043
4/8
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 94 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 94 not taken.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 94 not taken.
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 94 not taken.
2 return {.value = builder.CreateShl(lhsV(), rhsV())};
1044 28 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 28 times.
✗ Branch 39 → 95 not taken.
✓ Branch 40 → 41 taken 28 times.
✗ Branch 40 → 95 not taken.
✓ Branch 41 → 42 taken 28 times.
✗ Branch 41 → 95 not taken.
✓ Branch 42 → 43 taken 28 times.
✗ Branch 42 → 95 not taken.
✓ Branch 43 → 44 taken 28 times.
✗ Branch 43 → 96 not taken.
28 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1048
3/6
✓ Branch 43 → 44 taken 28 times.
✗ Branch 43 → 96 not taken.
✓ Branch 44 → 45 taken 28 times.
✗ Branch 44 → 96 not taken.
✓ Branch 45 → 46 taken 28 times.
✗ Branch 45 → 96 not taken.
28 return {.value = builder.CreateShl(lhsV(), rhsInt)};
1049 }
1050 83 case COMB(TY_LONG, TY_LONG):
1051
4/8
✓ Branch 47 → 48 taken 83 times.
✗ Branch 47 → 97 not taken.
✓ Branch 48 → 49 taken 83 times.
✗ Branch 48 → 97 not taken.
✓ Branch 49 → 50 taken 83 times.
✗ Branch 49 → 97 not taken.
✓ Branch 50 → 51 taken 83 times.
✗ Branch 50 → 97 not taken.
83 return {.value = builder.CreateShl(lhsV(), rhsV())};
1052 6 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 6 times.
✗ Branch 52 → 98 not taken.
✓ Branch 53 → 54 taken 6 times.
✗ Branch 53 → 98 not taken.
✓ Branch 54 → 55 taken 6 times.
✗ Branch 54 → 98 not taken.
✓ Branch 55 → 56 taken 6 times.
✗ Branch 55 → 98 not taken.
✓ Branch 56 → 57 taken 6 times.
✗ Branch 56 → 99 not taken.
6 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1056
3/6
✓ Branch 56 → 57 taken 6 times.
✗ Branch 56 → 99 not taken.
✓ Branch 57 → 58 taken 6 times.
✗ Branch 57 → 99 not taken.
✓ Branch 58 → 59 taken 6 times.
✗ Branch 58 → 99 not taken.
6 return {.value = builder.CreateShl(lhsV(), rhsInt)};
1057 }
1058 2 case COMB(TY_BYTE, TY_BYTE):
1059
4/8
✓ Branch 60 → 61 taken 2 times.
✗ Branch 60 → 100 not taken.
✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 100 not taken.
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 100 not taken.
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 100 not taken.
2 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 4338 times.
✗ Branch 11 → 85 not taken.
✓ Branch 12 → 13 taken 4338 times.
✗ Branch 12 → 85 not taken.
✓ Branch 13 → 14 taken 4338 times.
✗ Branch 13 → 85 not taken.
✓ Branch 14 → 15 taken 4338 times.
✗ Branch 14 → 85 not taken.
✓ Branch 15 → 16 taken 4338 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.
8903 }
1064
1065 751 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 751 times.
✗ Branch 2 → 72 not taken.
1502 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1068
1/2
✓ Branch 3 → 4 taken 751 times.
✗ Branch 3 → 73 not taken.
1502 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1069 751 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1070 751 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1071
1/2
✓ Branch 6 → 7 taken 751 times.
✗ Branch 6 → 74 not taken.
751 lhsSTy = lhsSTy.removeReferenceWrapper();
1072
1/2
✓ Branch 7 → 8 taken 751 times.
✗ Branch 7 → 75 not taken.
751 rhsSTy = rhsSTy.removeReferenceWrapper();
1073
1/2
✓ Branch 8 → 9 taken 751 times.
✗ Branch 8 → 96 not taken.
751 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1074
1075 // Handle operator overloads
1076
3/4
✓ Branch 9 → 10 taken 751 times.
✗ Branch 9 → 96 not taken.
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 19 taken 749 times.
751 if (callsOverloadedOpFct(node, opIdx))
1077 2 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1078
1079
8/10
✓ Branch 19 → 20 taken 749 times.
✗ Branch 19 → 96 not taken.
✓ Branch 20 → 21 taken 88 times.
✓ Branch 20 → 25 taken 6 times.
✓ Branch 20 → 32 taken 2 times.
✓ Branch 20 → 36 taken 84 times.
✓ Branch 20 → 43 taken 561 times.
✓ Branch 20 → 47 taken 6 times.
✓ Branch 20 → 54 taken 2 times.
✗ Branch 20 → 58 not taken.
749 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1080 88 case COMB(TY_INT, TY_INT):
1081
3/6
✓ Branch 21 → 22 taken 88 times.
✗ Branch 21 → 96 not taken.
✓ Branch 22 → 23 taken 88 times.
✗ Branch 22 → 96 not taken.
✓ Branch 23 → 24 taken 88 times.
✗ Branch 23 → 96 not taken.
88 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
1082 6 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 6 times.
✗ Branch 25 → 84 not taken.
✓ Branch 26 → 27 taken 6 times.
✗ Branch 26 → 84 not taken.
✓ Branch 27 → 28 taken 6 times.
✗ Branch 27 → 84 not taken.
✓ Branch 28 → 29 taken 6 times.
✗ Branch 28 → 84 not taken.
✓ Branch 29 → 30 taken 6 times.
✗ Branch 29 → 96 not taken.
6 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1086
2/4
✓ Branch 29 → 30 taken 6 times.
✗ Branch 29 → 96 not taken.
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 96 not taken.
6 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsInt)};
1087 }
1088 2 case COMB(TY_SHORT, TY_SHORT):
1089
3/6
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 96 not taken.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 96 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 96 not taken.
2 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
1090 84 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 84 times.
✗ Branch 36 → 85 not taken.
✓ Branch 37 → 38 taken 84 times.
✗ Branch 37 → 85 not taken.
✓ Branch 38 → 39 taken 84 times.
✗ Branch 38 → 85 not taken.
✓ Branch 39 → 40 taken 84 times.
✗ Branch 39 → 85 not taken.
✓ Branch 40 → 41 taken 84 times.
✗ Branch 40 → 96 not taken.
84 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1094
2/4
✓ Branch 40 → 41 taken 84 times.
✗ Branch 40 → 96 not taken.
✓ Branch 41 → 42 taken 84 times.
✗ Branch 41 → 96 not taken.
84 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsInt)};
1095 }
1096 561 case COMB(TY_LONG, TY_LONG):
1097
3/6
✓ Branch 43 → 44 taken 561 times.
✗ Branch 43 → 96 not taken.
✓ Branch 44 → 45 taken 561 times.
✗ Branch 44 → 96 not taken.
✓ Branch 45 → 46 taken 561 times.
✗ Branch 45 → 96 not taken.
561 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsV())};
1098 6 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 6 times.
✗ Branch 47 → 86 not taken.
✓ Branch 48 → 49 taken 6 times.
✗ Branch 48 → 86 not taken.
✓ Branch 49 → 50 taken 6 times.
✗ Branch 49 → 86 not taken.
✓ Branch 50 → 51 taken 6 times.
✗ Branch 50 → 86 not taken.
✓ Branch 51 → 52 taken 6 times.
✗ Branch 51 → 96 not taken.
6 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1102
2/4
✓ Branch 51 → 52 taken 6 times.
✗ Branch 51 → 96 not taken.
✓ Branch 52 → 53 taken 6 times.
✗ Branch 52 → 96 not taken.
6 return {.value = generateSHR(lhsSTy, rhsSTy, lhsV(), rhsInt)};
1103 }
1104 2 case COMB(TY_BYTE, TY_BYTE):
1105
3/6
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 96 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 96 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 96 not taken.
2 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 2 times.
✗ Branch 11 → 78 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 78 not taken.
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 78 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 78 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ 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.
753 }
1110
1111 17544 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 17544 times.
✗ Branch 2 → 231 not taken.
33846 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1114
1/2
✓ Branch 3 → 4 taken 17544 times.
✗ Branch 3 → 232 not taken.
33844 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1115 18786 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1116 18788 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1117
1/2
✓ Branch 6 → 7 taken 17544 times.
✗ Branch 6 → 233 not taken.
17544 lhsSTy = lhsSTy.removeReferenceWrapper();
1118
1/2
✓ Branch 7 → 8 taken 17544 times.
✗ Branch 7 → 234 not taken.
17544 rhsSTy = rhsSTy.removeReferenceWrapper();
1119
1/2
✓ Branch 8 → 9 taken 17544 times.
✗ Branch 8 → 291 not taken.
17544 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1120
1/2
✓ Branch 9 → 10 taken 17544 times.
✗ Branch 9 → 291 not taken.
17544 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1121
1122 // Handle operator overloads
1123
3/4
✓ Branch 10 → 11 taken 17544 times.
✗ Branch 10 → 291 not taken.
✓ Branch 11 → 12 taken 1246 times.
✓ Branch 11 → 20 taken 16298 times.
17544 if (callsOverloadedOpFct(node, opIdx))
1124 1246 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1125
1126
16/21
✓ Branch 20 → 21 taken 16298 times.
✗ Branch 20 → 291 not taken.
✓ Branch 21 → 22 taken 350 times.
✓ Branch 21 → 27 taken 532 times.
✓ Branch 21 → 33 taken 4 times.
✓ Branch 21 → 39 taken 253 times.
✓ Branch 21 → 50 taken 2 times.
✓ Branch 21 → 64 taken 570 times.
✗ Branch 21 → 78 not taken.
✓ Branch 21 → 91 taken 2 times.
✓ Branch 21 → 97 taken 2 times.
✓ Branch 21 → 111 taken 4 times.
✓ Branch 21 → 122 taken 2 times.
✗ Branch 21 → 136 not taken.
✓ Branch 21 → 149 taken 4 times.
✓ Branch 21 → 155 taken 546 times.
✓ Branch 21 → 169 taken 10305 times.
✗ Branch 21 → 180 not taken.
✓ Branch 21 → 193 taken 2 times.
✓ Branch 21 → 204 taken 3720 times.
✗ Branch 21 → 217 not taken.
16298 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1127 350 case COMB(TY_DOUBLE, TY_DOUBLE):
1128
4/8
✓ Branch 22 → 23 taken 350 times.
✗ Branch 22 → 243 not taken.
✓ Branch 23 → 24 taken 350 times.
✗ Branch 23 → 243 not taken.
✓ Branch 24 → 25 taken 350 times.
✗ Branch 24 → 243 not taken.
✓ Branch 25 → 26 taken 350 times.
✗ Branch 25 → 243 not taken.
350 return {.value = builder.CreateFAdd(lhsV(), rhsV())};
1129 532 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 532 times.
✗ Branch 27 → 291 not taken.
✓ Branch 28 → 29 taken 532 times.
✗ Branch 28 → 291 not taken.
532 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
1133
3/6
✓ Branch 29 → 30 taken 532 times.
✗ Branch 29 → 244 not taken.
✓ Branch 30 → 31 taken 532 times.
✗ Branch 30 → 244 not taken.
✓ Branch 31 → 32 taken 532 times.
✗ Branch 31 → 244 not taken.
532 return {.value = builder.CreateFAdd(lhsV(), rhsFP)};
1134 }
1135 4 case COMB(TY_INT, TY_DOUBLE): {
1136
2/4
✓ Branch 33 → 34 taken 4 times.
✗ Branch 33 → 291 not taken.
✓ Branch 34 → 35 taken 4 times.
✗ Branch 34 → 291 not taken.
4 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1137
3/6
✓ Branch 35 → 36 taken 4 times.
✗ Branch 35 → 245 not taken.
✓ Branch 36 → 37 taken 4 times.
✗ Branch 36 → 245 not taken.
✓ Branch 37 → 38 taken 4 times.
✗ Branch 37 → 245 not taken.
4 return {.value = builder.CreateFAdd(lhsFP, rhsV())};
1138 }
1139 253 case COMB(TY_INT, TY_INT):
1140
10/16
✓ Branch 39 → 40 taken 253 times.
✗ Branch 39 → 291 not taken.
✓ Branch 40 → 41 taken 231 times.
✓ Branch 40 → 44 taken 22 times.
✓ Branch 41 → 42 taken 231 times.
✗ Branch 41 → 291 not taken.
✓ Branch 42 → 43 taken 225 times.
✓ Branch 42 → 44 taken 6 times.
✓ Branch 45 → 46 taken 253 times.
✗ Branch 45 → 246 not taken.
✓ Branch 46 → 47 taken 253 times.
✗ Branch 46 → 246 not taken.
✓ Branch 47 → 48 taken 253 times.
✗ Branch 47 → 246 not taken.
✓ Branch 48 → 49 taken 253 times.
✗ Branch 48 → 246 not taken.
253 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1141 2 case COMB(TY_INT, TY_SHORT): {
1142
5/10
✓ Branch 50 → 51 taken 2 times.
✗ Branch 50 → 247 not taken.
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 247 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 247 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 247 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 291 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1143
7/14
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 291 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 59 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 291 not taken.
✓ Branch 57 → 58 taken 2 times.
✗ Branch 57 → 59 not taken.
✓ Branch 60 → 61 taken 2 times.
✗ Branch 60 → 248 not taken.
✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 248 not taken.
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 248 not taken.
2 return {.value = builder.CreateAdd(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1144 }
1145 570 case COMB(TY_INT, TY_LONG): {
1146
5/10
✓ Branch 64 → 65 taken 570 times.
✗ Branch 64 → 249 not taken.
✓ Branch 65 → 66 taken 570 times.
✗ Branch 65 → 249 not taken.
✓ Branch 66 → 67 taken 570 times.
✗ Branch 66 → 249 not taken.
✓ Branch 67 → 68 taken 570 times.
✗ Branch 67 → 249 not taken.
✓ Branch 68 → 69 taken 570 times.
✗ Branch 68 → 291 not taken.
570 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1147
8/14
✓ Branch 68 → 69 taken 570 times.
✗ Branch 68 → 291 not taken.
✓ Branch 69 → 70 taken 534 times.
✓ Branch 69 → 73 taken 36 times.
✓ Branch 70 → 71 taken 534 times.
✗ Branch 70 → 291 not taken.
✓ Branch 71 → 72 taken 534 times.
✗ Branch 71 → 73 not taken.
✓ Branch 74 → 75 taken 570 times.
✗ Branch 74 → 250 not taken.
✓ Branch 75 → 76 taken 570 times.
✗ Branch 75 → 250 not taken.
✓ Branch 76 → 77 taken 570 times.
✗ Branch 76 → 250 not taken.
570 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 2 case COMB(TY_SHORT, TY_DOUBLE): {
1154
2/4
✓ Branch 91 → 92 taken 2 times.
✗ Branch 91 → 291 not taken.
✓ Branch 92 → 93 taken 2 times.
✗ Branch 92 → 291 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1155
3/6
✓ Branch 93 → 94 taken 2 times.
✗ Branch 93 → 256 not taken.
✓ Branch 94 → 95 taken 2 times.
✗ Branch 94 → 256 not taken.
✓ Branch 95 → 96 taken 2 times.
✗ Branch 95 → 256 not taken.
2 return {.value = builder.CreateFAdd(lhsFP, rhsV())};
1156 }
1157 2 case COMB(TY_SHORT, TY_INT): {
1158
5/10
✓ Branch 97 → 98 taken 2 times.
✗ Branch 97 → 257 not taken.
✓ Branch 98 → 99 taken 2 times.
✗ Branch 98 → 257 not taken.
✓ Branch 99 → 100 taken 2 times.
✗ Branch 99 → 257 not taken.
✓ Branch 100 → 101 taken 2 times.
✗ Branch 100 → 257 not taken.
✓ Branch 101 → 102 taken 2 times.
✗ Branch 101 → 291 not taken.
2 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1159
7/14
✓ Branch 101 → 102 taken 2 times.
✗ Branch 101 → 291 not taken.
✓ Branch 102 → 103 taken 2 times.
✗ Branch 102 → 106 not taken.
✓ Branch 103 → 104 taken 2 times.
✗ Branch 103 → 291 not taken.
✓ Branch 104 → 105 taken 2 times.
✗ Branch 104 → 106 not taken.
✓ Branch 107 → 108 taken 2 times.
✗ Branch 107 → 258 not taken.
✓ Branch 108 → 109 taken 2 times.
✗ Branch 108 → 258 not taken.
✓ Branch 109 → 110 taken 2 times.
✗ Branch 109 → 258 not taken.
2 return {.value = builder.CreateAdd(lhsInt, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1160 }
1161 4 case COMB(TY_SHORT, TY_SHORT):
1162
8/16
✓ Branch 111 → 112 taken 4 times.
✗ Branch 111 → 291 not taken.
✓ Branch 112 → 113 taken 4 times.
✗ Branch 112 → 116 not taken.
✓ Branch 113 → 114 taken 4 times.
✗ Branch 113 → 291 not taken.
✓ Branch 114 → 115 taken 4 times.
✗ Branch 114 → 116 not taken.
✓ Branch 117 → 118 taken 4 times.
✗ Branch 117 → 259 not taken.
✓ Branch 118 → 119 taken 4 times.
✗ Branch 118 → 259 not taken.
✓ Branch 119 → 120 taken 4 times.
✗ Branch 119 → 259 not taken.
✓ Branch 120 → 121 taken 4 times.
✗ Branch 120 → 259 not taken.
4 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1163 2 case COMB(TY_SHORT, TY_LONG): {
1164
5/10
✓ Branch 122 → 123 taken 2 times.
✗ Branch 122 → 260 not taken.
✓ Branch 123 → 124 taken 2 times.
✗ Branch 123 → 260 not taken.
✓ Branch 124 → 125 taken 2 times.
✗ Branch 124 → 260 not taken.
✓ Branch 125 → 126 taken 2 times.
✗ Branch 125 → 260 not taken.
✓ Branch 126 → 127 taken 2 times.
✗ Branch 126 → 291 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1165
7/14
✓ Branch 126 → 127 taken 2 times.
✗ Branch 126 → 291 not taken.
✓ Branch 127 → 128 taken 2 times.
✗ Branch 127 → 131 not taken.
✓ Branch 128 → 129 taken 2 times.
✗ Branch 128 → 291 not taken.
✓ Branch 129 → 130 taken 2 times.
✗ Branch 129 → 131 not taken.
✓ Branch 132 → 133 taken 2 times.
✗ Branch 132 → 261 not taken.
✓ Branch 133 → 134 taken 2 times.
✗ Branch 133 → 261 not taken.
✓ Branch 134 → 135 taken 2 times.
✗ Branch 134 → 261 not taken.
2 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 4 case COMB(TY_LONG, TY_DOUBLE): {
1172
2/4
✓ Branch 149 → 150 taken 4 times.
✗ Branch 149 → 291 not taken.
✓ Branch 150 → 151 taken 4 times.
✗ Branch 150 → 291 not taken.
4 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1173
3/6
✓ Branch 151 → 152 taken 4 times.
✗ Branch 151 → 267 not taken.
✓ Branch 152 → 153 taken 4 times.
✗ Branch 152 → 267 not taken.
✓ Branch 153 → 154 taken 4 times.
✗ Branch 153 → 267 not taken.
4 return {.value = builder.CreateFAdd(lhsFP, rhsV())};
1174 }
1175 546 case COMB(TY_LONG, TY_INT): // fallthrough
1176 case COMB(TY_LONG, TY_SHORT): {
1177
5/10
✓ Branch 155 → 156 taken 546 times.
✗ Branch 155 → 268 not taken.
✓ Branch 156 → 157 taken 546 times.
✗ Branch 156 → 268 not taken.
✓ Branch 157 → 158 taken 546 times.
✗ Branch 157 → 268 not taken.
✓ Branch 158 → 159 taken 546 times.
✗ Branch 158 → 268 not taken.
✓ Branch 159 → 160 taken 546 times.
✗ Branch 159 → 291 not taken.
546 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1178
8/14
✓ Branch 159 → 160 taken 546 times.
✗ Branch 159 → 291 not taken.
✓ Branch 160 → 161 taken 438 times.
✓ Branch 160 → 164 taken 108 times.
✓ Branch 161 → 162 taken 438 times.
✗ Branch 161 → 291 not taken.
✓ Branch 162 → 163 taken 438 times.
✗ Branch 162 → 164 not taken.
✓ Branch 165 → 166 taken 546 times.
✗ Branch 165 → 269 not taken.
✓ Branch 166 → 167 taken 546 times.
✗ Branch 166 → 269 not taken.
✓ Branch 167 → 168 taken 546 times.
✗ Branch 167 → 269 not taken.
546 return {.value = builder.CreateAdd(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1179 }
1180 10305 case COMB(TY_LONG, TY_LONG):
1181
10/16
✓ Branch 169 → 170 taken 10305 times.
✗ Branch 169 → 291 not taken.
✓ Branch 170 → 171 taken 1458 times.
✓ Branch 170 → 174 taken 8847 times.
✓ Branch 171 → 172 taken 1458 times.
✗ Branch 171 → 291 not taken.
✓ Branch 172 → 173 taken 690 times.
✓ Branch 172 → 174 taken 768 times.
✓ Branch 175 → 176 taken 10305 times.
✗ Branch 175 → 270 not taken.
✓ Branch 176 → 177 taken 10305 times.
✗ Branch 176 → 270 not taken.
✓ Branch 177 → 178 taken 10305 times.
✗ Branch 177 → 270 not taken.
✓ Branch 178 → 179 taken 10305 times.
✗ Branch 178 → 270 not taken.
10305 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 2 case COMB(TY_BYTE, TY_BYTE): // fallthrough
1187 case COMB(TY_CHAR, TY_CHAR):
1188
6/16
✓ Branch 193 → 194 taken 2 times.
✗ Branch 193 → 291 not taken.
✗ Branch 194 → 195 not taken.
✓ Branch 194 → 198 taken 2 times.
✗ Branch 195 → 196 not taken.
✗ Branch 195 → 291 not taken.
✗ Branch 196 → 197 not taken.
✗ Branch 196 → 198 not taken.
✓ Branch 199 → 200 taken 2 times.
✗ Branch 199 → 276 not taken.
✓ Branch 200 → 201 taken 2 times.
✗ Branch 200 → 276 not taken.
✓ Branch 201 → 202 taken 2 times.
✗ Branch 201 → 276 not taken.
✓ Branch 202 → 203 taken 2 times.
✗ Branch 202 → 276 not taken.
2 return {.value = builder.CreateAdd(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1189 3720 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 3720 times.
✗ Branch 204 → 277 not taken.
✓ Branch 205 → 206 taken 3720 times.
✗ Branch 205 → 277 not taken.
✓ Branch 206 → 207 taken 3720 times.
✗ Branch 206 → 277 not taken.
✓ Branch 207 → 208 taken 3720 times.
✗ Branch 207 → 277 not taken.
✓ Branch 208 → 209 taken 3720 times.
✗ Branch 208 → 277 not taken.
3720 llvm::Value *rhsExt = builder.CreateIntCast(rhsV(), builder.getInt64Ty(), rhsSTy.isSigned());
1193
4/8
✓ Branch 212 → 213 taken 3720 times.
✗ Branch 212 → 279 not taken.
✓ Branch 213 → 214 taken 3720 times.
✗ Branch 213 → 278 not taken.
✓ Branch 214 → 215 taken 3720 times.
✗ Branch 214 → 278 not taken.
✓ Branch 215 → 216 taken 3720 times.
✗ Branch 215 → 278 not taken.
7440 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 1246 times.
✗ Branch 12 → 237 not taken.
✓ Branch 13 → 14 taken 1246 times.
✗ Branch 13 → 237 not taken.
✓ Branch 14 → 15 taken 1246 times.
✗ Branch 14 → 237 not taken.
✓ Branch 15 → 16 taken 1246 times.
✗ Branch 15 → 237 not taken.
✓ Branch 16 → 17 taken 1246 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.
18790 }
1199
1200 10102 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 10102 times.
✗ Branch 2 → 233 not taken.
20204 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1203
1/2
✓ Branch 3 → 4 taken 10102 times.
✗ Branch 3 → 234 not taken.
20204 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1204 10102 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1205 10102 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1206
1/2
✓ Branch 6 → 7 taken 10102 times.
✗ Branch 6 → 235 not taken.
10102 lhsSTy = lhsSTy.removeReferenceWrapper();
1207
1/2
✓ Branch 7 → 8 taken 10102 times.
✗ Branch 7 → 236 not taken.
10102 rhsSTy = rhsSTy.removeReferenceWrapper();
1208
1/2
✓ Branch 8 → 9 taken 10102 times.
✗ Branch 8 → 294 not taken.
10102 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1209
1/2
✓ Branch 9 → 10 taken 10102 times.
✗ Branch 9 → 294 not taken.
10102 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1210
1211 // Handle operator overloads
1212
3/4
✓ Branch 10 → 11 taken 10102 times.
✗ Branch 10 → 294 not taken.
✓ Branch 11 → 12 taken 2 times.
✓ Branch 11 → 20 taken 10100 times.
10102 if (callsOverloadedOpFct(node, opIdx))
1213 2 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1214
1215
16/21
✓ Branch 20 → 21 taken 10100 times.
✗ Branch 20 → 294 not taken.
✓ Branch 21 → 22 taken 184 times.
✓ Branch 21 → 27 taken 28 times.
✓ Branch 21 → 33 taken 2 times.
✓ Branch 21 → 39 taken 284 times.
✓ Branch 21 → 50 taken 2 times.
✓ Branch 21 → 64 taken 2 times.
✗ Branch 21 → 78 not taken.
✓ Branch 21 → 91 taken 2 times.
✓ Branch 21 → 97 taken 2 times.
✓ Branch 21 → 111 taken 10 times.
✓ Branch 21 → 122 taken 10 times.
✗ Branch 21 → 136 not taken.
✓ Branch 21 → 149 taken 2 times.
✓ Branch 21 → 155 taken 370 times.
✓ Branch 21 → 169 taken 8836 times.
✗ Branch 21 → 180 not taken.
✓ Branch 21 → 193 taken 2 times.
✓ Branch 21 → 204 taken 364 times.
✗ Branch 21 → 219 not taken.
10100 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1216 184 case COMB(TY_DOUBLE, TY_DOUBLE):
1217
4/8
✓ Branch 22 → 23 taken 184 times.
✗ Branch 22 → 245 not taken.
✓ Branch 23 → 24 taken 184 times.
✗ Branch 23 → 245 not taken.
✓ Branch 24 → 25 taken 184 times.
✗ Branch 24 → 245 not taken.
✓ Branch 25 → 26 taken 184 times.
✗ Branch 25 → 245 not taken.
184 return {.value = builder.CreateFSub(lhsV(), rhsV())};
1218 28 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 28 times.
✗ Branch 27 → 294 not taken.
✓ Branch 28 → 29 taken 28 times.
✗ Branch 28 → 294 not taken.
28 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
1222
3/6
✓ Branch 29 → 30 taken 28 times.
✗ Branch 29 → 246 not taken.
✓ Branch 30 → 31 taken 28 times.
✗ Branch 30 → 246 not taken.
✓ Branch 31 → 32 taken 28 times.
✗ Branch 31 → 246 not taken.
28 return {.value = builder.CreateFSub(lhsV(), rhsFP)};
1223 }
1224 2 case COMB(TY_INT, TY_DOUBLE): {
1225
2/4
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 294 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 294 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1226
3/6
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 247 not taken.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 247 not taken.
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 247 not taken.
2 return {.value = builder.CreateFSub(lhsFP, rhsV())};
1227 }
1228 284 case COMB(TY_INT, TY_INT):
1229
10/16
✓ Branch 39 → 40 taken 284 times.
✗ Branch 39 → 294 not taken.
✓ Branch 40 → 41 taken 220 times.
✓ Branch 40 → 44 taken 64 times.
✓ Branch 41 → 42 taken 220 times.
✗ Branch 41 → 294 not taken.
✓ Branch 42 → 43 taken 204 times.
✓ Branch 42 → 44 taken 16 times.
✓ Branch 45 → 46 taken 284 times.
✗ Branch 45 → 248 not taken.
✓ Branch 46 → 47 taken 284 times.
✗ Branch 46 → 248 not taken.
✓ Branch 47 → 48 taken 284 times.
✗ Branch 47 → 248 not taken.
✓ Branch 48 → 49 taken 284 times.
✗ Branch 48 → 248 not taken.
284 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1230 2 case COMB(TY_INT, TY_SHORT): {
1231
5/10
✓ Branch 50 → 51 taken 2 times.
✗ Branch 50 → 249 not taken.
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 249 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 249 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 249 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 294 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1232
7/14
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 294 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 59 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 294 not taken.
✓ Branch 57 → 58 taken 2 times.
✗ Branch 57 → 59 not taken.
✓ Branch 60 → 61 taken 2 times.
✗ Branch 60 → 250 not taken.
✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 250 not taken.
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 250 not taken.
2 return {.value = builder.CreateSub(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1233 }
1234 2 case COMB(TY_INT, TY_LONG): {
1235
5/10
✓ Branch 64 → 65 taken 2 times.
✗ Branch 64 → 251 not taken.
✓ Branch 65 → 66 taken 2 times.
✗ Branch 65 → 251 not taken.
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 251 not taken.
✓ Branch 67 → 68 taken 2 times.
✗ Branch 67 → 251 not taken.
✓ Branch 68 → 69 taken 2 times.
✗ Branch 68 → 294 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1236
7/14
✓ Branch 68 → 69 taken 2 times.
✗ Branch 68 → 294 not taken.
✓ Branch 69 → 70 taken 2 times.
✗ Branch 69 → 73 not taken.
✓ Branch 70 → 71 taken 2 times.
✗ Branch 70 → 294 not taken.
✓ Branch 71 → 72 taken 2 times.
✗ Branch 71 → 73 not taken.
✓ Branch 74 → 75 taken 2 times.
✗ Branch 74 → 252 not taken.
✓ Branch 75 → 76 taken 2 times.
✗ Branch 75 → 252 not taken.
✓ Branch 76 → 77 taken 2 times.
✗ Branch 76 → 252 not taken.
2 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 2 case COMB(TY_SHORT, TY_DOUBLE): {
1243
2/4
✓ Branch 91 → 92 taken 2 times.
✗ Branch 91 → 294 not taken.
✓ Branch 92 → 93 taken 2 times.
✗ Branch 92 → 294 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1244
3/6
✓ Branch 93 → 94 taken 2 times.
✗ Branch 93 → 258 not taken.
✓ Branch 94 → 95 taken 2 times.
✗ Branch 94 → 258 not taken.
✓ Branch 95 → 96 taken 2 times.
✗ Branch 95 → 258 not taken.
2 return {.value = builder.CreateFSub(lhsFP, rhsV())};
1245 }
1246 2 case COMB(TY_SHORT, TY_INT): {
1247
5/10
✓ Branch 97 → 98 taken 2 times.
✗ Branch 97 → 259 not taken.
✓ Branch 98 → 99 taken 2 times.
✗ Branch 98 → 259 not taken.
✓ Branch 99 → 100 taken 2 times.
✗ Branch 99 → 259 not taken.
✓ Branch 100 → 101 taken 2 times.
✗ Branch 100 → 259 not taken.
✓ Branch 101 → 102 taken 2 times.
✗ Branch 101 → 294 not taken.
2 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1248
7/14
✓ Branch 101 → 102 taken 2 times.
✗ Branch 101 → 294 not taken.
✓ Branch 102 → 103 taken 2 times.
✗ Branch 102 → 106 not taken.
✓ Branch 103 → 104 taken 2 times.
✗ Branch 103 → 294 not taken.
✓ Branch 104 → 105 taken 2 times.
✗ Branch 104 → 106 not taken.
✓ Branch 107 → 108 taken 2 times.
✗ Branch 107 → 260 not taken.
✓ Branch 108 → 109 taken 2 times.
✗ Branch 108 → 260 not taken.
✓ Branch 109 → 110 taken 2 times.
✗ Branch 109 → 260 not taken.
2 return {.value = builder.CreateSub(lhsInt, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1249 }
1250 10 case COMB(TY_SHORT, TY_SHORT):
1251
8/16
✓ Branch 111 → 112 taken 10 times.
✗ Branch 111 → 294 not taken.
✓ Branch 112 → 113 taken 10 times.
✗ Branch 112 → 116 not taken.
✓ Branch 113 → 114 taken 10 times.
✗ Branch 113 → 294 not taken.
✓ Branch 114 → 115 taken 10 times.
✗ Branch 114 → 116 not taken.
✓ Branch 117 → 118 taken 10 times.
✗ Branch 117 → 261 not taken.
✓ Branch 118 → 119 taken 10 times.
✗ Branch 118 → 261 not taken.
✓ Branch 119 → 120 taken 10 times.
✗ Branch 119 → 261 not taken.
✓ Branch 120 → 121 taken 10 times.
✗ Branch 120 → 261 not taken.
10 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1252 10 case COMB(TY_SHORT, TY_LONG): {
1253
5/10
✓ Branch 122 → 123 taken 10 times.
✗ Branch 122 → 262 not taken.
✓ Branch 123 → 124 taken 10 times.
✗ Branch 123 → 262 not taken.
✓ Branch 124 → 125 taken 10 times.
✗ Branch 124 → 262 not taken.
✓ Branch 125 → 126 taken 10 times.
✗ Branch 125 → 262 not taken.
✓ Branch 126 → 127 taken 10 times.
✗ Branch 126 → 294 not taken.
10 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1254
7/14
✓ Branch 126 → 127 taken 10 times.
✗ Branch 126 → 294 not taken.
✓ Branch 127 → 128 taken 10 times.
✗ Branch 127 → 131 not taken.
✓ Branch 128 → 129 taken 10 times.
✗ Branch 128 → 294 not taken.
✓ Branch 129 → 130 taken 10 times.
✗ Branch 129 → 131 not taken.
✓ Branch 132 → 133 taken 10 times.
✗ Branch 132 → 263 not taken.
✓ Branch 133 → 134 taken 10 times.
✗ Branch 133 → 263 not taken.
✓ Branch 134 → 135 taken 10 times.
✗ Branch 134 → 263 not taken.
10 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 2 case COMB(TY_LONG, TY_DOUBLE): {
1261
2/4
✓ Branch 149 → 150 taken 2 times.
✗ Branch 149 → 294 not taken.
✓ Branch 150 → 151 taken 2 times.
✗ Branch 150 → 294 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1262
3/6
✓ Branch 151 → 152 taken 2 times.
✗ Branch 151 → 269 not taken.
✓ Branch 152 → 153 taken 2 times.
✗ Branch 152 → 269 not taken.
✓ Branch 153 → 154 taken 2 times.
✗ Branch 153 → 269 not taken.
2 return {.value = builder.CreateFSub(lhsFP, rhsV())};
1263 }
1264 370 case COMB(TY_LONG, TY_INT): // fallthrough
1265 case COMB(TY_LONG, TY_SHORT): {
1266
5/10
✓ Branch 155 → 156 taken 370 times.
✗ Branch 155 → 270 not taken.
✓ Branch 156 → 157 taken 370 times.
✗ Branch 156 → 270 not taken.
✓ Branch 157 → 158 taken 370 times.
✗ Branch 157 → 270 not taken.
✓ Branch 158 → 159 taken 370 times.
✗ Branch 158 → 270 not taken.
✓ Branch 159 → 160 taken 370 times.
✗ Branch 159 → 294 not taken.
370 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1267
8/14
✓ Branch 159 → 160 taken 370 times.
✗ Branch 159 → 294 not taken.
✓ Branch 160 → 161 taken 48 times.
✓ Branch 160 → 164 taken 322 times.
✓ Branch 161 → 162 taken 48 times.
✗ Branch 161 → 294 not taken.
✓ Branch 162 → 163 taken 48 times.
✗ Branch 162 → 164 not taken.
✓ Branch 165 → 166 taken 370 times.
✗ Branch 165 → 271 not taken.
✓ Branch 166 → 167 taken 370 times.
✗ Branch 166 → 271 not taken.
✓ Branch 167 → 168 taken 370 times.
✗ Branch 167 → 271 not taken.
370 return {.value = builder.CreateSub(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1268 }
1269 8836 case COMB(TY_LONG, TY_LONG):
1270
10/16
✓ Branch 169 → 170 taken 8836 times.
✗ Branch 169 → 294 not taken.
✓ Branch 170 → 171 taken 994 times.
✓ Branch 170 → 174 taken 7842 times.
✓ Branch 171 → 172 taken 994 times.
✗ Branch 171 → 294 not taken.
✓ Branch 172 → 173 taken 252 times.
✓ Branch 172 → 174 taken 742 times.
✓ Branch 175 → 176 taken 8836 times.
✗ Branch 175 → 272 not taken.
✓ Branch 176 → 177 taken 8836 times.
✗ Branch 176 → 272 not taken.
✓ Branch 177 → 178 taken 8836 times.
✗ Branch 177 → 272 not taken.
✓ Branch 178 → 179 taken 8836 times.
✗ Branch 178 → 272 not taken.
8836 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 2 case COMB(TY_BYTE, TY_BYTE): // fallthrough
1276 case COMB(TY_CHAR, TY_CHAR):
1277
6/16
✓ Branch 193 → 194 taken 2 times.
✗ Branch 193 → 294 not taken.
✗ Branch 194 → 195 not taken.
✓ Branch 194 → 198 taken 2 times.
✗ Branch 195 → 196 not taken.
✗ Branch 195 → 294 not taken.
✗ Branch 196 → 197 not taken.
✗ Branch 196 → 198 not taken.
✓ Branch 199 → 200 taken 2 times.
✗ Branch 199 → 278 not taken.
✓ Branch 200 → 201 taken 2 times.
✗ Branch 200 → 278 not taken.
✓ Branch 201 → 202 taken 2 times.
✗ Branch 201 → 278 not taken.
✓ Branch 202 → 203 taken 2 times.
✗ Branch 202 → 278 not taken.
2 return {.value = builder.CreateSub(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1278 364 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 364 times.
✗ Branch 204 → 279 not taken.
✓ Branch 205 → 206 taken 364 times.
✗ Branch 205 → 279 not taken.
✓ Branch 206 → 207 taken 364 times.
✗ Branch 206 → 279 not taken.
✓ Branch 207 → 208 taken 364 times.
✗ Branch 207 → 280 not taken.
364 llvm::Value *rhsNeg = builder.CreateNeg(rhsV());
1282
4/8
✓ Branch 207 → 208 taken 364 times.
✗ Branch 207 → 280 not taken.
✓ Branch 208 → 209 taken 364 times.
✗ Branch 208 → 280 not taken.
✓ Branch 209 → 210 taken 364 times.
✗ Branch 209 → 280 not taken.
✓ Branch 210 → 211 taken 364 times.
✗ Branch 210 → 280 not taken.
364 llvm::Value *rhsExt = builder.CreateIntCast(rhsNeg, builder.getInt64Ty(), rhsSTy.isSigned());
1283
4/8
✓ Branch 214 → 215 taken 364 times.
✗ Branch 214 → 282 not taken.
✓ Branch 215 → 216 taken 364 times.
✗ Branch 215 → 281 not taken.
✓ Branch 216 → 217 taken 364 times.
✗ Branch 216 → 281 not taken.
✓ Branch 217 → 218 taken 364 times.
✗ Branch 217 → 281 not taken.
728 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 2 times.
✗ Branch 12 → 239 not taken.
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 239 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 239 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 239 not taken.
✓ Branch 16 → 17 taken 2 times.
✗ 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.
10104 }
1289
1290 4793 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 4793 times.
✗ Branch 2 → 168 not taken.
9576 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1293
1/2
✓ Branch 3 → 4 taken 4793 times.
✗ Branch 3 → 169 not taken.
9580 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1294 4803 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1295 4799 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1296
1/2
✓ Branch 6 → 7 taken 4793 times.
✗ Branch 6 → 170 not taken.
4793 lhsSTy = lhsSTy.removeReferenceWrapper();
1297
1/2
✓ Branch 7 → 8 taken 4793 times.
✗ Branch 7 → 171 not taken.
4793 rhsSTy = rhsSTy.removeReferenceWrapper();
1298
1/2
✓ Branch 8 → 9 taken 4793 times.
✗ Branch 8 → 207 not taken.
4793 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1299
1/2
✓ Branch 9 → 10 taken 4793 times.
✗ Branch 9 → 207 not taken.
4793 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1300
1301 // Handle operator overloads
1302
3/4
✓ Branch 10 → 11 taken 4793 times.
✗ Branch 10 → 207 not taken.
✓ Branch 11 → 12 taken 18 times.
✓ Branch 11 → 20 taken 4775 times.
4793 if (callsOverloadedOpFct(node, opIdx))
1303 18 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1304
1305
14/16
✓ Branch 20 → 21 taken 4775 times.
✗ Branch 20 → 207 not taken.
✓ Branch 21 → 22 taken 356 times.
✓ Branch 21 → 27 taken 16 times.
✓ Branch 21 → 33 taken 2 times.
✓ Branch 21 → 39 taken 275 times.
✓ Branch 21 → 50 taken 2 times.
✓ Branch 21 → 64 taken 2 times.
✓ Branch 21 → 78 taken 2 times.
✓ Branch 21 → 84 taken 2 times.
✓ Branch 21 → 98 taken 2 times.
✓ Branch 21 → 109 taken 2 times.
✓ Branch 21 → 123 taken 2 times.
✓ Branch 21 → 129 taken 1546 times.
✓ Branch 21 → 143 taken 2566 times.
✗ Branch 21 → 154 not taken.
4775 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1306 356 case COMB(TY_DOUBLE, TY_DOUBLE):
1307
4/8
✓ Branch 22 → 23 taken 356 times.
✗ Branch 22 → 180 not taken.
✓ Branch 23 → 24 taken 356 times.
✗ Branch 23 → 180 not taken.
✓ Branch 24 → 25 taken 356 times.
✗ Branch 24 → 180 not taken.
✓ Branch 25 → 26 taken 356 times.
✗ Branch 25 → 180 not taken.
356 return {.value = builder.CreateFMul(lhsV(), rhsV())};
1308 16 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 16 times.
✗ Branch 27 → 207 not taken.
✓ Branch 28 → 29 taken 16 times.
✗ Branch 28 → 207 not taken.
16 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
1312
3/6
✓ Branch 29 → 30 taken 16 times.
✗ Branch 29 → 181 not taken.
✓ Branch 30 → 31 taken 16 times.
✗ Branch 30 → 181 not taken.
✓ Branch 31 → 32 taken 16 times.
✗ Branch 31 → 181 not taken.
16 return {.value = builder.CreateFMul(lhsV(), rhsFP)};
1313 }
1314 2 case COMB(TY_INT, TY_DOUBLE): {
1315
2/4
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 207 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 207 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1316
3/6
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 182 not taken.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 182 not taken.
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 182 not taken.
2 return {.value = builder.CreateFMul(lhsFP, rhsV())};
1317 }
1318 275 case COMB(TY_INT, TY_INT):
1319
10/16
✓ Branch 39 → 40 taken 275 times.
✗ Branch 39 → 207 not taken.
✓ Branch 40 → 41 taken 253 times.
✓ Branch 40 → 44 taken 22 times.
✓ Branch 41 → 42 taken 253 times.
✗ Branch 41 → 207 not taken.
✓ Branch 42 → 43 taken 147 times.
✓ Branch 42 → 44 taken 106 times.
✓ Branch 45 → 46 taken 275 times.
✗ Branch 45 → 183 not taken.
✓ Branch 46 → 47 taken 275 times.
✗ Branch 46 → 183 not taken.
✓ Branch 47 → 48 taken 275 times.
✗ Branch 47 → 183 not taken.
✓ Branch 48 → 49 taken 275 times.
✗ Branch 48 → 183 not taken.
275 return {.value = builder.CreateMul(lhsV(), rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1320 2 case COMB(TY_INT, TY_SHORT): {
1321
5/10
✓ Branch 50 → 51 taken 2 times.
✗ Branch 50 → 184 not taken.
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 184 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 184 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 184 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 207 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1322
7/14
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 207 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 59 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 207 not taken.
✓ Branch 57 → 58 taken 2 times.
✗ Branch 57 → 59 not taken.
✓ Branch 60 → 61 taken 2 times.
✗ Branch 60 → 185 not taken.
✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 185 not taken.
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 185 not taken.
2 return {.value = builder.CreateMul(lhsV(), rhsInt, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1323 }
1324 2 case COMB(TY_INT, TY_LONG): {
1325
5/10
✓ Branch 64 → 65 taken 2 times.
✗ Branch 64 → 186 not taken.
✓ Branch 65 → 66 taken 2 times.
✗ Branch 65 → 186 not taken.
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 186 not taken.
✓ Branch 67 → 68 taken 2 times.
✗ Branch 67 → 186 not taken.
✓ Branch 68 → 69 taken 2 times.
✗ Branch 68 → 207 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1326
7/14
✓ Branch 68 → 69 taken 2 times.
✗ Branch 68 → 207 not taken.
✓ Branch 69 → 70 taken 2 times.
✗ Branch 69 → 73 not taken.
✓ Branch 70 → 71 taken 2 times.
✗ Branch 70 → 207 not taken.
✓ Branch 71 → 72 taken 2 times.
✗ Branch 71 → 73 not taken.
✓ Branch 74 → 75 taken 2 times.
✗ Branch 74 → 187 not taken.
✓ Branch 75 → 76 taken 2 times.
✗ Branch 75 → 187 not taken.
✓ Branch 76 → 77 taken 2 times.
✗ Branch 76 → 187 not taken.
2 return {.value = builder.CreateMul(lhsLong, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1327 }
1328 2 case COMB(TY_SHORT, TY_DOUBLE): {
1329
2/4
✓ Branch 78 → 79 taken 2 times.
✗ Branch 78 → 207 not taken.
✓ Branch 79 → 80 taken 2 times.
✗ Branch 79 → 207 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1330
3/6
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 188 not taken.
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 188 not taken.
✓ Branch 82 → 83 taken 2 times.
✗ Branch 82 → 188 not taken.
2 return {.value = builder.CreateFMul(lhsFP, rhsV())};
1331 }
1332 2 case COMB(TY_SHORT, TY_INT): {
1333
5/10
✓ Branch 84 → 85 taken 2 times.
✗ Branch 84 → 189 not taken.
✓ Branch 85 → 86 taken 2 times.
✗ Branch 85 → 189 not taken.
✓ Branch 86 → 87 taken 2 times.
✗ Branch 86 → 189 not taken.
✓ Branch 87 → 88 taken 2 times.
✗ Branch 87 → 189 not taken.
✓ Branch 88 → 89 taken 2 times.
✗ Branch 88 → 207 not taken.
2 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1334
7/14
✓ Branch 88 → 89 taken 2 times.
✗ Branch 88 → 207 not taken.
✓ Branch 89 → 90 taken 2 times.
✗ Branch 89 → 93 not taken.
✓ Branch 90 → 91 taken 2 times.
✗ Branch 90 → 207 not taken.
✓ Branch 91 → 92 taken 2 times.
✗ Branch 91 → 93 not taken.
✓ Branch 94 → 95 taken 2 times.
✗ Branch 94 → 190 not taken.
✓ Branch 95 → 96 taken 2 times.
✗ Branch 95 → 190 not taken.
✓ Branch 96 → 97 taken 2 times.
✗ Branch 96 → 190 not taken.
2 return {.value = builder.CreateMul(lhsInt, rhsV(), "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1335 }
1336 2 case COMB(TY_SHORT, TY_SHORT):
1337
8/16
✓ Branch 98 → 99 taken 2 times.
✗ Branch 98 → 207 not taken.
✓ Branch 99 → 100 taken 2 times.
✗ Branch 99 → 103 not taken.
✓ Branch 100 → 101 taken 2 times.
✗ Branch 100 → 207 not taken.
✓ Branch 101 → 102 taken 2 times.
✗ Branch 101 → 103 not taken.
✓ Branch 104 → 105 taken 2 times.
✗ Branch 104 → 191 not taken.
✓ Branch 105 → 106 taken 2 times.
✗ Branch 105 → 191 not taken.
✓ Branch 106 → 107 taken 2 times.
✗ Branch 106 → 191 not taken.
✓ Branch 107 → 108 taken 2 times.
✗ Branch 107 → 191 not taken.
2 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
7/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 2 times.
✗ Branch 116 → 118 not taken.
✓ 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 2 case COMB(TY_LONG, TY_DOUBLE): {
1343
2/4
✓ Branch 123 → 124 taken 2 times.
✗ Branch 123 → 207 not taken.
✓ Branch 124 → 125 taken 2 times.
✗ Branch 124 → 207 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1344
3/6
✓ Branch 125 → 126 taken 2 times.
✗ Branch 125 → 194 not taken.
✓ Branch 126 → 127 taken 2 times.
✗ Branch 126 → 194 not taken.
✓ Branch 127 → 128 taken 2 times.
✗ Branch 127 → 194 not taken.
2 return {.value = builder.CreateFMul(lhsFP, rhsV())};
1345 }
1346 1546 case COMB(TY_LONG, TY_INT): // fallthrough
1347 case COMB(TY_LONG, TY_SHORT): {
1348
5/10
✓ Branch 129 → 130 taken 1546 times.
✗ Branch 129 → 195 not taken.
✓ Branch 130 → 131 taken 1546 times.
✗ Branch 130 → 195 not taken.
✓ Branch 131 → 132 taken 1546 times.
✗ Branch 131 → 195 not taken.
✓ Branch 132 → 133 taken 1546 times.
✗ Branch 132 → 195 not taken.
✓ Branch 133 → 134 taken 1546 times.
✗ Branch 133 → 207 not taken.
1546 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1349
8/14
✓ Branch 133 → 134 taken 1546 times.
✗ Branch 133 → 207 not taken.
✓ Branch 134 → 135 taken 10 times.
✓ Branch 134 → 138 taken 1536 times.
✓ Branch 135 → 136 taken 10 times.
✗ Branch 135 → 207 not taken.
✓ Branch 136 → 137 taken 10 times.
✗ Branch 136 → 138 not taken.
✓ Branch 139 → 140 taken 1546 times.
✗ Branch 139 → 196 not taken.
✓ Branch 140 → 141 taken 1546 times.
✗ Branch 140 → 196 not taken.
✓ Branch 141 → 142 taken 1546 times.
✗ Branch 141 → 196 not taken.
1546 return {.value = builder.CreateMul(lhsV(), rhsLong, "", false, lhsSTy.isSigned() && rhsSTy.isSigned())};
1350 }
1351 2566 case COMB(TY_LONG, TY_LONG): // fallthrough
1352 case COMB(TY_BYTE, TY_BYTE):
1353
10/16
✓ Branch 143 → 144 taken 2566 times.
✗ Branch 143 → 207 not taken.
✓ Branch 144 → 145 taken 968 times.
✓ Branch 144 → 148 taken 1598 times.
✓ Branch 145 → 146 taken 968 times.
✗ Branch 145 → 207 not taken.
✓ Branch 146 → 147 taken 284 times.
✓ Branch 146 → 148 taken 684 times.
✓ Branch 149 → 150 taken 2566 times.
✗ Branch 149 → 197 not taken.
✓ Branch 150 → 151 taken 2566 times.
✗ Branch 150 → 197 not taken.
✓ Branch 151 → 152 taken 2566 times.
✗ Branch 151 → 197 not taken.
✓ Branch 152 → 153 taken 2566 times.
✗ Branch 152 → 197 not taken.
2566 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 18 times.
✗ Branch 12 → 174 not taken.
✓ Branch 13 → 14 taken 18 times.
✗ Branch 13 → 174 not taken.
✓ Branch 14 → 15 taken 18 times.
✗ Branch 14 → 174 not taken.
✓ Branch 15 → 16 taken 18 times.
✗ Branch 15 → 174 not taken.
✓ Branch 16 → 17 taken 18 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.
4811 }
1358
1359 980 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 980 times.
✗ Branch 2 → 120 not taken.
1952 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1362
1/2
✓ Branch 3 → 4 taken 980 times.
✗ Branch 3 → 121 not taken.
1960 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1363 988 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1364 980 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1365
1/2
✓ Branch 6 → 7 taken 980 times.
✗ Branch 6 → 122 not taken.
980 lhsSTy = lhsSTy.removeReferenceWrapper();
1366
1/2
✓ Branch 7 → 8 taken 980 times.
✗ Branch 7 → 123 not taken.
980 rhsSTy = rhsSTy.removeReferenceWrapper();
1367
1/2
✓ Branch 8 → 9 taken 980 times.
✗ Branch 8 → 159 not taken.
980 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1368
1/2
✓ Branch 9 → 10 taken 980 times.
✗ Branch 9 → 159 not taken.
980 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1369
1370 // Handle operator overloads
1371
3/4
✓ Branch 10 → 11 taken 980 times.
✗ Branch 10 → 159 not taken.
✓ Branch 11 → 12 taken 10 times.
✓ Branch 11 → 20 taken 970 times.
980 if (callsOverloadedOpFct(node, opIdx))
1372 10 return callOperatorOverloadFct<2>(node, {lhsV, lhsP, rhsV, rhsP}, opIdx);
1373
1374
14/16
✓ Branch 20 → 21 taken 970 times.
✗ Branch 20 → 159 not taken.
✓ Branch 21 → 22 taken 550 times.
✓ Branch 21 → 27 taken 16 times.
✓ Branch 21 → 33 taken 22 times.
✓ Branch 21 → 39 taken 16 times.
✓ Branch 21 → 44 taken 2 times.
✓ Branch 21 → 52 taken 2 times.
✓ Branch 21 → 60 taken 2 times.
✓ Branch 21 → 66 taken 6 times.
✓ Branch 21 → 74 taken 2 times.
✓ Branch 21 → 79 taken 2 times.
✓ Branch 21 → 87 taken 6 times.
✓ Branch 21 → 93 taken 32 times.
✓ Branch 21 → 101 taken 312 times.
✗ Branch 21 → 106 not taken.
970 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1375 550 case COMB(TY_DOUBLE, TY_DOUBLE):
1376
4/8
✓ Branch 22 → 23 taken 550 times.
✗ Branch 22 → 132 not taken.
✓ Branch 23 → 24 taken 550 times.
✗ Branch 23 → 132 not taken.
✓ Branch 24 → 25 taken 550 times.
✗ Branch 24 → 132 not taken.
✓ Branch 25 → 26 taken 550 times.
✗ Branch 25 → 132 not taken.
550 return {.value = builder.CreateFDiv(lhsV(), rhsV())};
1377 16 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 16 times.
✗ Branch 27 → 159 not taken.
✓ Branch 28 → 29 taken 16 times.
✗ Branch 28 → 159 not taken.
16 llvm::Value *rhsFP = generateIToFp(rhsSTy, rhsV(), lhsT);
1381
3/6
✓ Branch 29 → 30 taken 16 times.
✗ Branch 29 → 133 not taken.
✓ Branch 30 → 31 taken 16 times.
✗ Branch 30 → 133 not taken.
✓ Branch 31 → 32 taken 16 times.
✗ Branch 31 → 133 not taken.
16 return {.value = builder.CreateFDiv(lhsV(), rhsFP)};
1382 }
1383 22 case COMB(TY_INT, TY_DOUBLE): {
1384
2/4
✓ Branch 33 → 34 taken 22 times.
✗ Branch 33 → 159 not taken.
✓ Branch 34 → 35 taken 22 times.
✗ Branch 34 → 159 not taken.
22 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1385
3/6
✓ Branch 35 → 36 taken 22 times.
✗ Branch 35 → 134 not taken.
✓ Branch 36 → 37 taken 22 times.
✗ Branch 36 → 134 not taken.
✓ Branch 37 → 38 taken 22 times.
✗ Branch 37 → 134 not taken.
22 return {.value = builder.CreateFDiv(lhsFP, rhsV())};
1386 }
1387 16 case COMB(TY_INT, TY_INT):
1388
4/8
✓ Branch 39 → 40 taken 16 times.
✗ Branch 39 → 135 not taken.
✓ Branch 40 → 41 taken 16 times.
✗ Branch 40 → 135 not taken.
✓ Branch 41 → 42 taken 16 times.
✗ Branch 41 → 135 not taken.
✓ Branch 42 → 43 taken 16 times.
✗ Branch 42 → 135 not taken.
16 return {.value = builder.CreateSDiv(lhsV(), rhsV())};
1389 2 case COMB(TY_INT, TY_SHORT): {
1390
5/10
✓ Branch 44 → 45 taken 2 times.
✗ Branch 44 → 136 not taken.
✓ Branch 45 → 46 taken 2 times.
✗ Branch 45 → 136 not taken.
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 136 not taken.
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 136 not taken.
✓ Branch 48 → 49 taken 2 times.
✗ Branch 48 → 137 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1391
3/6
✓ Branch 48 → 49 taken 2 times.
✗ Branch 48 → 137 not taken.
✓ Branch 49 → 50 taken 2 times.
✗ Branch 49 → 137 not taken.
✓ Branch 50 → 51 taken 2 times.
✗ Branch 50 → 137 not taken.
2 return {.value = builder.CreateSDiv(lhsV(), rhsInt)};
1392 }
1393 2 case COMB(TY_INT, TY_LONG): {
1394
5/10
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 138 not taken.
✓ Branch 53 → 54 taken 2 times.
✗ Branch 53 → 138 not taken.
✓ Branch 54 → 55 taken 2 times.
✗ Branch 54 → 138 not taken.
✓ Branch 55 → 56 taken 2 times.
✗ Branch 55 → 138 not taken.
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 139 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1395
3/6
✓ Branch 56 → 57 taken 2 times.
✗ Branch 56 → 139 not taken.
✓ Branch 57 → 58 taken 2 times.
✗ Branch 57 → 139 not taken.
✓ Branch 58 → 59 taken 2 times.
✗ Branch 58 → 139 not taken.
2 return {.value = builder.CreateSDiv(lhsLong, rhsV())};
1396 }
1397 2 case COMB(TY_SHORT, TY_DOUBLE): {
1398
2/4
✓ Branch 60 → 61 taken 2 times.
✗ Branch 60 → 159 not taken.
✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 159 not taken.
2 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1399
3/6
✓ Branch 62 → 63 taken 2 times.
✗ Branch 62 → 140 not taken.
✓ Branch 63 → 64 taken 2 times.
✗ Branch 63 → 140 not taken.
✓ Branch 64 → 65 taken 2 times.
✗ Branch 64 → 140 not taken.
2 return {.value = builder.CreateFDiv(lhsFP, rhsV())};
1400 }
1401 6 case COMB(TY_SHORT, TY_INT): {
1402
5/10
✓ Branch 66 → 67 taken 6 times.
✗ Branch 66 → 141 not taken.
✓ Branch 67 → 68 taken 6 times.
✗ Branch 67 → 141 not taken.
✓ Branch 68 → 69 taken 6 times.
✗ Branch 68 → 141 not taken.
✓ Branch 69 → 70 taken 6 times.
✗ Branch 69 → 141 not taken.
✓ Branch 70 → 71 taken 6 times.
✗ Branch 70 → 142 not taken.
6 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1403
3/6
✓ Branch 70 → 71 taken 6 times.
✗ Branch 70 → 142 not taken.
✓ Branch 71 → 72 taken 6 times.
✗ Branch 71 → 142 not taken.
✓ Branch 72 → 73 taken 6 times.
✗ Branch 72 → 142 not taken.
6 return {.value = builder.CreateSDiv(lhsInt, rhsV())};
1404 }
1405 2 case COMB(TY_SHORT, TY_SHORT):
1406
4/8
✓ Branch 74 → 75 taken 2 times.
✗ Branch 74 → 143 not taken.
✓ Branch 75 → 76 taken 2 times.
✗ Branch 75 → 143 not taken.
✓ Branch 76 → 77 taken 2 times.
✗ Branch 76 → 143 not taken.
✓ Branch 77 → 78 taken 2 times.
✗ Branch 77 → 143 not taken.
2 return {.value = builder.CreateSDiv(lhsV(), rhsV())};
1407 2 case COMB(TY_SHORT, TY_LONG): {
1408
5/10
✓ Branch 79 → 80 taken 2 times.
✗ Branch 79 → 144 not taken.
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 144 not taken.
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 144 not taken.
✓ Branch 82 → 83 taken 2 times.
✗ Branch 82 → 144 not taken.
✓ Branch 83 → 84 taken 2 times.
✗ Branch 83 → 145 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1409
3/6
✓ Branch 83 → 84 taken 2 times.
✗ Branch 83 → 145 not taken.
✓ Branch 84 → 85 taken 2 times.
✗ Branch 84 → 145 not taken.
✓ Branch 85 → 86 taken 2 times.
✗ Branch 85 → 145 not taken.
2 return {.value = builder.CreateSDiv(lhsLong, rhsV())};
1410 }
1411 6 case COMB(TY_LONG, TY_DOUBLE): {
1412
2/4
✓ Branch 87 → 88 taken 6 times.
✗ Branch 87 → 159 not taken.
✓ Branch 88 → 89 taken 6 times.
✗ Branch 88 → 159 not taken.
6 llvm::Value *lhsFP = generateIToFp(lhsSTy, lhsV(), rhsT);
1413
3/6
✓ Branch 89 → 90 taken 6 times.
✗ Branch 89 → 146 not taken.
✓ Branch 90 → 91 taken 6 times.
✗ Branch 90 → 146 not taken.
✓ Branch 91 → 92 taken 6 times.
✗ Branch 91 → 146 not taken.
6 return {.value = builder.CreateFDiv(lhsFP, rhsV())};
1414 }
1415 32 case COMB(TY_LONG, TY_INT): // fallthrough
1416 case COMB(TY_LONG, TY_SHORT): {
1417
5/10
✓ Branch 93 → 94 taken 32 times.
✗ Branch 93 → 147 not taken.
✓ Branch 94 → 95 taken 32 times.
✗ Branch 94 → 147 not taken.
✓ Branch 95 → 96 taken 32 times.
✗ Branch 95 → 147 not taken.
✓ Branch 96 → 97 taken 32 times.
✗ Branch 96 → 147 not taken.
✓ Branch 97 → 98 taken 32 times.
✗ Branch 97 → 148 not taken.
32 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1418
3/6
✓ Branch 97 → 98 taken 32 times.
✗ Branch 97 → 148 not taken.
✓ Branch 98 → 99 taken 32 times.
✗ Branch 98 → 148 not taken.
✓ Branch 99 → 100 taken 32 times.
✗ Branch 99 → 148 not taken.
32 return {.value = builder.CreateSDiv(lhsV(), rhsLong)};
1419 }
1420 312 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 312 times.
✗ Branch 101 → 149 not taken.
✓ Branch 102 → 103 taken 312 times.
✗ Branch 102 → 149 not taken.
✓ Branch 103 → 104 taken 312 times.
✗ Branch 103 → 149 not taken.
✓ Branch 104 → 105 taken 312 times.
✗ Branch 104 → 149 not taken.
312 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 10 times.
✗ Branch 12 → 126 not taken.
✓ Branch 13 → 14 taken 10 times.
✗ Branch 13 → 126 not taken.
✓ Branch 14 → 15 taken 10 times.
✗ Branch 14 → 126 not taken.
✓ Branch 15 → 16 taken 10 times.
✗ Branch 15 → 126 not taken.
✓ Branch 16 → 17 taken 10 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.
990 }
1428
1429 236 LLVMExprResult OpRuleConversionManager::getRemInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
1430 QualType rhsSTy) const {
1431
1/2
✓ Branch 2 → 3 taken 236 times.
✗ Branch 2 → 77 not taken.
472 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1432
1/2
✓ Branch 3 → 4 taken 236 times.
✗ Branch 3 → 78 not taken.
472 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1433
1/2
✓ Branch 4 → 5 taken 236 times.
✗ Branch 4 → 79 not taken.
236 lhsSTy = lhsSTy.removeReferenceWrapper();
1434
1/2
✓ Branch 5 → 6 taken 236 times.
✗ Branch 5 → 80 not taken.
236 rhsSTy = rhsSTy.removeReferenceWrapper();
1435
1/2
✓ Branch 6 → 7 taken 236 times.
✗ Branch 6 → 96 not taken.
236 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1436
1/2
✓ Branch 7 → 8 taken 236 times.
✗ Branch 7 → 96 not taken.
236 llvm::Type *rhsT = rhsSTy.toLLVMType(irGenerator->sourceFile);
1437
1438
10/12
✓ Branch 8 → 9 taken 236 times.
✗ Branch 8 → 96 not taken.
✓ Branch 9 → 10 taken 2 times.
✓ Branch 9 → 18 taken 72 times.
✓ Branch 9 → 22 taken 2 times.
✓ Branch 9 → 29 taken 2 times.
✓ Branch 9 → 36 taken 2 times.
✓ Branch 9 → 43 taken 2 times.
✓ Branch 9 → 47 taken 2 times.
✓ Branch 9 → 54 taken 4 times.
✓ Branch 9 → 61 taken 148 times.
✗ Branch 9 → 65 not taken.
236 switch (getTypeCombination(lhsSTy, rhsSTy)) {
1439 2 case COMB(TY_DOUBLE, TY_DOUBLE): {
1440 // LLVM generates a call to fmod on Linux systems
1441
1/2
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 13 not taken.
2 if (irGenerator->cliOptions.targetTriple.isOSLinux())
1442
1/2
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 96 not taken.
2 irGenerator->resourceManager.linker.requestLibMathLinkage();
1443
4/8
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 81 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 81 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 81 not taken.
✓ Branch 16 → 17 taken 2 times.
✗ Branch 16 → 81 not taken.
2 return {.value = builder.CreateFRem(lhsV(), rhsV())};
1444 }
1445 72 case COMB(TY_INT, TY_INT):
1446
3/6
✓ Branch 18 → 19 taken 72 times.
✗ Branch 18 → 96 not taken.
✓ Branch 19 → 20 taken 72 times.
✗ Branch 19 → 96 not taken.
✓ Branch 20 → 21 taken 72 times.
✗ Branch 20 → 96 not taken.
72 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsV())};
1447 2 case COMB(TY_INT, TY_SHORT): {
1448
5/10
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 82 not taken.
✓ Branch 23 → 24 taken 2 times.
✗ Branch 23 → 82 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 82 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 82 not taken.
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 96 not taken.
2 llvm::Value *rhsInt = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1449
2/4
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 96 not taken.
✓ Branch 27 → 28 taken 2 times.
✗ Branch 27 → 96 not taken.
2 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsInt)};
1450 }
1451 2 case COMB(TY_INT, TY_LONG): {
1452
5/10
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 83 not taken.
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 83 not taken.
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 83 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 83 not taken.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 96 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1453
2/4
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 96 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 96 not taken.
2 return {.value = generateRem(lhsSTy, rhsSTy, lhsLong, rhsV())};
1454 }
1455 2 case COMB(TY_SHORT, TY_INT): {
1456
5/10
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 84 not taken.
✓ Branch 37 → 38 taken 2 times.
✗ Branch 37 → 84 not taken.
✓ Branch 38 → 39 taken 2 times.
✗ Branch 38 → 84 not taken.
✓ Branch 39 → 40 taken 2 times.
✗ Branch 39 → 84 not taken.
✓ Branch 40 → 41 taken 2 times.
✗ Branch 40 → 96 not taken.
2 llvm::Value *lhsInt = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1457
2/4
✓ Branch 40 → 41 taken 2 times.
✗ Branch 40 → 96 not taken.
✓ Branch 41 → 42 taken 2 times.
✗ Branch 41 → 96 not taken.
2 return {.value = generateRem(lhsSTy, rhsSTy, lhsInt, rhsV())};
1458 }
1459 2 case COMB(TY_SHORT, TY_SHORT):
1460
3/6
✓ Branch 43 → 44 taken 2 times.
✗ Branch 43 → 96 not taken.
✓ Branch 44 → 45 taken 2 times.
✗ Branch 44 → 96 not taken.
✓ Branch 45 → 46 taken 2 times.
✗ Branch 45 → 96 not taken.
2 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsV())};
1461 2 case COMB(TY_SHORT, TY_LONG): {
1462
5/10
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 85 not taken.
✓ Branch 48 → 49 taken 2 times.
✗ Branch 48 → 85 not taken.
✓ Branch 49 → 50 taken 2 times.
✗ Branch 49 → 85 not taken.
✓ Branch 50 → 51 taken 2 times.
✗ Branch 50 → 85 not taken.
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 96 not taken.
2 llvm::Value *lhsLong = builder.CreateIntCast(lhsV(), rhsT, rhsSTy.isSigned());
1463
2/4
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 96 not taken.
✓ Branch 52 → 53 taken 2 times.
✗ Branch 52 → 96 not taken.
2 return {.value = generateRem(lhsSTy, rhsSTy, lhsLong, rhsV())};
1464 }
1465 4 case COMB(TY_LONG, TY_INT): // fallthrough
1466 case COMB(TY_LONG, TY_SHORT): {
1467
5/10
✓ Branch 54 → 55 taken 4 times.
✗ Branch 54 → 86 not taken.
✓ Branch 55 → 56 taken 4 times.
✗ Branch 55 → 86 not taken.
✓ Branch 56 → 57 taken 4 times.
✗ Branch 56 → 86 not taken.
✓ Branch 57 → 58 taken 4 times.
✗ Branch 57 → 86 not taken.
✓ Branch 58 → 59 taken 4 times.
✗ Branch 58 → 96 not taken.
4 llvm::Value *rhsLong = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned());
1468
2/4
✓ Branch 58 → 59 taken 4 times.
✗ Branch 58 → 96 not taken.
✓ Branch 59 → 60 taken 4 times.
✗ Branch 59 → 96 not taken.
4 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsLong)};
1469 }
1470 148 case COMB(TY_LONG, TY_LONG):
1471
3/6
✓ Branch 61 → 62 taken 148 times.
✗ Branch 61 → 96 not taken.
✓ Branch 62 → 63 taken 148 times.
✗ Branch 62 → 96 not taken.
✓ Branch 63 → 64 taken 148 times.
✗ Branch 63 → 96 not taken.
148 return {.value = generateRem(lhsSTy, rhsSTy, lhsV(), rhsV())};
1472 default: // GCOV_EXCL_LINE
1473 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: %"); // GCOV_EXCL_LINE
1474 }
1475 236 }
1476
1477 2049 LLVMExprResult OpRuleConversionManager::getPrefixMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1478
1/2
✓ Branch 2 → 3 taken 2049 times.
✗ Branch 2 → 25 not taken.
4098 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1479
1/2
✓ Branch 3 → 4 taken 2049 times.
✗ Branch 3 → 26 not taken.
2049 lhsSTy = lhsSTy.removeReferenceWrapper();
1480
1481
3/5
✓ Branch 4 → 5 taken 2049 times.
✗ Branch 4 → 38 not taken.
✓ Branch 5 → 6 taken 606 times.
✓ Branch 5 → 10 taken 1443 times.
✗ Branch 5 → 14 not taken.
2049 switch (lhsSTy.getSuperType()) {
1482 606 case TY_DOUBLE:
1483
3/6
✓ Branch 6 → 7 taken 606 times.
✗ Branch 6 → 27 not taken.
✓ Branch 7 → 8 taken 606 times.
✗ Branch 7 → 27 not taken.
✓ Branch 8 → 9 taken 606 times.
✗ Branch 8 → 27 not taken.
606 return {.value = builder.CreateFNeg(lhsV())};
1484 1443 case TY_INT: // fallthrough
1485 case TY_SHORT: // fallthrough
1486 case TY_LONG:
1487
3/6
✓ Branch 10 → 11 taken 1443 times.
✗ Branch 10 → 28 not taken.
✓ Branch 11 → 12 taken 1443 times.
✗ Branch 11 → 28 not taken.
✓ Branch 12 → 13 taken 1443 times.
✗ Branch 12 → 28 not taken.
1443 return {.value = builder.CreateNeg(lhsV(), "")};
1488 default: // GCOV_EXCL_LINE
1489 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: -"); // GCOV_EXCL_LINE
1490 }
1491 2049 }
1492
1493 22 LLVMExprResult OpRuleConversionManager::getPrefixPlusPlusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1494
1/2
✓ Branch 2 → 3 taken 22 times.
✗ Branch 2 → 44 not taken.
44 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1495
1/2
✓ Branch 3 → 4 taken 22 times.
✗ Branch 3 → 45 not taken.
22 lhsSTy = lhsSTy.removeReferenceWrapper();
1496
1497
4/7
✓ Branch 4 → 5 taken 22 times.
✗ Branch 4 → 62 not taken.
✓ Branch 5 → 6 taken 18 times.
✓ Branch 5 → 12 taken 2 times.
✓ Branch 5 → 18 taken 2 times.
✗ Branch 5 → 24 not taken.
✗ Branch 5 → 33 not taken.
22 switch (lhsSTy.getSuperType()) {
1498 18 case TY_INT:
1499
5/10
✓ Branch 6 → 7 taken 18 times.
✗ Branch 6 → 62 not taken.
✓ Branch 7 → 8 taken 18 times.
✗ Branch 7 → 46 not taken.
✓ Branch 8 → 9 taken 18 times.
✗ Branch 8 → 46 not taken.
✓ Branch 9 → 10 taken 18 times.
✗ Branch 9 → 46 not taken.
✓ Branch 10 → 11 taken 18 times.
✗ Branch 10 → 46 not taken.
18 return {.value = builder.CreateAdd(lhsV(), builder.getInt32(1), "", false, lhsSTy.isSigned())};
1500 2 case TY_SHORT:
1501
5/10
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 62 not taken.
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 47 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 47 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 47 not taken.
✓ Branch 16 → 17 taken 2 times.
✗ Branch 16 → 47 not taken.
2 return {.value = builder.CreateAdd(lhsV(), builder.getInt16(1), "", false, lhsSTy.isSigned())};
1502 2 case TY_LONG:
1503
5/10
✓ Branch 18 → 19 taken 2 times.
✗ Branch 18 → 62 not taken.
✓ Branch 19 → 20 taken 2 times.
✗ Branch 19 → 48 not taken.
✓ Branch 20 → 21 taken 2 times.
✗ Branch 20 → 48 not taken.
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 48 not taken.
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 48 not taken.
2 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 22 }
1512
1513 30 LLVMExprResult OpRuleConversionManager::getPrefixMinusMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1514
1/2
✓ Branch 2 → 3 taken 30 times.
✗ Branch 2 → 44 not taken.
60 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1515
1/2
✓ Branch 3 → 4 taken 30 times.
✗ Branch 3 → 45 not taken.
30 lhsSTy = lhsSTy.removeReferenceWrapper();
1516
1517
4/7
✓ Branch 4 → 5 taken 30 times.
✗ Branch 4 → 62 not taken.
✓ Branch 5 → 6 taken 12 times.
✓ Branch 5 → 12 taken 2 times.
✓ Branch 5 → 18 taken 16 times.
✗ Branch 5 → 24 not taken.
✗ Branch 5 → 33 not taken.
30 switch (lhsSTy.getSuperType()) {
1518 12 case TY_INT:
1519
5/10
✓ Branch 6 → 7 taken 12 times.
✗ Branch 6 → 62 not taken.
✓ Branch 7 → 8 taken 12 times.
✗ Branch 7 → 46 not taken.
✓ Branch 8 → 9 taken 12 times.
✗ Branch 8 → 46 not taken.
✓ Branch 9 → 10 taken 12 times.
✗ Branch 9 → 46 not taken.
✓ Branch 10 → 11 taken 12 times.
✗ Branch 10 → 46 not taken.
12 return {.value = builder.CreateSub(lhsV(), builder.getInt32(1), "", false, lhsSTy.isSigned())};
1520 2 case TY_SHORT:
1521
5/10
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 62 not taken.
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 47 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 47 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 47 not taken.
✓ Branch 16 → 17 taken 2 times.
✗ Branch 16 → 47 not taken.
2 return {.value = builder.CreateSub(lhsV(), builder.getInt16(1), "", false, lhsSTy.isSigned())};
1522 16 case TY_LONG:
1523
5/10
✓ Branch 18 → 19 taken 16 times.
✗ Branch 18 → 62 not taken.
✓ Branch 19 → 20 taken 16 times.
✗ Branch 19 → 48 not taken.
✓ Branch 20 → 21 taken 16 times.
✗ Branch 20 → 48 not taken.
✓ Branch 21 → 22 taken 16 times.
✗ Branch 21 → 48 not taken.
✓ Branch 22 → 23 taken 16 times.
✗ Branch 22 → 48 not taken.
16 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 30 }
1532
1533 8849 LLVMExprResult OpRuleConversionManager::getPrefixNotInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const {
1534
1/2
✓ Branch 2 → 3 taken 8849 times.
✗ Branch 2 → 20 not taken.
17698 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1535
1/2
✓ Branch 3 → 4 taken 8849 times.
✗ Branch 3 → 21 not taken.
8849 lhsSTy = lhsSTy.removeReferenceWrapper();
1536
1537
2/4
✓ Branch 4 → 5 taken 8849 times.
✗ Branch 4 → 32 not taken.
✓ Branch 5 → 6 taken 8849 times.
✗ Branch 5 → 11 not taken.
8849 switch (lhsSTy.getSuperType()) {
1538 8849 case TY_BOOL:
1539
3/6
✓ Branch 6 → 7 taken 8849 times.
✗ Branch 6 → 22 not taken.
✓ Branch 7 → 8 taken 8849 times.
✗ Branch 7 → 22 not taken.
✓ Branch 8 → 9 taken 8849 times.
✗ Branch 8 → 22 not taken.
17698 return {.value = builder.CreateNot(lhsV())};
1540 default: // GCOV_EXCL_LINE
1541 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: !"); // GCOV_EXCL_LINE
1542 }
1543 8849 }
1544
1545 60 LLVMExprResult OpRuleConversionManager::getPrefixBitwiseNotInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) {
1546
1/2
✓ Branch 2 → 3 taken 60 times.
✗ Branch 2 → 31 not taken.
118 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1547 62 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1548
1/2
✓ Branch 4 → 5 taken 60 times.
✗ Branch 4 → 32 not taken.
60 lhsSTy = lhsSTy.removeReferenceWrapper();
1549
1550 // Handle operator overloads
1551
3/4
✓ Branch 5 → 6 taken 60 times.
✗ Branch 5 → 51 not taken.
✓ Branch 6 → 7 taken 4 times.
✓ Branch 6 → 13 taken 56 times.
60 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
1552 4 return callOperatorOverloadFct<1>(node, {lhsV, lhsP}, DEFAULT_OP_IDX);
1553
1554
2/4
✓ Branch 13 → 14 taken 56 times.
✗ Branch 13 → 51 not taken.
✓ Branch 14 → 15 taken 56 times.
✗ Branch 14 → 19 not taken.
56 switch (lhsSTy.getSuperType()) {
1555 56 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 56 times.
✗ Branch 15 → 41 not taken.
✓ Branch 16 → 17 taken 56 times.
✗ Branch 16 → 41 not taken.
✓ Branch 17 → 18 taken 56 times.
✗ Branch 17 → 41 not taken.
56 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 4 times.
✗ Branch 7 → 35 not taken.
✓ Branch 8 → 9 taken 4 times.
✗ Branch 8 → 35 not taken.
✓ Branch 9 → 10 taken 4 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.
64 }
1564
1565 13578 LLVMExprResult OpRuleConversionManager::getPostfixPlusPlusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) {
1566
1/2
✓ Branch 2 → 3 taken 13578 times.
✗ Branch 2 → 54 not taken.
27136 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1567 13598 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1568
1/2
✓ Branch 4 → 5 taken 13578 times.
✗ Branch 4 → 55 not taken.
13578 lhsSTy = lhsSTy.removeReferenceWrapper();
1569
1570 // Handle operator overloads
1571
3/4
✓ Branch 5 → 6 taken 13578 times.
✗ Branch 5 → 80 not taken.
✓ Branch 6 → 7 taken 20 times.
✓ Branch 6 → 13 taken 13558 times.
13578 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
1572 20 return callOperatorOverloadFct<1>(node, {lhsV, lhsP}, DEFAULT_OP_IDX);
1573
1574
5/7
✓ Branch 13 → 14 taken 13558 times.
✗ Branch 13 → 80 not taken.
✓ Branch 14 → 15 taken 1751 times.
✓ Branch 14 → 21 taken 42 times.
✓ Branch 14 → 27 taken 11700 times.
✓ Branch 14 → 33 taken 65 times.
✗ Branch 14 → 42 not taken.
13558 switch (lhsSTy.getSuperType()) {
1575 1751 case TY_INT:
1576
5/10
✓ Branch 15 → 16 taken 1751 times.
✗ Branch 15 → 80 not taken.
✓ Branch 16 → 17 taken 1751 times.
✗ Branch 16 → 64 not taken.
✓ Branch 17 → 18 taken 1751 times.
✗ Branch 17 → 64 not taken.
✓ Branch 18 → 19 taken 1751 times.
✗ Branch 18 → 64 not taken.
✓ Branch 19 → 20 taken 1751 times.
✗ Branch 19 → 64 not taken.
1751 return {.value = builder.CreateAdd(lhsV(), builder.getInt32(1), "", false, lhsSTy.isSigned())};
1577 42 case TY_SHORT:
1578
5/10
✓ Branch 21 → 22 taken 42 times.
✗ Branch 21 → 80 not taken.
✓ Branch 22 → 23 taken 42 times.
✗ Branch 22 → 65 not taken.
✓ Branch 23 → 24 taken 42 times.
✗ Branch 23 → 65 not taken.
✓ Branch 24 → 25 taken 42 times.
✗ Branch 24 → 65 not taken.
✓ Branch 25 → 26 taken 42 times.
✗ Branch 25 → 65 not taken.
42 return {.value = builder.CreateAdd(lhsV(), builder.getInt16(1), "", false, lhsSTy.isSigned())};
1579 11700 case TY_LONG:
1580
5/10
✓ Branch 27 → 28 taken 11700 times.
✗ Branch 27 → 80 not taken.
✓ Branch 28 → 29 taken 11700 times.
✗ Branch 28 → 66 not taken.
✓ Branch 29 → 30 taken 11700 times.
✗ Branch 29 → 66 not taken.
✓ Branch 30 → 31 taken 11700 times.
✗ Branch 30 → 66 not taken.
✓ Branch 31 → 32 taken 11700 times.
✗ Branch 31 → 66 not taken.
11700 return {.value = builder.CreateAdd(lhsV(), builder.getInt64(1), "", false, lhsSTy.isSigned())};
1581 65 case TY_PTR: {
1582
2/4
✓ Branch 33 → 34 taken 65 times.
✗ Branch 33 → 67 not taken.
✓ Branch 34 → 35 taken 65 times.
✗ Branch 34 → 67 not taken.
65 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
1583
3/6
✓ Branch 37 → 38 taken 65 times.
✗ Branch 37 → 68 not taken.
✓ Branch 39 → 40 taken 65 times.
✗ Branch 39 → 68 not taken.
✓ Branch 40 → 41 taken 65 times.
✗ Branch 40 → 68 not taken.
130 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 20 times.
✗ Branch 7 → 58 not taken.
✓ Branch 8 → 9 taken 20 times.
✗ Branch 8 → 58 not taken.
✓ Branch 9 → 10 taken 20 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.
13598 }
1589
1590 1165 LLVMExprResult OpRuleConversionManager::getPostfixMinusMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) {
1591
1/2
✓ Branch 2 → 3 taken 1165 times.
✗ Branch 2 → 54 not taken.
2314 ResolverFct lhsV = [&] { return irGenerator->resolveValue(lhsSTy, lhs); };
1592 1181 ResolverFct lhsP = [&] { return irGenerator->resolveAddress(lhs); };
1593
1/2
✓ Branch 4 → 5 taken 1165 times.
✗ Branch 4 → 55 not taken.
1165 lhsSTy = lhsSTy.removeReferenceWrapper();
1594
1595 // Handle operator overloads
1596
3/4
✓ Branch 5 → 6 taken 1165 times.
✗ Branch 5 → 80 not taken.
✓ Branch 6 → 7 taken 16 times.
✓ Branch 6 → 13 taken 1149 times.
1165 if (callsOverloadedOpFct(node, DEFAULT_OP_IDX))
1597 16 return callOperatorOverloadFct<1>(node, {lhsV, lhsP}, DEFAULT_OP_IDX);
1598
1599
5/7
✓ Branch 13 → 14 taken 1149 times.
✗ Branch 13 → 80 not taken.
✓ Branch 14 → 15 taken 54 times.
✓ Branch 14 → 21 taken 18 times.
✓ Branch 14 → 27 taken 1073 times.
✓ Branch 14 → 33 taken 4 times.
✗ Branch 14 → 42 not taken.
1149 switch (lhsSTy.getSuperType()) {
1600 54 case TY_INT:
1601
5/10
✓ Branch 15 → 16 taken 54 times.
✗ Branch 15 → 80 not taken.
✓ Branch 16 → 17 taken 54 times.
✗ Branch 16 → 64 not taken.
✓ Branch 17 → 18 taken 54 times.
✗ Branch 17 → 64 not taken.
✓ Branch 18 → 19 taken 54 times.
✗ Branch 18 → 64 not taken.
✓ Branch 19 → 20 taken 54 times.
✗ Branch 19 → 64 not taken.
54 return {.value = builder.CreateSub(lhsV(), builder.getInt32(1), "", false, lhsSTy.isSigned())};
1602 18 case TY_SHORT:
1603
5/10
✓ Branch 21 → 22 taken 18 times.
✗ Branch 21 → 80 not taken.
✓ Branch 22 → 23 taken 18 times.
✗ Branch 22 → 65 not taken.
✓ Branch 23 → 24 taken 18 times.
✗ Branch 23 → 65 not taken.
✓ Branch 24 → 25 taken 18 times.
✗ Branch 24 → 65 not taken.
✓ Branch 25 → 26 taken 18 times.
✗ Branch 25 → 65 not taken.
18 return {.value = builder.CreateSub(lhsV(), builder.getInt16(1), "", false, lhsSTy.isSigned())};
1604 1073 case TY_LONG:
1605
5/10
✓ Branch 27 → 28 taken 1073 times.
✗ Branch 27 → 80 not taken.
✓ Branch 28 → 29 taken 1073 times.
✗ Branch 28 → 66 not taken.
✓ Branch 29 → 30 taken 1073 times.
✗ Branch 29 → 66 not taken.
✓ Branch 30 → 31 taken 1073 times.
✗ Branch 30 → 66 not taken.
✓ Branch 31 → 32 taken 1073 times.
✗ Branch 31 → 66 not taken.
1073 return {.value = builder.CreateSub(lhsV(), builder.getInt64(1), "", false, lhsSTy.isSigned())};
1606 4 case TY_PTR: {
1607
2/4
✓ Branch 33 → 34 taken 4 times.
✗ Branch 33 → 67 not taken.
✓ Branch 34 → 35 taken 4 times.
✗ Branch 34 → 67 not taken.
4 llvm::Type *elementTy = lhsSTy.getContained().toLLVMType(irGenerator->sourceFile);
1608
3/6
✓ Branch 37 → 38 taken 4 times.
✗ Branch 37 → 68 not taken.
✓ Branch 39 → 40 taken 4 times.
✗ Branch 39 → 68 not taken.
✓ Branch 40 → 41 taken 4 times.
✗ Branch 40 → 68 not taken.
8 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 16 times.
✗ Branch 7 → 58 not taken.
✓ Branch 8 → 9 taken 16 times.
✗ Branch 8 → 58 not taken.
✓ Branch 9 → 10 taken 16 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.
1181 }
1614
1615 21831 LLVMExprResult OpRuleConversionManager::getCastInst(const ASTNode *node, QualType lhsSTy, LLVMExprResult &rhs,
1616 QualType rhsSTy) const {
1617
1/2
✓ Branch 2 → 3 taken 21831 times.
✗ Branch 2 → 165 not taken.
36486 ResolverFct rhsV = [&] { return irGenerator->resolveValue(rhsSTy, rhs); };
1618 21903 ResolverFct rhsP = [&] { return irGenerator->resolveAddress(rhs); };
1619
1/2
✓ Branch 4 → 5 taken 21831 times.
✗ Branch 4 → 166 not taken.
21831 lhsSTy = lhsSTy.removeReferenceWrapper();
1620
1/2
✓ Branch 5 → 6 taken 21831 times.
✗ Branch 5 → 167 not taken.
21831 rhsSTy = rhsSTy.removeReferenceWrapper();
1621
1/2
✓ Branch 6 → 7 taken 21831 times.
✗ Branch 6 → 209 not taken.
21831 llvm::Type *lhsT = lhsSTy.toLLVMType(irGenerator->sourceFile);
1622
1623 // Handle identity casts
1624
3/4
✓ Branch 7 → 8 taken 21831 times.
✗ Branch 7 → 209 not taken.
✓ Branch 8 → 9 taken 2532 times.
✓ Branch 8 → 10 taken 19299 times.
21831 if (lhsSTy.matches(rhsSTy, false, true, false))
1625 2532 return rhs;
1626
1627
16/21
✓ Branch 10 → 11 taken 19299 times.
✗ Branch 10 → 209 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 5510 times.
✓ Branch 11 → 27 taken 102 times.
✓ Branch 11 → 38 taken 144 times.
✓ Branch 11 → 49 taken 1949 times.
✓ Branch 11 → 54 taken 104 times.
✓ Branch 11 → 65 taken 646 times.
✓ Branch 11 → 70 taken 114 times.
✓ Branch 11 → 81 taken 3295 times.
✓ Branch 11 → 86 taken 120 times.
✓ Branch 11 → 88 taken 340 times.
✓ Branch 11 → 92 taken 410 times.
✓ Branch 11 → 97 taken 6469 times.
✗ Branch 11 → 99 not taken.
✗ Branch 11 → 112 not taken.
✓ Branch 11 → 127 taken 10 times.
✓ Branch 11 → 131 taken 14 times.
✓ Branch 11 → 135 taken 72 times.
✗ Branch 11 → 153 not taken.
19299 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 5510 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 5510 times.
✗ Branch 13 → 168 not taken.
5510 const QualType lhsContained = lhsSTy.getContained();
1641
1/2
✓ Branch 14 → 15 taken 5510 times.
✗ Branch 14 → 168 not taken.
5510 const QualType rhsContained = rhsSTy.getContained();
1642
5/6
✓ Branch 15 → 16 taken 5510 times.
✗ Branch 15 → 168 not taken.
✓ Branch 16 → 17 taken 5496 times.
✓ Branch 16 → 19 taken 14 times.
✓ Branch 21 → 22 taken 938 times.
✓ Branch 21 → 25 taken 4572 times.
11006 if (lhsContained.matchesInterfaceImplementedByStruct(rhsContained) ||
1643
3/4
✓ Branch 17 → 18 taken 5496 times.
✗ Branch 17 → 168 not taken.
✓ Branch 18 → 19 taken 924 times.
✓ Branch 18 → 20 taken 4572 times.
5496 lhsContained.matchesComposedBaseOfStruct(rhsContained))
1644
2/4
✓ Branch 22 → 23 taken 938 times.
✗ Branch 22 → 168 not taken.
✓ Branch 23 → 24 taken 938 times.
✗ Branch 23 → 168 not taken.
938 return {.value = irGenerator->getUpcastedStructPtr(rhsV(), lhsSTy, rhsSTy)};
1645 4572 return rhs;
1646 }
1647 102 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 102 times.
✗ Branch 27 → 209 not taken.
✓ Branch 28 → 29 taken 54 times.
✓ Branch 28 → 33 taken 48 times.
✓ Branch 29 → 30 taken 54 times.
✗ Branch 29 → 169 not taken.
✓ Branch 30 → 31 taken 54 times.
✗ Branch 30 → 169 not taken.
✓ Branch 31 → 32 taken 54 times.
✗ Branch 31 → 169 not taken.
✓ Branch 33 → 34 taken 48 times.
✗ Branch 33 → 169 not taken.
✓ Branch 34 → 35 taken 48 times.
✗ Branch 34 → 169 not taken.
✓ Branch 35 → 36 taken 48 times.
✗ Branch 35 → 169 not taken.
102 return {.value = rhsSTy.isSigned() ? builder.CreateSIToFP(rhsV(), lhsT) : builder.CreateUIToFP(rhsV(), lhsT)};
1651 144 case COMB(TY_INT, TY_DOUBLE):
1652
5/16
✓ Branch 38 → 39 taken 144 times.
✗ Branch 38 → 209 not taken.
✓ Branch 39 → 40 taken 144 times.
✗ Branch 39 → 44 not taken.
✓ Branch 40 → 41 taken 144 times.
✗ Branch 40 → 171 not taken.
✓ Branch 41 → 42 taken 144 times.
✗ Branch 41 → 171 not taken.
✓ Branch 42 → 43 taken 144 times.
✗ Branch 42 → 171 not taken.
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 171 not taken.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 171 not taken.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 171 not taken.
144 return {.value = lhsSTy.isSigned() ? builder.CreateFPToSI(rhsV(), lhsT) : builder.CreateFPToUI(rhsV(), lhsT)};
1653 1949 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 1949 times.
✗ Branch 49 → 173 not taken.
✓ Branch 50 → 51 taken 1949 times.
✗ Branch 50 → 173 not taken.
✓ Branch 51 → 52 taken 1949 times.
✗ Branch 51 → 173 not taken.
✓ Branch 52 → 53 taken 1949 times.
✗ Branch 52 → 173 not taken.
1949 return {.value = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned())};
1658 104 case COMB(TY_SHORT, TY_DOUBLE):
1659
5/16
✓ Branch 54 → 55 taken 104 times.
✗ Branch 54 → 209 not taken.
✓ Branch 55 → 56 taken 104 times.
✗ Branch 55 → 60 not taken.
✓ Branch 56 → 57 taken 104 times.
✗ Branch 56 → 174 not taken.
✓ Branch 57 → 58 taken 104 times.
✗ Branch 57 → 174 not taken.
✓ Branch 58 → 59 taken 104 times.
✗ Branch 58 → 174 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 174 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 61 → 174 not taken.
✗ Branch 62 → 63 not taken.
✗ Branch 62 → 174 not taken.
104 return {.value = lhsSTy.isSigned() ? builder.CreateFPToSI(rhsV(), lhsT) : builder.CreateFPToUI(rhsV(), lhsT)};
1660 646 case COMB(TY_SHORT, TY_INT): // fallthrough
1661 case COMB(TY_SHORT, TY_LONG):
1662
4/8
✓ Branch 65 → 66 taken 646 times.
✗ Branch 65 → 176 not taken.
✓ Branch 66 → 67 taken 646 times.
✗ Branch 66 → 176 not taken.
✓ Branch 67 → 68 taken 646 times.
✗ Branch 67 → 176 not taken.
✓ Branch 68 → 69 taken 646 times.
✗ Branch 68 → 176 not taken.
646 return {.value = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned())};
1663 114 case COMB(TY_LONG, TY_DOUBLE):
1664
9/16
✓ Branch 70 → 71 taken 114 times.
✗ Branch 70 → 209 not taken.
✓ Branch 71 → 72 taken 110 times.
✓ Branch 71 → 76 taken 4 times.
✓ Branch 72 → 73 taken 110 times.
✗ Branch 72 → 177 not taken.
✓ Branch 73 → 74 taken 110 times.
✗ Branch 73 → 177 not taken.
✓ Branch 74 → 75 taken 110 times.
✗ Branch 74 → 177 not taken.
✓ Branch 76 → 77 taken 4 times.
✗ Branch 76 → 177 not taken.
✓ Branch 77 → 78 taken 4 times.
✗ Branch 77 → 177 not taken.
✓ Branch 78 → 79 taken 4 times.
✗ Branch 78 → 177 not taken.
114 return {.value = lhsSTy.isSigned() ? builder.CreateFPToSI(rhsV(), lhsT) : builder.CreateFPToUI(rhsV(), lhsT)};
1665 3295 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 3295 times.
✗ Branch 81 → 179 not taken.
✓ Branch 82 → 83 taken 3295 times.
✗ Branch 82 → 179 not taken.
✓ Branch 83 → 84 taken 3295 times.
✗ Branch 83 → 179 not taken.
✓ Branch 84 → 85 taken 3295 times.
✗ Branch 84 → 179 not taken.
3295 return {.value = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned())};
1669 120 case COMB(TY_BYTE, TY_CHAR):
1670
1/2
✓ Branch 86 → 87 taken 120 times.
✗ Branch 86 → 209 not taken.
120 return {.value = rhsV()};
1671 340 case COMB(TY_INT, TY_BOOL): // fallthrough
1672 case COMB(TY_SHORT, TY_BOOL): // fallthrough
1673 case COMB(TY_LONG, TY_BOOL): // fallthrough
1674 case COMB(TY_BYTE, TY_BOOL):
1675 // Bool is always unsigned (0 or 1), so zero-extend rather than sign-extend to avoid true -> -1
1676
3/6
✓ Branch 88 → 89 taken 340 times.
✗ Branch 88 → 180 not taken.
✓ Branch 89 → 90 taken 340 times.
✗ Branch 89 → 180 not taken.
✓ Branch 90 → 91 taken 340 times.
✗ Branch 90 → 180 not taken.
340 return {.value = builder.CreateZExt(rhsV(), lhsT)};
1677 410 case COMB(TY_CHAR, TY_INT): // fallthrough
1678 case COMB(TY_CHAR, TY_SHORT): // fallthrough
1679 case COMB(TY_CHAR, TY_LONG):
1680
4/8
✓ Branch 92 → 93 taken 410 times.
✗ Branch 92 → 181 not taken.
✓ Branch 93 → 94 taken 410 times.
✗ Branch 93 → 181 not taken.
✓ Branch 94 → 95 taken 410 times.
✗ Branch 94 → 181 not taken.
✓ Branch 95 → 96 taken 410 times.
✗ Branch 95 → 181 not taken.
410 return {.value = builder.CreateIntCast(rhsV(), lhsT, lhsSTy.isSigned())};
1681 6469 case COMB(TY_CHAR, TY_BYTE): // fallthrough
1682 case COMB(TY_STRING, TY_PTR): // fallthrough
1683 case COMB(TY_PTR, TY_STRING):
1684
1/2
✓ Branch 97 → 98 taken 6469 times.
✗ Branch 97 → 209 not taken.
6469 return {.value = rhsV()};
1685 case COMB(TY_ARRAY, TY_PTR): // fallthrough
1686 case COMB(TY_ARRAY, TY_STRING):
1687 assert(lhsSTy.isArrayOf(TY_CHAR));
1688 assert(rhsSTy.isPtrTo(TY_CHAR) || rhsSTy.is(TY_STRING));
1689 return {.value = builder.CreateBitCast(rhsV(), rhsSTy.toLLVMType(irGenerator->sourceFile))};
1690 case COMB(TY_PTR, TY_ARRAY): // fallthrough
1691 case COMB(TY_STRING, TY_ARRAY): {
1692 assert(lhsSTy.isPtrTo(TY_CHAR) || lhsSTy.is(TY_STRING));
1693 assert(rhsSTy.isArrayOf(TY_CHAR));
1694 llvm::Value *indices[1] = {builder.getInt32(0)};
1695 return {.value = builder.CreateInBoundsGEP(builder.getInt8Ty(), rhsP(), indices)};
1696 }
1697 10 case COMB(TY_LONG, TY_PTR): // fallthrough
1698 case COMB(TY_LONG, TY_STRING):
1699 // The type checker only lets a pointer be cast to 'long', which is 64 bit wide on every Spice target, so this
1700 // never truncates. On a target with narrower pointers (e.g. wasm32) 'ptrtoint' zero-extends instead.
1701
3/6
✓ Branch 127 → 128 taken 10 times.
✗ Branch 127 → 186 not taken.
✓ Branch 128 → 129 taken 10 times.
✗ Branch 128 → 186 not taken.
✓ Branch 129 → 130 taken 10 times.
✗ Branch 129 → 186 not taken.
10 return {.value = builder.CreatePtrToInt(rhsV(), lhsT)};
1702 14 case COMB(TY_PTR, TY_LONG): // fallthrough
1703 case COMB(TY_STRING, TY_LONG):
1704
3/6
✓ Branch 131 → 132 taken 14 times.
✗ Branch 131 → 187 not taken.
✓ Branch 132 → 133 taken 14 times.
✗ Branch 132 → 187 not taken.
✓ Branch 133 → 134 taken 14 times.
✗ Branch 133 → 187 not taken.
14 return {.value = builder.CreateIntToPtr(rhsV(), lhsT)};
1705 72 case COMB(TY_PTR, TY_FUNCTION): // fallthrough
1706 case COMB(TY_PTR, TY_PROCEDURE): {
1707
2/4
✓ Branch 135 → 136 taken 72 times.
✗ Branch 135 → 209 not taken.
✗ Branch 136 → 137 not taken.
✓ Branch 136 → 138 taken 72 times.
72 assert(lhsSTy.isPtrTo(TY_BYTE));
1708
2/4
✓ Branch 141 → 142 taken 72 times.
✗ Branch 141 → 188 not taken.
✓ Branch 142 → 143 taken 72 times.
✗ Branch 142 → 188 not taken.
144 llvm::Value *fctPtrPtr = irGenerator->insertStructGEP(irGenerator->llvmTypes.lambdaFatPtrType, rhsP(), 0);
1709
2/4
✓ Branch 148 → 149 taken 72 times.
✗ Branch 148 → 194 not taken.
✓ Branch 149 → 150 taken 72 times.
✗ Branch 149 → 194 not taken.
144 llvm::Value *fctPtr = irGenerator->insertLoad(builder.getPtrTy(), fctPtrPtr);
1710 72 return {.value = fctPtr};
1711 }
1712 default: // GCOV_EXCL_LINE
1713 throw CompilerError(UNHANDLED_BRANCH, "Operator fallthrough: (cast)"); // GCOV_EXCL_LINE
1714 }
1715 21831 }
1716
1717 188032 bool OpRuleConversionManager::callsOverloadedOpFct(const ASTNode *node, size_t opIdx) const {
1718 188032 const std::vector<const Function *> &opFctList = irGenerator->getOpFctPointers(node);
1719
4/4
✓ Branch 4 → 5 taken 185257 times.
✓ Branch 4 → 8 taken 2775 times.
✓ Branch 6 → 7 taken 13232 times.
✓ Branch 6 → 8 taken 172025 times.
188032 return opFctList.size() > opIdx && opFctList.at(opIdx) != nullptr;
1720 }
1721
1722 template <size_t N>
1723 13196 LLVMExprResult OpRuleConversionManager::callOperatorOverloadFct(const ASTNode *node, const std::array<ResolverFct, N * 2> &opV,
1724 size_t opIdx) {
1725 static_assert(N == 1 || N == 2, "Only unary and binary operators are overloadable");
1726 13196 const size_t manIdx = irGenerator->manIdx;
1727
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 40 times.
✗ Branch 2 → 137 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 13156 times.
✗ Branch 2 → 146 not taken.
13196 const std::vector<std::vector<const Function *>> *opFctPointers = node->getOpFctPointers();
1728
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 40 times.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 40 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 13156 times.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 13156 times.
✗ Branch 6 → 8 not taken.
13196 assert(!opFctPointers->empty() && opFctPointers->size() > manIdx);
1729
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 40 times.
✗ Branch 9 → 137 not taken.
✓ Branch 11 → 12 taken 40 times.
✗ Branch 11 → 16 not taken.
✓ Branch 12 → 13 taken 40 times.
✗ Branch 12 → 137 not taken.
✓ Branch 14 → 15 taken 40 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 13156 times.
✗ Branch 9 → 146 not taken.
✓ Branch 11 → 12 taken 13156 times.
✗ Branch 11 → 16 not taken.
✓ Branch 12 → 13 taken 13156 times.
✗ Branch 12 → 146 not taken.
✓ Branch 14 → 15 taken 13156 times.
✗ Branch 14 → 16 not taken.
13196 assert(!opFctPointers->at(manIdx).empty() && opFctPointers->at(manIdx).size() > opIdx);
1730
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 40 times.
✗ Branch 17 → 137 not taken.
✓ Branch 18 → 19 taken 40 times.
✗ Branch 18 → 137 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 13156 times.
✗ Branch 17 → 146 not taken.
✓ Branch 18 → 19 taken 13156 times.
✗ Branch 18 → 146 not taken.
13196 const Function *opFct = opFctPointers->at(manIdx).at(opIdx);
1731
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 40 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 13156 times.
13196 assert(opFct != nullptr);
1732
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 21 → 22 taken 40 times.
✗ Branch 21 → 137 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 13156 times.
✗ Branch 21 → 146 not taken.
13196 const std::string mangledName = opFct->getMangledName();
1734
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 40 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 13156 times.
13196 assert(opFct->entry->scope != nullptr);
1735
1736 // Get arg values
1737
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 40 times.
✗ Branch 24 → 135 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 13156 times.
✗ Branch 24 → 144 not taken.
13196 const QualTypeList &paramTypes = opFct->getParamTypes();
1738
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 40 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 13156 times.
13196 assert(paramTypes.size() == N);
1739 // References and decayed arrays are passed as address, everything else as value
1740 26352 const auto passAsAddress = [](const QualType &paramType) {
1741
4/4
✓ Branch 3 → 4 taken 6345 times.
✓ Branch 3 → 6 taken 20007 times.
✓ Branch 5 → 6 taken 2 times.
✓ Branch 5 → 7 taken 6343 times.
26352 return paramType.isRef() || paramType.isDecayedArray();
1742 };
1743 llvm::Value *argValues[N];
1744
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 40 times.
✗ Branch 29 → 133 not taken.
✓ Branch 30 → 31 taken 38 times.
✓ Branch 30 → 34 taken 2 times.
✓ Branch 32 → 33 taken 38 times.
✗ Branch 32 → 133 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 133 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 13156 times.
✗ Branch 29 → 142 not taken.
✓ Branch 30 → 31 taken 12768 times.
✓ Branch 30 → 34 taken 388 times.
✓ Branch 32 → 33 taken 12768 times.
✗ Branch 32 → 142 not taken.
✓ Branch 35 → 36 taken 388 times.
✗ Branch 35 → 142 not taken.
13196 argValues[0] = passAsAddress(paramTypes[0]) ? opV[1]() : opV[0]();
1745 if constexpr (N == 2)
1746
5/8
✓ Branch 38 → 39 taken 13156 times.
✗ Branch 38 → 142 not taken.
✓ Branch 39 → 40 taken 7203 times.
✓ Branch 39 → 43 taken 5953 times.
✓ Branch 41 → 42 taken 7203 times.
✗ Branch 41 → 142 not taken.
✓ Branch 44 → 45 taken 5953 times.
✗ Branch 44 → 142 not taken.
13156 argValues[1] = passAsAddress(paramTypes[1]) ? opV[3]() : opV[2]();
1747 // Decayed array params expect the address of a writable array, which the resolvers above do not guarantee
1748
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 45 → 38 taken 40 times.
✓ Branch 45 → 46 taken 40 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 → 47 taken 26312 times.
✓ Branch 54 → 55 taken 13156 times.
39548 for (size_t i = 0; i < N; i++)
1749
5/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 39 → 40 taken 40 times.
✗ Branch 39 → 133 not taken.
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 44 taken 40 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 48 → 49 taken 26312 times.
✗ Branch 48 → 142 not taken.
✓ Branch 49 → 50 taken 2 times.
✓ Branch 49 → 53 taken 26310 times.
26352 if (paramTypes[i].isDecayedArray())
1750
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 42 → 43 not taken.
✗ Branch 42 → 133 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 51 → 52 taken 2 times.
✗ Branch 51 → 142 not taken.
2 argValues[i] = irGenerator->materializeDecayedArrayArg(argValues[i], paramTypes[i]);
1751
1752 // Function is not defined in the current module -> declare it
1753
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 47 → 48 taken 40 times.
✗ Branch 47 → 113 not taken.
✓ Branch 48 → 49 taken 30 times.
✓ Branch 48 → 78 taken 10 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 56 → 57 taken 13156 times.
✗ Branch 56 → 122 not taken.
✓ Branch 57 → 58 taken 2341 times.
✓ Branch 57 → 87 taken 10815 times.
13196 if (!irGenerator->module->getFunction(mangledName)) {
1754 // Get returnType
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 49 → 50 taken 30 times.
✗ Branch 49 → 122 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 58 → 59 taken 2341 times.
✗ Branch 58 → 131 not taken.
2371 llvm::Type *returnType = builder.getVoidTy();
1756
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 50 → 51 taken 30 times.
✗ Branch 50 → 122 not taken.
✓ Branch 51 → 52 taken 2 times.
✓ Branch 51 → 54 taken 28 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 59 → 60 taken 2341 times.
✗ Branch 59 → 131 not taken.
✓ Branch 60 → 61 taken 1337 times.
✓ Branch 60 → 63 taken 1004 times.
2371 if (!opFct->returnType.is(TY_DYN))
1757
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 52 → 53 taken 2 times.
✗ Branch 52 → 122 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 61 → 62 taken 1337 times.
✗ Branch 61 → 131 not taken.
1339 returnType = opFct->returnType.toLLVMType(irGenerator->sourceFile);
1758
1759 // Get arg types
1760 2371 std::vector<llvm::Type *> argTypes;
1761
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 54 → 55 taken 30 times.
✗ Branch 54 → 117 not taken.
✓ Branch 70 → 57 taken 30 times.
✓ Branch 70 → 71 taken 30 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 63 → 64 taken 2341 times.
✗ Branch 63 → 126 not taken.
✓ Branch 79 → 66 taken 4682 times.
✓ Branch 79 → 80 taken 2341 times.
9454 for (const QualType &paramType : opFct->getParamTypes())
1762
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 59 → 60 taken 30 times.
✗ Branch 59 → 114 not taken.
✓ Branch 60 → 61 taken 30 times.
✗ Branch 60 → 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 68 → 69 taken 4682 times.
✗ Branch 68 → 123 not taken.
✓ Branch 69 → 70 taken 4682 times.
✗ Branch 69 → 123 not taken.
4712 argTypes.push_back(paramType.getParamLLVMType(irGenerator->sourceFile));
1763
1764
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 73 → 74 taken 30 times.
✗ Branch 73 → 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 82 → 83 taken 2341 times.
✗ Branch 82 → 127 not taken.
2371 llvm::FunctionType *fctType = llvm::FunctionType::get(returnType, argTypes, false);
1765
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 75 → 76 taken 30 times.
✗ Branch 75 → 119 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 84 → 85 taken 2341 times.
✗ Branch 84 → 128 not taken.
2371 irGenerator->module->getOrInsertFunction(mangledName, fctType);
1766 2371 }
1767
1768 // Get callee function
1769
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 79 → 80 taken 40 times.
✗ Branch 79 → 123 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 88 → 89 taken 13156 times.
✗ Branch 88 → 132 not taken.
13196 llvm::Function *callee = irGenerator->module->getFunction(mangledName);
1770
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 80 → 81 not taken.
✓ Branch 80 → 82 taken 40 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 not taken.
✓ Branch 89 → 91 taken 13156 times.
13196 assert(callee != nullptr);
1771
1772 // Generate function call
1773
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 82 → 83 taken 40 times.
✗ Branch 82 → 126 not taken.
✓ Branch 84 → 85 taken 40 times.
✗ Branch 84 → 124 not taken.
✓ Branch 85 → 86 taken 40 times.
✗ Branch 85 → 124 not taken.
✓ Branch 86 → 87 taken 40 times.
✗ Branch 86 → 133 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 91 → 92 taken 13156 times.
✗ Branch 91 → 135 not taken.
✓ Branch 93 → 94 taken 13156 times.
✗ Branch 93 → 133 not taken.
✓ Branch 94 → 95 taken 13156 times.
✗ Branch 94 → 133 not taken.
✓ Branch 95 → 96 taken 13156 times.
✗ Branch 95 → 142 not taken.
13196 llvm::Value *result = builder.CreateCall(callee, argValues);
1774
1775 // If this is a procedure, return true
1776
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 89 → 90 taken 32 times.
✓ Branch 89 → 92 taken 8 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 98 → 99 taken 3024 times.
✓ Branch 98 → 101 taken 10132 times.
13196 if (opFct->isProcedure())
1777
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 90 → 91 taken 32 times.
✗ Branch 90 → 133 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 99 → 100 taken 3024 times.
✗ Branch 99 → 142 not taken.
3056 return {.constant = builder.getTrue()};
1778
1779 // Attach address to anonymous symbol to keep track of de-allocation
1780 10140 const SymbolTableEntry *anonymousSymbol = nullptr;
1781 10140 llvm::Value *resultPtr = nullptr;
1782
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 92 → 93 taken 8 times.
✗ Branch 92 → 133 not taken.
✓ Branch 93 → 94 taken 4 times.
✓ Branch 93 → 105 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 101 → 102 taken 10132 times.
✗ Branch 101 → 142 not taken.
✓ Branch 102 → 103 taken 1300 times.
✓ Branch 102 → 114 taken 8832 times.
10140 if (opFct->returnType.is(TY_STRUCT)) {
1783
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 94 → 95 taken 4 times.
✗ Branch 94 → 133 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 1300 times.
✗ Branch 103 → 142 not taken.
1304 anonymousSymbol = irGenerator->currentScope->symbolTable.lookupAnonymous(node, opIdx);
1784
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 95 → 96 not taken.
✓ Branch 95 → 105 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 104 → 105 taken 744 times.
✓ Branch 104 → 114 taken 556 times.
1304 if (anonymousSymbol != nullptr) {
1785
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 100 → 101 not taken.
✗ Branch 100 → 127 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 109 → 110 taken 744 times.
✗ Branch 109 → 136 not taken.
1488 resultPtr = irGenerator->insertAlloca(result->getType());
1786
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 103 → 104 not taken.
✗ Branch 103 → 133 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 112 → 113 taken 744 times.
✗ Branch 112 → 142 not taken.
744 irGenerator->insertStore(result, resultPtr);
1787
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 104 → 105 not taken.
✗ Branch 104 → 133 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 113 → 114 taken 744 times.
✗ Branch 113 → 142 not taken.
744 irGenerator->updateAddress(anonymousSymbol, resultPtr);
1788 }
1789 }
1790
1791 // If the return type is reference, return the result value as refPtr
1792
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 105 → 106 taken 8 times.
✗ Branch 105 → 133 not taken.
✓ Branch 106 → 107 taken 4 times.
✓ Branch 106 → 108 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 114 → 115 taken 10132 times.
✗ Branch 114 → 142 not taken.
✓ Branch 115 → 116 taken 5426 times.
✓ Branch 115 → 117 taken 4706 times.
10140 if (opFct->returnType.isRef())
1793 5430 return {.ptr = result, .refPtr = resultPtr, .entry = anonymousSymbol};
1794
1795 // Otherwise as value
1796 4710 return {.value = result, .ptr = resultPtr, .entry = anonymousSymbol};
1797 13196 }
1798
1799 846 llvm::Value *OpRuleConversionManager::generateIToFp(const QualType &srcSTy, llvm::Value *srcV, llvm::Type *tgtT) const {
1800
2/2
✓ Branch 3 → 4 taken 818 times.
✓ Branch 3 → 8 taken 28 times.
846 if (srcSTy.isSigned())
1801
2/4
✓ Branch 4 → 5 taken 818 times.
✗ Branch 4 → 13 not taken.
✓ Branch 5 → 6 taken 818 times.
✗ Branch 5 → 13 not taken.
818 return builder.CreateSIToFP(srcV, tgtT);
1802 else
1803
2/4
✓ Branch 8 → 9 taken 28 times.
✗ Branch 8 → 14 not taken.
✓ Branch 9 → 10 taken 28 times.
✗ Branch 9 → 14 not taken.
28 return builder.CreateUIToFP(srcV, tgtT);
1804 }
1805
1806 781 llvm::Value *OpRuleConversionManager::generateSHR(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1807 llvm::Value *rhsV) const {
1808
2/2
✓ Branch 3 → 4 taken 106 times.
✓ Branch 3 → 8 taken 675 times.
781 if (lhsSTy.isSigned())
1809
2/4
✓ Branch 4 → 5 taken 106 times.
✗ Branch 4 → 13 not taken.
✓ Branch 5 → 6 taken 106 times.
✗ Branch 5 → 13 not taken.
106 return builder.CreateAShr(lhsV, rhsV);
1810 else
1811
2/4
✓ Branch 8 → 9 taken 675 times.
✗ Branch 8 → 14 not taken.
✓ Branch 9 → 10 taken 675 times.
✗ Branch 9 → 14 not taken.
675 return builder.CreateLShr(lhsV, rhsV);
1812 }
1813
1814 11267 llvm::Value *OpRuleConversionManager::generateLT(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1815 llvm::Value *rhsV) const {
1816
6/6
✓ Branch 3 → 4 taken 1800 times.
✓ Branch 3 → 7 taken 9467 times.
✓ Branch 5 → 6 taken 1728 times.
✓ Branch 5 → 7 taken 72 times.
✓ Branch 8 → 9 taken 1728 times.
✓ Branch 8 → 13 taken 9539 times.
11267 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1817
2/4
✓ Branch 9 → 10 taken 1728 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 1728 times.
✗ Branch 10 → 18 not taken.
1728 return builder.CreateICmpSLT(lhsV, rhsV);
1818 else
1819
2/4
✓ Branch 13 → 14 taken 9539 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 9539 times.
✗ Branch 14 → 19 not taken.
9539 return builder.CreateICmpULT(lhsV, rhsV);
1820 }
1821
1822 3502 llvm::Value *OpRuleConversionManager::generateLE(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1823 llvm::Value *rhsV) const {
1824
6/6
✓ Branch 3 → 4 taken 210 times.
✓ Branch 3 → 7 taken 3292 times.
✓ Branch 5 → 6 taken 188 times.
✓ Branch 5 → 7 taken 22 times.
✓ Branch 8 → 9 taken 188 times.
✓ Branch 8 → 13 taken 3314 times.
3502 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1825
2/4
✓ Branch 9 → 10 taken 188 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 188 times.
✗ Branch 10 → 18 not taken.
188 return builder.CreateICmpSLE(lhsV, rhsV);
1826 else
1827
2/4
✓ Branch 13 → 14 taken 3314 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 3314 times.
✗ Branch 14 → 19 not taken.
3314 return builder.CreateICmpULE(lhsV, rhsV);
1828 }
1829
1830 6302 llvm::Value *OpRuleConversionManager::generateGT(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1831 llvm::Value *rhsV) const {
1832
6/6
✓ Branch 3 → 4 taken 2135 times.
✓ Branch 3 → 7 taken 4167 times.
✓ Branch 5 → 6 taken 1237 times.
✓ Branch 5 → 7 taken 898 times.
✓ Branch 8 → 9 taken 1237 times.
✓ Branch 8 → 13 taken 5065 times.
6302 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1833
2/4
✓ Branch 9 → 10 taken 1237 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 1237 times.
✗ Branch 10 → 18 not taken.
1237 return builder.CreateICmpSGT(lhsV, rhsV);
1834 else
1835
2/4
✓ Branch 13 → 14 taken 5065 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 5065 times.
✗ Branch 14 → 19 not taken.
5065 return builder.CreateICmpUGT(lhsV, rhsV);
1836 }
1837
1838 6361 llvm::Value *OpRuleConversionManager::generateGE(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1839 llvm::Value *rhsV) const {
1840
6/6
✓ Branch 3 → 4 taken 490 times.
✓ Branch 3 → 7 taken 5871 times.
✓ Branch 5 → 6 taken 472 times.
✓ Branch 5 → 7 taken 18 times.
✓ Branch 8 → 9 taken 472 times.
✓ Branch 8 → 13 taken 5889 times.
6361 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1841
2/4
✓ Branch 9 → 10 taken 472 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 472 times.
✗ Branch 10 → 18 not taken.
472 return builder.CreateICmpSGE(lhsV, rhsV);
1842 else
1843
2/4
✓ Branch 13 → 14 taken 5889 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 5889 times.
✗ Branch 14 → 19 not taken.
5889 return builder.CreateICmpUGE(lhsV, rhsV);
1844 }
1845
1846 52 llvm::Value *OpRuleConversionManager::generateDiv(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1847 llvm::Value *rhsV) const {
1848
5/6
✓ Branch 3 → 4 taken 42 times.
✓ Branch 3 → 7 taken 10 times.
✓ Branch 5 → 6 taken 42 times.
✗ Branch 5 → 7 not taken.
✓ Branch 8 → 9 taken 42 times.
✓ Branch 8 → 13 taken 10 times.
52 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1849
2/4
✓ Branch 9 → 10 taken 42 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 42 times.
✗ Branch 10 → 18 not taken.
42 return builder.CreateSDiv(lhsV, rhsV);
1850 else
1851
2/4
✓ Branch 13 → 14 taken 10 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 10 times.
✗ Branch 14 → 19 not taken.
10 return builder.CreateUDiv(lhsV, rhsV);
1852 }
1853
1854 318 llvm::Value *OpRuleConversionManager::generateRem(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
1855 llvm::Value *rhsV) const {
1856
6/6
✓ Branch 3 → 4 taken 174 times.
✓ Branch 3 → 7 taken 144 times.
✓ Branch 5 → 6 taken 122 times.
✓ Branch 5 → 7 taken 52 times.
✓ Branch 8 → 9 taken 122 times.
✓ Branch 8 → 13 taken 196 times.
318 if (lhsSTy.isSigned() && rhsSTy.isSigned())
1857
2/4
✓ Branch 9 → 10 taken 122 times.
✗ Branch 9 → 18 not taken.
✓ Branch 10 → 11 taken 122 times.
✗ Branch 10 → 18 not taken.
122 return builder.CreateSRem(lhsV, rhsV);
1858 else
1859
2/4
✓ Branch 13 → 14 taken 196 times.
✗ Branch 13 → 19 not taken.
✓ Branch 14 → 15 taken 196 times.
✗ Branch 14 → 19 not taken.
196 return builder.CreateURem(lhsV, rhsV);
1860 }
1861
1862 } // namespace spice::compiler
1863