Skip to content

Commit c1674b2

Browse files
committed
LLVMCodeBuilder: Force variable heap pointer when in non-warp loop cond
1 parent 5c97491 commit c1674b2

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

src/engine/internal/llvm/llvmcodebuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
670670
if (!isVariableTypeSafe(insPtr, varPtr.type))
671671
varPtr.type = Compiler::StaticType::Unknown;
672672

673-
step.functionReturnReg->value = varPtr.onStack ? varPtr.stackPtr : varPtr.heapPtr;
673+
step.functionReturnReg->value = varPtr.onStack && !(step.loopCondition && !m_warp) ? varPtr.stackPtr : varPtr.heapPtr;
674674
step.functionReturnReg->setType(varPtr.type);
675675
break;
676676
}

test/llvm/llvmcodebuilder_test.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2843,6 +2843,28 @@ TEST_F(LLVMCodeBuilderTest, VariablesAfterSuspend)
28432843
v = m_builder->addVariableValue(globalVar.get());
28442844
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String }, { v });
28452845

2846+
v = m_builder->addConstValue(0);
2847+
m_builder->createVariableWrite(localVar.get(), v);
2848+
2849+
m_builder->beginLoopCondition();
2850+
v = m_builder->createCmpLT(m_builder->addVariableValue(localVar.get()), m_builder->addConstValue(3));
2851+
m_builder->beginWhileLoop(v);
2852+
m_builder->endLoop();
2853+
2854+
v = m_builder->addVariableValue(localVar.get());
2855+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String }, { v });
2856+
2857+
v = m_builder->addConstValue(0);
2858+
m_builder->createVariableWrite(localVar.get(), v);
2859+
2860+
m_builder->beginLoopCondition();
2861+
v = m_builder->createCmpEQ(m_builder->addVariableValue(localVar.get()), m_builder->addConstValue(2));
2862+
m_builder->beginRepeatUntilLoop(v);
2863+
m_builder->endLoop();
2864+
2865+
v = m_builder->addVariableValue(localVar.get());
2866+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String }, { v });
2867+
28462868
std::string expected =
28472869
"hello world\n"
28482870
"-4.8\n";
@@ -2876,6 +2898,41 @@ TEST_F(LLVMCodeBuilderTest, VariablesAfterSuspend)
28762898
testing::internal::CaptureStdout();
28772899
code->run(ctx.get());
28782900
ASSERT_EQ(testing::internal::GetCapturedStdout(), "true\n");
2901+
ASSERT_FALSE(code->isFinished(ctx.get()));
2902+
2903+
localVar->setValue(1);
2904+
2905+
testing::internal::CaptureStdout();
2906+
code->run(ctx.get());
2907+
ASSERT_EQ(testing::internal::GetCapturedStdout(), "");
2908+
ASSERT_FALSE(code->isFinished(ctx.get()));
2909+
2910+
localVar->setValue("2");
2911+
2912+
testing::internal::CaptureStdout();
2913+
code->run(ctx.get());
2914+
ASSERT_EQ(testing::internal::GetCapturedStdout(), "");
2915+
ASSERT_FALSE(code->isFinished(ctx.get()));
2916+
2917+
localVar->setValue(3);
2918+
2919+
testing::internal::CaptureStdout();
2920+
code->run(ctx.get());
2921+
ASSERT_EQ(testing::internal::GetCapturedStdout(), "3\n");
2922+
ASSERT_FALSE(code->isFinished(ctx.get()));
2923+
2924+
localVar->setValue(1);
2925+
2926+
testing::internal::CaptureStdout();
2927+
code->run(ctx.get());
2928+
ASSERT_EQ(testing::internal::GetCapturedStdout(), "");
2929+
ASSERT_FALSE(code->isFinished(ctx.get()));
2930+
2931+
localVar->setValue(2);
2932+
2933+
testing::internal::CaptureStdout();
2934+
code->run(ctx.get());
2935+
ASSERT_EQ(testing::internal::GetCapturedStdout(), "2\n");
28792936
}
28802937

28812938
TEST_F(LLVMCodeBuilderTest, ListsAfterSuspend)

0 commit comments

Comments
 (0)