GCC Code Coverage Report


Directory: ../
File: src/irgenerator/OpRuleConversionManager.cpp
Date: 2025-12-09 23:00:59
Coverage Exec Excl Total
Lines: 96.3% 1159 68 1271
Functions: 93.2% 124 0 133
Branches: 51.0% 2491 136 5022

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