GCC Code Coverage Report


Directory: ../
File: src/irgenerator/OpRuleConversionManager.cpp
Date: 2025-12-07 00:53:49
Coverage Exec Excl Total
Lines: 96.3% 1151 68 1263
Functions: 93.2% 124 0 133
Branches: 51.0% 2482 136 5004

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