GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 96.3% 1159 / 68 / 1271
Functions: 93.2% 124 / 0 / 133
Branches: 51.0% 2491 / 136 / 5022

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