Skip to content

Commit 3cbee99

Browse files
committed
Merge branch 'iropt' of github.com:Althra/gnalc into iropt
2 parents 2afa681 + a2a7272 commit 3cbee99

2 files changed

Lines changed: 56 additions & 10 deletions

File tree

lib/ir/passes/transforms/loop_unroll.cpp

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include <memory>
2222
#include <vector>
2323

24+
#define ENABLE_NEW_RT_PATH 0
25+
2426
namespace IR {
2527

2628
unsigned LoopUnrollPass::name_idx = 0;
@@ -362,12 +364,21 @@ void LoopUnrollPass::analyze(const pLoop &loop, UnrollOption &option, Function &
362364
}
363365
auto stepMremV = std::make_shared<BinaryInst>("rtunroll.stepMrem." + std::to_string(name_idx), OP::MUL, stepV, remainderV);
364366
prolog->addInst(stepMremV);
367+
// new_boundary = raw_boundary - step * remainder
365368
auto new_boundaryV = std::make_shared<BinaryInst>("rtunroll.new_boundary." + std::to_string(name_idx), OP::SUB, raw_boundary_value, stepMremV);
366369
prolog->addInst(new_boundaryV);
367-
auto trip_count_less_than_unroll_factorV = std::make_shared<ICMPInst>("rtunroll.tcLTuf." + std::to_string(name_idx),
368-
ICMPOP::slt, trip_countV, unroll_factorV);
369-
trip_count_less_than_unroll_factorV->appendDbgData("trip_count_less_than_unroll_factor");
370-
prolog->addInst(trip_count_less_than_unroll_factorV);
370+
371+
// tcLTuf and epilog (for dowhile)
372+
#if ENABLE_NEW_RT_PATH
373+
if (is_dowhile) {
374+
#endif
375+
auto trip_count_less_than_unroll_factorV = std::make_shared<ICMPInst>("rtunroll.tcLTuf." + std::to_string(name_idx),
376+
ICMPOP::slt, trip_countV, unroll_factorV);
377+
trip_count_less_than_unroll_factorV->appendDbgData("trip_count_less_than_unroll_factor");
378+
prolog->addInst(trip_count_less_than_unroll_factorV);
379+
#if ENABLE_NEW_RT_PATH
380+
}
381+
#endif
371382

372383
// epilog (for dowhile)
373384
if (is_dowhile) {
@@ -986,17 +997,33 @@ bool LoopUnrollPass::unroll(const pLoop &loop, const UnrollOption &option, Funct
986997
auto prolog = option.prologue;
987998
auto epilog = option.epilogue;
988999
Err::gassert(prolog != nullptr && epilog != nullptr, "LoopUnroll: Runtime unroll prolog or epilog is nullptr.");
989-
990-
// Add branch inst to prolog
991-
pIcmp prolog_icmp = prolog->getTerminator()->as<ICMPInst>();
1000+
9921001
pB rem_header = BMap[header][count];
993-
pBr prolog_br = std::make_shared<BRInst>(prolog_icmp, rem_header, header);
994-
prolog->addInst(prolog_br);
1002+
1003+
// Add branch inst to prolog
1004+
#if ENABLE_NEW_RT_PATH
1005+
if (!is_dowhile) {
1006+
pBr prolog_br = std::make_shared<BRInst>(header);
1007+
prolog->addInst(prolog_br);
1008+
} else {
1009+
#endif
1010+
pIcmp prolog_icmp = prolog->getTerminator()->as<ICMPInst>();
1011+
pBr prolog_br = std::make_shared<BRInst>(prolog_icmp, rem_header, header);
1012+
prolog->addInst(prolog_br);
1013+
#if ENABLE_NEW_RT_PATH
1014+
}
1015+
#endif
9951016

9961017
// Link prolog
9971018
pre_header->getBRInst()->replaceAllOperands(header, prolog);
9981019
for (auto &phi : header->phis()) {
999-
IMap[phi][count]->as<PHIInst>()->addPhiOper(phi->getValueForBlock(pre_header), prolog);
1020+
#if ENABLE_NEW_RT_PATH
1021+
if (is_dowhile) {
1022+
#endif
1023+
IMap[phi][count]->as<PHIInst>()->addPhiOper(phi->getValueForBlock(pre_header), prolog);
1024+
#if ENABLE_NEW_RT_PATH
1025+
}
1026+
#endif
10001027
phi->replaceAllOperands(pre_header, prolog);
10011028
}
10021029

test/benchmark_registry.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,24 @@ void register_gnalc_fuzz100() {
239239
BenchmarkRegistry::register_benchmark("gnalc_fuzz100", entry);
240240
}
241241

242+
// Requires ./gnalc2
243+
Entry gnalc2_register_helper(const std::string &param) {
244+
Entry entry{
245+
.ir_gen = [param](const std::string &newsy, const std::string &outll) {
246+
return format("../gnalc2 -with-runtime -emit-llvm -S {} -o {} {}", newsy, outll, param);
247+
},
248+
.asm_gen = [param](const std::string &newsy, const std::string &outs) {
249+
return format("../gnalc2 -with-runtime -S {} -o {} {}", newsy, outs, param);
250+
}
251+
};
252+
return entry;
253+
}
254+
255+
void register_gnalc2_fixed() {
256+
auto entry = gnalc2_register_helper("-fixed-point");
257+
BenchmarkRegistry::register_benchmark("gnalc2_fixed", entry);
258+
}
259+
242260
void Test::register_all_benchmarks() {
243261
register_example_0();
244262
register_example_1();
@@ -267,4 +285,5 @@ void Test::register_all_benchmarks() {
267285
register_gnalc_fuzz5();
268286
register_gnalc_fuzz10();
269287
register_gnalc_fuzz100();
288+
register_gnalc2_fixed();
270289
}

0 commit comments

Comments
 (0)