mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-11 15:21:51 +00:00
Unroll loops by 8 and enable some additional passes
This commit is contained in:
parent
606b7f5a00
commit
b3be0d22cc
3 changed files with 19 additions and 3 deletions
|
@ -434,6 +434,9 @@ LLVMProgram::LLVMProgram()
|
||||||
passManagerBuilder.OptLevel = 3;
|
passManagerBuilder.OptLevel = 3;
|
||||||
passManagerBuilder.SizeLevel = 0;
|
passManagerBuilder.SizeLevel = 0;
|
||||||
passManagerBuilder.Inliner = createFunctionInliningPass();
|
passManagerBuilder.Inliner = createFunctionInliningPass();
|
||||||
|
passManagerBuilder.SLPVectorize = true;
|
||||||
|
passManagerBuilder.LoopVectorize = true;
|
||||||
|
passManagerBuilder.LoadCombine = true;
|
||||||
passManagerBuilder.populateModulePassManager(*mModulePassManager.get());
|
passManagerBuilder.populateModulePassManager(*mModulePassManager.get());
|
||||||
passManagerBuilder.populateFunctionPassManager(*mFunctionPassManager.get());
|
passManagerBuilder.populateFunctionPassManager(*mFunctionPassManager.get());
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,22 @@ SSAForBlock::SSAForBlock()
|
||||||
SSAScope::builder().SetInsertPoint(if_basic_block);
|
SSAScope::builder().SetInsertPoint(if_basic_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSAForBlock::loop_block(SSABool true_condition)
|
void SSAForBlock::loop_block(SSABool true_condition, int unroll_count)
|
||||||
{
|
{
|
||||||
SSAScope::builder().CreateCondBr(true_condition.v, loop_basic_block, end_basic_block);
|
auto branch = SSAScope::builder().CreateCondBr(true_condition.v, loop_basic_block, end_basic_block);
|
||||||
|
if (unroll_count > 0)
|
||||||
|
{
|
||||||
|
using namespace llvm;
|
||||||
|
auto md_unroll_enable = MDNode::get(SSAScope::context(), {
|
||||||
|
MDString::get(SSAScope::context(), "llvm.loop.unroll.enable")
|
||||||
|
});
|
||||||
|
auto md_unroll_count = MDNode::get(SSAScope::context(), {
|
||||||
|
MDString::get(SSAScope::context(), "llvm.loop.unroll.count"),
|
||||||
|
ConstantAsMetadata::get(ConstantInt::get(SSAScope::context(), APInt(32, unroll_count)))
|
||||||
|
});
|
||||||
|
auto md_loop = MDNode::getDistinct(SSAScope::context(), { md_unroll_enable, md_unroll_count });
|
||||||
|
branch->setMetadata(LLVMContext::MD_loop, md_loop);
|
||||||
|
}
|
||||||
SSAScope::builder().SetInsertPoint(loop_basic_block);
|
SSAScope::builder().SetInsertPoint(loop_basic_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ class SSAForBlock
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SSAForBlock();
|
SSAForBlock();
|
||||||
void loop_block(SSABool true_condition);
|
void loop_block(SSABool true_condition, int unroll_count = 8);
|
||||||
void end_block();
|
void end_block();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in a new issue