Convert riscv scf to riscv cf
convert_riscv_scf_to_riscv_cf
¶
LowerRiscvScfForPattern
¶
Bases: RewritePattern
Inline the for loop body into its parent region, using Blocks to represent control
flow. The Block containing the ForOp is split into two, and the blocks in the
body of the for loop are spliced between them. Additional operations are inserted
into the block before, and the block after to handle the initialization of the
iteration argument, and loop-carried variables, as well as control flow. If the for
loop contained other riscv_scf ops, they will have been rewritten by the time this
rewrite is called. Two comparison operations are inserted, one just before the loop
blocks, skipping the loop entirely if the condition is not met, and one at the end of
the loop body, to exit or continue the loop. A canonicalization step may be able to
eliminate the first check if the bounds are known at compile time.
+--------------------------------------------------------------+
| <code before the ForOp> |
| <definitions of %args_init...> |
| <compute initial %iv value> |
| riscv_cf.bge %iv, %ub, end, body (%iv, %args_init...) |
+--------------------------------------------------------------+
| |
-------------------| | -----------------------|
| v v |
| +--------------------------------------------------------------+ |
| | body-first(%iv, %args_body...): | |
| | <body contents> | |
| +--------------------------------------------------------------+ |
| | |
| ... |
| | |
| +--------------------------------------------------------------+ |
| | body-last: | |
| | <body contents> | |
| | <%yields... = operands of yield> | |
| | <%ub and %step visible by dominance> | |
| | %new_iv =<add %step to %iv> | |
| | riscv_cf.blt %new_iv, %ub, body, end (%new_iv, %yields...) | |
| +--------------------------------------------------------------+ |
| | | |
|------------------ | |-----------------------
v v
+--------------------------------------------------------------+
| end(%iv, %args_end...): |
| <results of ForOp = %args_end> |
| <code after the ForOp> |
+--------------------------------------------------------------+
Source code in xdsl/backend/riscv/lowering/convert_riscv_scf_to_riscv_cf.py
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | |
for_idx: int = -1
instance-attribute
¶
__init__()
¶
match_and_rewrite(op: riscv_scf.ForOp, rewriter: PatternRewriter)
¶
Source code in xdsl/backend/riscv/lowering/convert_riscv_scf_to_riscv_cf.py
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | |
ConvertRiscvScfToRiscvCfPass
dataclass
¶
Bases: ModulePass