Skip to content

Commit e915069

Browse files
committed
Enforce 'musttail' for assured tail call optimization
The 'musttail' attribute is enforced for return statements that yield the result of a function call. This enhancement ensures more efficient code generation by Clang.
1 parent d9b55ab commit e915069

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

src/rv32_template.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ RVOP(jal, {
3131
/* check instruction misaligned */
3232
RV_EXC_MISALIGN_HANDLER(pc, insn, false, 0);
3333
if (ir->branch_taken)
34-
return ir->branch_taken->impl(rv, ir->branch_taken, cycle, PC);
34+
MUST_TAIL return ir->branch_taken->impl(rv, ir->branch_taken, cycle,
35+
PC);
3536
rv->csr_cycle = cycle;
3637
rv->PC = PC;
3738
return true;
@@ -55,7 +56,7 @@ RVOP(jalr, {
5556
RV_EXC_MISALIGN_HANDLER(pc, insn, false, 0);
5657
block_t *block = block_find(&rv->block_map, PC);
5758
if (block)
58-
return block->ir_head->impl(rv, block->ir_head, cycle, PC);
59+
MUST_TAIL return block->ir_head->impl(rv, block->ir_head, cycle, PC);
5960
rv->csr_cycle = cycle;
6061
rv->PC = PC;
6162
return true;
@@ -70,15 +71,17 @@ RVOP(jalr, {
7071
goto nextop; \
7172
PC += 4; \
7273
last_pc = PC; \
73-
return ir->branch_untaken->impl(rv, ir->branch_untaken, cycle, PC); \
74+
MUST_TAIL return ir->branch_untaken->impl(rv, ir->branch_untaken, \
75+
cycle, PC); \
7476
} \
7577
branch_taken = true; \
7678
PC += ir->imm; \
7779
/* check instruction misaligned */ \
7880
RV_EXC_MISALIGN_HANDLER(pc, insn, false, 0); \
7981
if (ir->branch_taken) { \
8082
last_pc = PC; \
81-
return ir->branch_taken->impl(rv, ir->branch_taken, cycle, PC); \
83+
MUST_TAIL return ir->branch_taken->impl(rv, ir->branch_taken, \
84+
cycle, PC); \
8285
} \
8386
rv->csr_cycle = cycle; \
8487
rv->PC = PC; \
@@ -824,7 +827,8 @@ RVOP(cjal, {
824827
PC += ir->imm;
825828
RV_EXC_MISALIGN_HANDLER(PC, insn, true, 0);
826829
if (ir->branch_taken)
827-
return ir->branch_taken->impl(rv, ir->branch_taken, cycle, PC);
830+
MUST_TAIL return ir->branch_taken->impl(rv, ir->branch_taken, cycle,
831+
PC);
828832
rv->csr_cycle = cycle;
829833
rv->PC = PC;
830834
return true;
@@ -894,7 +898,8 @@ RVOP(cj, {
894898
PC += ir->imm;
895899
RV_EXC_MISALIGN_HANDLER(PC, insn, true, 0);
896900
if (ir->branch_taken)
897-
return ir->branch_taken->impl(rv, ir->branch_taken, cycle, PC);
901+
MUST_TAIL return ir->branch_taken->impl(rv, ir->branch_taken, cycle,
902+
PC);
898903
rv->csr_cycle = cycle;
899904
rv->PC = PC;
900905
return true;
@@ -912,13 +917,15 @@ RVOP(cbeqz, {
912917
goto nextop;
913918
PC += 2;
914919
last_pc = PC;
915-
return ir->branch_untaken->impl(rv, ir->branch_untaken, cycle, PC);
920+
MUST_TAIL return ir->branch_untaken->impl(rv, ir->branch_untaken, cycle,
921+
PC);
916922
}
917923
branch_taken = true;
918924
PC += (uint32_t) ir->imm;
919925
if (ir->branch_taken) {
920926
last_pc = PC;
921-
return ir->branch_taken->impl(rv, ir->branch_taken, cycle, PC);
927+
MUST_TAIL return ir->branch_taken->impl(rv, ir->branch_taken, cycle,
928+
PC);
922929
}
923930
rv->csr_cycle = cycle;
924931
rv->PC = PC;
@@ -933,13 +940,15 @@ RVOP(cbnez, {
933940
goto nextop;
934941
PC += 2;
935942
last_pc = PC;
936-
return ir->branch_untaken->impl(rv, ir->branch_untaken, cycle, PC);
943+
MUST_TAIL return ir->branch_untaken->impl(rv, ir->branch_untaken, cycle,
944+
PC);
937945
}
938946
branch_taken = true;
939947
PC += (uint32_t) ir->imm;
940948
if (ir->branch_taken) {
941949
last_pc = PC;
942-
return ir->branch_taken->impl(rv, ir->branch_taken, cycle, PC);
950+
MUST_TAIL return ir->branch_taken->impl(rv, ir->branch_taken, cycle,
951+
PC);
943952
}
944953
rv->csr_cycle = cycle;
945954
rv->PC = PC;
@@ -964,7 +973,7 @@ RVOP(cjr, {
964973
PC = rv->X[ir->rs1];
965974
block_t *block = block_find(&rv->block_map, PC);
966975
if (block)
967-
return block->ir_head->impl(rv, block->ir_head, cycle, PC);
976+
MUST_TAIL return block->ir_head->impl(rv, block->ir_head, cycle, PC);
968977
rv->csr_cycle = cycle;
969978
rv->PC = PC;
970979
return true;
@@ -991,7 +1000,7 @@ RVOP(cjalr, {
9911000
RV_EXC_MISALIGN_HANDLER(PC, insn, true, 0);
9921001
block_t *block = block_find(&rv->block_map, PC);
9931002
if (block)
994-
return block->ir_head->impl(rv, block->ir_head, cycle, PC);
1003+
MUST_TAIL return block->ir_head->impl(rv, block->ir_head, cycle, PC);
9951004
rv->csr_cycle = cycle;
9961005
rv->PC = PC;
9971006
return true;

0 commit comments

Comments
 (0)