Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add constant folding for unary +. It probably ought to be folded out altogether, since it serves only to trigger type checking. Add an outline of the actual process of jump threading once the threads have been determined. |
---|---|
Timelines: | family | ancestors | descendants | both | notworking | kbk-jumpthread |
Files: | files | file ages | folders |
SHA3-256: |
c388c8737b3f39611b81eff62c989bff |
User & Date: | kbk 2018-12-16 05:18:01.433 |
Original Comment: | Add constant folding for unary +. It probably ought to be folded out altogether, since it serves only to trigger type checking. |
Context
2018-12-17
| ||
22:08 | Finish jump threading - actually do the block duplication and redirection of jumps. Add the logic for SSA deconstruction (required by jump threading) and make SSA construction work with the deconstructed result. check-in: a41b93130e user: kbk tags: notworking, kbk-jumpthread | |
2018-12-16
| ||
05:18 | Add constant folding for unary +. It probably ought to be folded out altogether, since it serves only to trigger type checking. Add an outline of the actual process of jump threading once the threads have been determined. check-in: c388c8737b user: kbk tags: notworking, kbk-jumpthread | |
04:55 | Add a 'cos2' test case to illustrate the cost of non-numeric ordering comparisons check-in: 86167d6917 user: kbk tags: notworking, kbk-jumpthread | |
Changes
Changes to quadcode/constfold.tcl.
︙ | ︙ | |||
690 691 692 693 694 695 696 697 698 699 700 701 702 703 | } dict unset udchain $result my replaceUses $result $res set changed 1 continue; # delete the quad } "unset" { my debug-constfold { puts "$b:$pc: $q" puts " replace $result with Nothing" } dict unset udchain $result my replaceUses $result Nothing | > > > > > > > > > > > > | 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 | } dict unset udchain $result my replaceUses $result $res set changed 1 continue; # delete the quad } "uplus" { set res [list literal [lindex $argl 0]] my debug-constfold { puts "$b:$pc: $q" puts " replace $result with $res" } dict unset udchain $result my replaceUses $result $res set changed 1 continue; # delete the quad } "unset" { my debug-constfold { puts "$b:$pc: $q" puts " replace $result with Nothing" } dict unset udchain $result my replaceUses $result Nothing |
︙ | ︙ |
Changes to quadcode/jumpthread.tcl.
︙ | ︙ | |||
163 164 165 166 167 168 169 | # Identify which subsets of the conditions are reachable on specific # control flow paths, so that blocks can be replicated to have known # entry conditions. Also report the (up to two) successors for each # variant block. my jt_forward | < < | < < | < < | > | > | > < > > > | < | | > | < > | | > | | | | 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | # Identify which subsets of the conditions are reachable on specific # control flow paths, so that blocks can be replicated to have known # entry conditions. Also report the (up to two) successors for each # variant block. my jt_forward # Determine whether the division into variants is trying to split # anything. if {[my jt_has_multiple_variants]} { # TODO - IMPLEMENT THE FOLLOWING my jt_cleanup; return 0 # We will be splitting paths. This is a relatively 'violent' # change to the program, and it's insanely difficult to maintain SSA # through it. Instead, we deconstruct the SSA form, split the paths # in the deconstructed version, and then rebuild SSA. (We then have # to solve for ud- and du-chains again. my ssa_deconstruct my jt_split_paths my ssa my ud_du_chain } # Clean up the working storage my jt_cleanup return 0 } # quadcode::transformer method jt_unpackPhis -- # |
︙ | ︙ | |||
1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 | return [expr {($u & $IMPURE) == 0}]; # Can't be true } elseif {[quadcode::dataType::mightbea $u $v]} { return 0 } else { return 1 } } # quadcode::transformer method jt_cleanup -- # # Cleans up working storage after the jump threading pass. # # Results: # None. | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 | return [expr {($u & $IMPURE) == 0}]; # Can't be true } elseif {[quadcode::dataType::mightbea $u $v]} { return 0 } else { return 1 } } # quadcode::transformer method jt_has_multiple_variants -- # # Determine whether jump threading has found any work to do. # # Results: # Returns 1 if the program should be rewritten, 0 otherwise. oo::define quadcode::transformer method jt_has_multiple_variants {} { my variable jt_variants my debug-jumpthread { puts "Variants found:" set b -1 foreach vs $jt_variants { incr b dict for {m ss} $vs { puts [format " %d (%llx): %s" $b $m $ss] } } } set b -1 foreach vs $jt_variants { incr b if {[dict size $vs] > 1} { return 1 } } return 0 } # quadcode::transformer method jt_cleanup -- # # Cleans up working storage after the jump threading pass. # # Results: # None. |
︙ | ︙ |