Skip to content

Commit d356a80

Browse files
committed
Move value-related fields to InstructionBase
1 parent a1940fc commit d356a80

14 files changed

Lines changed: 262 additions & 180 deletions

‎src/engine/internal/codegen/instruction.h‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,24 @@ struct Instruction : public InstructionBase
1313
using Type = InstructionBase::Type;
1414
using InstructionBase::InstructionBase; // inherit constructor
1515

16-
inline TInstruction *getPrevious() { return static_cast<TInstruction *>(previous); }
16+
inline TInstruction *getPrevious() const { return static_cast<TInstruction *>(previous); }
1717

18-
inline TInstruction *getNext() { return static_cast<TInstruction *>(next); }
18+
inline TInstruction *getNext() const { return static_cast<TInstruction *>(next); }
1919

20-
std::vector<std::pair<Compiler::StaticType, TRegister *>> args; // target type, register
21-
TRegister *functionReturnReg = nullptr;
20+
inline std::vector<std::pair<Compiler::StaticType, TRegister *>> getArgs() const
21+
{
22+
// TODO: Replace this with getArg(index) and argCount() methods
23+
std::vector<std::pair<Compiler::StaticType, TRegister *>> out;
24+
out.reserve(args.size());
25+
26+
for (auto &a : args)
27+
out.emplace_back(a.first, dynamic_cast<TRegister *>(a.second));
28+
29+
return out;
30+
}
31+
32+
inline TRegister *getFunctionReturnReg() const { return dynamic_cast<TRegister *>(functionReturnReg); }
33+
inline void setFunctionReturnReg(TRegister *reg) { functionReturnReg = reg; }
2234
};
2335

2436
} // namespace libscratchcpp

‎src/engine/internal/codegen/instructionbase.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ struct InstructionBase
9898
size_t procedureArgIndex = 0;
9999
bool loopCondition = false; // whether the instruction is part of a loop condition
100100

101+
std::vector<std::pair<Compiler::StaticType, CompilerValue *>> args; // target type, register
102+
CompilerValue *functionReturnReg = nullptr;
103+
101104
// Linked list
102105
InstructionBase *previous = nullptr;
103106
InstructionBase *next = nullptr;

‎src/engine/internal/codegen/llvm/instructions/comparison.cpp‎

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,49 +43,54 @@ ProcessResult Comparison::process(LLVMInstruction *ins)
4343
LLVMInstruction *Comparison::buildCmpEQ(LLVMInstruction *ins)
4444
{
4545
assert(ins->args.size() == 2);
46-
const auto &arg1 = ins->args[0].second;
47-
const auto &arg2 = ins->args[1].second;
48-
ins->functionReturnReg->value = m_utils.createComparison(arg1, arg2, LLVMBuildUtils::Comparison::EQ);
46+
const auto &args = ins->getArgs();
47+
const auto &arg1 = args[0].second;
48+
const auto &arg2 = args[1].second;
49+
ins->getFunctionReturnReg()->value = m_utils.createComparison(arg1, arg2, LLVMBuildUtils::Comparison::EQ);
4950

5051
return ins->getNext();
5152
}
5253

5354
LLVMInstruction *Comparison::buildCmpGT(LLVMInstruction *ins)
5455
{
5556
assert(ins->args.size() == 2);
56-
const auto &arg1 = ins->args[0].second;
57-
const auto &arg2 = ins->args[1].second;
58-
ins->functionReturnReg->value = m_utils.createComparison(arg1, arg2, LLVMBuildUtils::Comparison::GT);
57+
const auto &args = ins->getArgs();
58+
const auto &arg1 = args[0].second;
59+
const auto &arg2 = args[1].second;
60+
ins->getFunctionReturnReg()->value = m_utils.createComparison(arg1, arg2, LLVMBuildUtils::Comparison::GT);
5961

6062
return ins->getNext();
6163
}
6264

6365
LLVMInstruction *Comparison::buildCmpLT(LLVMInstruction *ins)
6466
{
6567
assert(ins->args.size() == 2);
66-
const auto &arg1 = ins->args[0].second;
67-
const auto &arg2 = ins->args[1].second;
68-
ins->functionReturnReg->value = m_utils.createComparison(arg1, arg2, LLVMBuildUtils::Comparison::LT);
68+
const auto &args = ins->getArgs();
69+
const auto &arg1 = args[0].second;
70+
const auto &arg2 = args[1].second;
71+
ins->getFunctionReturnReg()->value = m_utils.createComparison(arg1, arg2, LLVMBuildUtils::Comparison::LT);
6972

7073
return ins->getNext();
7174
}
7275

7376
LLVMInstruction *Comparison::buildStrCmpEQCS(LLVMInstruction *ins)
7477
{
7578
assert(ins->args.size() == 2);
76-
const auto &arg1 = ins->args[0].second;
77-
const auto &arg2 = ins->args[1].second;
78-
ins->functionReturnReg->value = m_utils.createStringComparison(arg1, arg2, true);
79+
const auto &args = ins->getArgs();
80+
const auto &arg1 = args[0].second;
81+
const auto &arg2 = args[1].second;
82+
ins->getFunctionReturnReg()->value = m_utils.createStringComparison(arg1, arg2, true);
7983

8084
return ins->getNext();
8185
}
8286

8387
LLVMInstruction *Comparison::buildStrCmpEQCI(LLVMInstruction *ins)
8488
{
8589
assert(ins->args.size() == 2);
86-
const auto &arg1 = ins->args[0].second;
87-
const auto &arg2 = ins->args[1].second;
88-
ins->functionReturnReg->value = m_utils.createStringComparison(arg1, arg2, false);
90+
const auto &args = ins->getArgs();
91+
const auto &arg1 = args[0].second;
92+
const auto &arg2 = args[1].second;
93+
ins->getFunctionReturnReg()->value = m_utils.createStringComparison(arg1, arg2, false);
8994

9095
return ins->getNext();
9196
}

‎src/engine/internal/codegen/llvm/instructions/control.cpp‎

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,10 @@ ProcessResult Control::process(LLVMInstruction *ins)
8383
LLVMInstruction *Control::buildSelect(LLVMInstruction *ins)
8484
{
8585
assert(ins->args.size() == 3);
86-
const auto &arg1 = ins->args[0];
87-
const auto &arg2 = ins->args[1];
88-
const auto &arg3 = ins->args[2];
86+
const auto &args = ins->getArgs();
87+
const auto &arg1 = args[0];
88+
const auto &arg2 = args[1];
89+
const auto &arg3 = args[2];
8990
auto type = arg2.first;
9091
llvm::Value *cond = m_utils.castValue(arg1.second, arg1.first);
9192
llvm::Value *trueValue;
@@ -99,9 +100,9 @@ LLVMInstruction *Control::buildSelect(LLVMInstruction *ins)
99100
falseValue = m_utils.createValue(arg3.second);
100101
}
101102

102-
ins->functionReturnReg->value = m_builder.CreateSelect(cond, trueValue, falseValue);
103-
ins->functionReturnReg->isInt = m_builder.CreateSelect(cond, arg2.second->isInt, arg3.second->isInt);
104-
ins->functionReturnReg->intValue = m_builder.CreateSelect(cond, arg2.second->intValue, arg3.second->intValue);
103+
ins->getFunctionReturnReg()->value = m_builder.CreateSelect(cond, trueValue, falseValue);
104+
ins->getFunctionReturnReg()->isInt = m_builder.CreateSelect(cond, arg2.second->isInt, arg3.second->isInt);
105+
ins->getFunctionReturnReg()->intValue = m_builder.CreateSelect(cond, arg2.second->intValue, arg3.second->intValue);
105106
return ins->getNext();
106107
}
107108

@@ -119,7 +120,8 @@ LLVMInstruction *Control::buildBeginIf(LLVMInstruction *ins)
119120

120121
// Use last reg
121122
assert(ins->args.size() == 1);
122-
const auto &reg = ins->args[0];
123+
const auto &args = ins->getArgs();
124+
const auto &reg = args[0];
123125
assert(reg.first == Compiler::StaticType::Bool);
124126
statement.condition = m_utils.castValue(reg.second, reg.first);
125127

@@ -205,7 +207,8 @@ LLVMInstruction *Control::buildBeginRepeatLoop(LLVMInstruction *ins)
205207

206208
// Use last reg for count
207209
assert(ins->args.size() == 1);
208-
const auto &reg = ins->args[0];
210+
const auto &args = ins->getArgs();
211+
const auto &reg = args[0];
209212
assert(reg.first == Compiler::StaticType::Number);
210213
llvm::Value *count = m_utils.castValue(reg.second, reg.first);
211214
llvm::Value *isInf = m_builder.CreateFCmpOEQ(count, llvm::ConstantFP::getInfinity(m_builder.getDoubleTy(), false));
@@ -249,9 +252,9 @@ LLVMInstruction *Control::buildLoopIndex(LLVMInstruction *ins)
249252
assert(!m_utils.loops().empty());
250253
LLVMLoop &loop = m_utils.loops().back();
251254
llvm::Value *index = m_builder.CreateLoad(m_builder.getInt64Ty(), loop.index);
252-
ins->functionReturnReg->value = m_builder.CreateUIToFP(index, m_builder.getDoubleTy());
253-
ins->functionReturnReg->intValue = index;
254-
ins->functionReturnReg->isInt = m_builder.getInt1(true);
255+
ins->getFunctionReturnReg()->value = m_builder.CreateUIToFP(index, m_builder.getDoubleTy());
256+
ins->getFunctionReturnReg()->intValue = index;
257+
ins->getFunctionReturnReg()->isInt = m_builder.getInt1(true);
255258

256259
return ins->getNext();
257260
}
@@ -270,7 +273,8 @@ LLVMInstruction *Control::buildBeginWhileLoop(LLVMInstruction *ins)
270273

271274
// Use last reg
272275
assert(ins->args.size() == 1);
273-
const auto &reg = ins->args[0];
276+
const auto &args = ins->getArgs();
277+
const auto &reg = args[0];
274278
assert(reg.first == Compiler::StaticType::Bool);
275279
llvm::Value *condition = m_utils.castValue(reg.second, reg.first);
276280
m_builder.CreateCondBr(condition, body, loop.afterLoop);
@@ -295,7 +299,8 @@ LLVMInstruction *Control::buildBeginRepeatUntilLoop(LLVMInstruction *ins)
295299

296300
// Use last reg
297301
assert(ins->args.size() == 1);
298-
const auto &reg = ins->args[0];
302+
const auto &args = ins->getArgs();
303+
const auto &reg = args[0];
299304
assert(reg.first == Compiler::StaticType::Bool);
300305
llvm::Value *condition = m_utils.castValue(reg.second, reg.first);
301306
m_builder.CreateCondBr(condition, loop.afterLoop, body);
@@ -374,7 +379,8 @@ LLVMInstruction *Control::buildPrint(LLVMInstruction *ins)
374379
{
375380
assert(ins->args.size() == 1);
376381

377-
const auto &arg = ins->args[0];
382+
const auto &args = ins->getArgs();
383+
const auto &arg = args[0];
378384
llvm::Value *str = m_utils.castValue(arg.second, arg.first);
379385

380386
m_builder.CreateCall(m_utils.functions().resolve_llvm_print(), str);

‎src/engine/internal/codegen/llvm/instructions/functions.cpp‎

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ LLVMInstruction *Functions::buildFunctionCall(LLVMInstruction *ins)
3535
// Strings are returned through an output parameter
3636
llvm::Value *stringRet = nullptr;
3737

38-
if (ins->functionReturnReg && ins->functionReturnReg->type() == Compiler::StaticType::String) {
38+
if (ins->getFunctionReturnReg() && ins->getFunctionReturnReg()->type() == Compiler::StaticType::String) {
3939
stringRet = m_utils.addStringAlloca();
4040
types.push_back(m_utils.getType(Compiler::StaticType::String, false));
4141
args.push_back(stringRet);
@@ -54,22 +54,24 @@ LLVMInstruction *Functions::buildFunctionCall(LLVMInstruction *ins)
5454
}
5555

5656
// Args
57-
for (auto &arg : ins->args) {
57+
const auto &insArgs = ins->getArgs();
58+
59+
for (auto &arg : insArgs) {
5860
types.push_back(m_utils.getType(arg.first, false));
5961
args.push_back(m_utils.castValue(arg.second, arg.first));
6062
}
6163

62-
llvm::Type *retType = m_utils.getType(ins->functionReturnReg ? ins->functionReturnReg->type() : Compiler::StaticType::Void, true);
64+
llvm::Type *retType = m_utils.getType(ins->getFunctionReturnReg() ? ins->getFunctionReturnReg()->type() : Compiler::StaticType::Void, true);
6365
llvm::Value *ret = m_builder.CreateCall(m_utils.functions().resolveFunction(ins->functionName, llvm::FunctionType::get(retType, types, false)), args);
6466

65-
if (ins->functionReturnReg) {
66-
if (ins->functionReturnReg->type() == Compiler::StaticType::String)
67-
ins->functionReturnReg->value = stringRet;
68-
else if (m_utils.isSingleType(ins->functionReturnReg->type()))
69-
ins->functionReturnReg->value = ret;
67+
if (ins->getFunctionReturnReg()) {
68+
if (ins->getFunctionReturnReg()->type() == Compiler::StaticType::String)
69+
ins->getFunctionReturnReg()->value = stringRet;
70+
else if (m_utils.isSingleType(ins->getFunctionReturnReg()->type()))
71+
ins->getFunctionReturnReg()->value = ret;
7072
else {
71-
ins->functionReturnReg->value = m_utils.addAlloca(retType);
72-
m_builder.CreateStore(ret, ins->functionReturnReg->value);
73+
ins->getFunctionReturnReg()->value = m_utils.addAlloca(retType);
74+
m_builder.CreateStore(ret, ins->getFunctionReturnReg()->value);
7375
}
7476
}
7577

‎src/engine/internal/codegen/llvm/instructions/instructionbuilder.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ LLVMInstruction *InstructionBuilder::process(LLVMInstruction *ins)
3939

4040
if (result.match) {
4141
#ifndef LLVM_INTEGER_SUPPORT
42-
if (ins->functionReturnReg)
43-
ins->functionReturnReg->isInt = m_utils.builder().getInt1(false);
42+
if (ins->getFunctionReturnReg())
43+
ins->getFunctionReturnReg()->isInt = m_utils.builder().getInt1(false);
4444
#endif
4545

4646
return result.next;

‎src/engine/internal/codegen/llvm/instructions/lists.cpp‎

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "../llvmbuildutils.h"
66
#include "../llvmconstantregister.h"
77
#include "../llvmcompilercontext.h"
8+
#include "../../optimizationutils.h"
89

910
using namespace libscratchcpp;
1011
using namespace libscratchcpp::llvmins;
@@ -95,7 +96,8 @@ LLVMInstruction *Lists::buildRemoveListItem(LLVMInstruction *ins)
9596
llvm::Function *function = m_utils.function();
9697

9798
assert(ins->args.size() == 1);
98-
const auto &arg = ins->args[0];
99+
const auto &args = ins->getArgs();
100+
const auto &arg = args[0];
99101

100102
LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
101103

@@ -130,8 +132,9 @@ LLVMInstruction *Lists::buildAppendToList(LLVMInstruction *ins)
130132
llvm::Function *function = m_utils.function();
131133

132134
assert(ins->args.size() == 1);
133-
const auto &arg = ins->args[0];
134-
Compiler::StaticType type = m_utils.optimizeRegisterType(arg.second);
135+
const auto &args = ins->getArgs();
136+
const auto &arg = args[0];
137+
Compiler::StaticType type = OptimizationUtils::optimizeValueType(m_utils.compilerCtx(), arg.second);
135138
LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
136139

137140
// Check if enough space is allocated
@@ -179,9 +182,10 @@ LLVMInstruction *Lists::buildInsertToList(LLVMInstruction *ins)
179182
llvm::Function *function = m_utils.function();
180183

181184
assert(ins->args.size() == 2);
182-
const auto &indexArg = ins->args[0];
183-
const auto &valueArg = ins->args[1];
184-
Compiler::StaticType type = m_utils.optimizeRegisterType(valueArg.second);
185+
const auto &args = ins->getArgs();
186+
const auto &indexArg = args[0];
187+
const auto &valueArg = args[1];
188+
Compiler::StaticType type = OptimizationUtils::optimizeValueType(m_utils.compilerCtx(), valueArg.second);
185189
LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
186190

187191
// Range check
@@ -225,9 +229,10 @@ LLVMInstruction *Lists::buildListReplace(LLVMInstruction *ins)
225229
llvm::Function *function = m_utils.function();
226230

227231
assert(ins->args.size() == 2);
228-
const auto &indexArg = ins->args[0];
229-
const auto &valueArg = ins->args[1];
230-
Compiler::StaticType type = m_utils.optimizeRegisterType(valueArg.second);
232+
const auto &args = ins->getArgs();
233+
const auto &indexArg = args[0];
234+
const auto &valueArg = args[1];
235+
Compiler::StaticType type = OptimizationUtils::optimizeValueType(m_utils.compilerCtx(), valueArg.second);
231236
LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
232237

233238
Compiler::StaticType listType = ins->targetType;
@@ -272,7 +277,7 @@ LLVMInstruction *Lists::buildGetListContents(LLVMInstruction *ins)
272277
const LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
273278
llvm::Value *ptr = m_utils.addStringAlloca();
274279
m_builder.CreateCall(m_utils.functions().resolve_list_to_string(), { listPtr.ptr, ptr });
275-
ins->functionReturnReg->value = ptr;
280+
ins->getFunctionReturnReg()->value = ptr;
276281

277282
return ins->getNext();
278283
}
@@ -285,12 +290,13 @@ LLVMInstruction *Lists::buildGetListItem(LLVMInstruction *ins)
285290
// Return empty string for empty lists
286291
if (ins->targetType == Compiler::StaticType::Void) {
287292
LLVMConstantRegister nullReg(Compiler::StaticType::String, "");
288-
ins->functionReturnReg->value = m_utils.createValue(static_cast<LLVMRegister *>(&nullReg));
293+
ins->getFunctionReturnReg()->value = m_utils.createValue(static_cast<LLVMRegister *>(&nullReg));
289294
return ins->getNext();
290295
}
291296

292297
assert(ins->args.size() == 1);
293-
const auto &arg = ins->args[0];
298+
const auto &args = ins->getArgs();
299+
const auto &arg = args[0];
294300
LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
295301

296302
// Range check
@@ -327,8 +333,8 @@ LLVMInstruction *Lists::buildGetListItem(LLVMInstruction *ins)
327333
itemTypeResult->addIncoming(stringType, outOfRangeBlock);
328334

329335
llvm::Value *typeVar = createListTypeVar(listPtr, itemTypeResult);
330-
ins->functionReturnReg->value = result;
331-
ins->functionReturnReg->typeVar = typeVar;
336+
ins->getFunctionReturnReg()->value = result;
337+
ins->getFunctionReturnReg()->typeVar = typeVar;
332338
createListTypeAssumption(listPtr, typeVar, ins->targetType, inRange);
333339

334340
return ins->getNext();
@@ -339,35 +345,37 @@ LLVMInstruction *Lists::buildGetListSize(LLVMInstruction *ins)
339345
assert(ins->args.size() == 0);
340346
const LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
341347
llvm::Value *size = m_utils.getListSize(listPtr);
342-
ins->functionReturnReg->value = m_builder.CreateUIToFP(size, m_builder.getDoubleTy());
343-
ins->functionReturnReg->isInt = m_builder.getInt1(true);
344-
ins->functionReturnReg->intValue = size;
348+
ins->getFunctionReturnReg()->value = m_builder.CreateUIToFP(size, m_builder.getDoubleTy());
349+
ins->getFunctionReturnReg()->isInt = m_builder.getInt1(true);
350+
ins->getFunctionReturnReg()->intValue = size;
345351

346352
return ins->getNext();
347353
}
348354

349355
LLVMInstruction *Lists::buildGetListItemIndex(LLVMInstruction *ins)
350356
{
351357
assert(ins->args.size() == 1);
352-
const auto &arg = ins->args[0];
358+
const auto &args = ins->getArgs();
359+
const auto &arg = args[0];
353360
LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
354361

355362
Compiler::StaticType listType = ins->targetType;
356363

357-
ins->functionReturnReg->value = m_builder.CreateSIToFP(m_utils.getListItemIndex(listPtr, listType, arg.second), m_builder.getDoubleTy());
364+
ins->getFunctionReturnReg()->value = m_builder.CreateSIToFP(m_utils.getListItemIndex(listPtr, listType, arg.second), m_builder.getDoubleTy());
358365
return ins->getNext();
359366
}
360367

361368
LLVMInstruction *Lists::buildListContainsItem(LLVMInstruction *ins)
362369
{
363370
assert(ins->args.size() == 1);
364-
const auto &arg = ins->args[0];
371+
const auto &args = ins->getArgs();
372+
const auto &arg = args[0];
365373
LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
366374

367375
Compiler::StaticType listType = ins->targetType;
368376

369377
llvm::Value *index = m_utils.getListItemIndex(listPtr, listType, arg.second);
370-
ins->functionReturnReg->value = m_builder.CreateICmpSGT(index, llvm::ConstantInt::get(m_builder.getInt64Ty(), -1, true));
378+
ins->getFunctionReturnReg()->value = m_builder.CreateICmpSGT(index, llvm::ConstantInt::get(m_builder.getInt64Ty(), -1, true));
371379

372380
return ins->getNext();
373381
}

0 commit comments

Comments
 (0)