llvm.org GIT mirror llvm / 7b98fc0
[PGO][CHR] Speed up following long use-def chains. Summary: Avoid visiting an instruction more than once by using a map. Reviewers: davidxl Reviewed By: davidxl Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D62262 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361416 91177308-0d34-0410-b5e6-96231b3b80d8 Hiroshi Yamauchi 3 months ago
2 changed file(s) with 336 addition(s) and 9 deletion(s). Raw diff Collapse all Expand all
545545 static bool
546546 checkHoistValue(Value *V, Instruction *InsertPoint, DominatorTree &DT,
547547 DenseSet &Unhoistables,
548 DenseSet *HoistStops) {
548 DenseSet *HoistStops,
549 DenseMap &Visited) {
549550 assert(InsertPoint && "Null InsertPoint");
550551 if (auto *I = dyn_cast(V)) {
552 if (Visited.count(I)) {
553 return Visited[I];
554 }
551555 assert(DT.getNode(I->getParent()) && "DT must contain I's parent block");
552556 assert(DT.getNode(InsertPoint->getParent()) && "DT must contain Destination");
553557 if (Unhoistables.count(I)) {
554558 // Don't hoist if they are not to be hoisted.
559 Visited[I] = false;
555560 return false;
556561 }
557562 if (DT.dominates(I, InsertPoint)) {
558563 // We are already above the insert point. Stop here.
559564 if (HoistStops)
560565 HoistStops->insert(I);
566 Visited[I] = true;
561567 return true;
562568 }
563569 // We aren't not above the insert point, check if we can hoist it above the
567573 DenseSet OpsHoistStops;
568574 bool AllOpsHoisted = true;
569575 for (Value *Op : I->operands()) {
570 if (!checkHoistValue(Op, InsertPoint, DT, Unhoistables, &OpsHoistStops)) {
576 if (!checkHoistValue(Op, InsertPoint, DT, Unhoistables, &OpsHoistStops,
577 Visited)) {
571578 AllOpsHoisted = false;
572579 break;
573580 }
576583 CHR_DEBUG(dbgs() << "checkHoistValue " << *I << "\n");
577584 if (HoistStops)
578585 HoistStops->insert(OpsHoistStops.begin(), OpsHoistStops.end());
586 Visited[I] = true;
579587 return true;
580588 }
581589 }
590 Visited[I] = false;
582591 return false;
583592 }
584593 // Non-instructions are considered hoistable.
891900 ++it;
892901 continue;
893902 }
903 DenseMap Visited;
894904 bool IsHoistable = checkHoistValue(SI->getCondition(), InsertPoint,
895 DT, Unhoistables, nullptr);
905 DT, Unhoistables, nullptr, Visited);
896906 if (!IsHoistable) {
897907 CHR_DEBUG(dbgs() << "Dropping select " << *SI << "\n");
898908 ORE.emit([&]() {
911921 InsertPoint = getBranchInsertPoint(RI);
912922 CHR_DEBUG(dbgs() << "InsertPoint " << *InsertPoint << "\n");
913923 if (RI.HasBranch && InsertPoint != Branch) {
924 DenseMap Visited;
914925 bool IsHoistable = checkHoistValue(Branch->getCondition(), InsertPoint,
915 DT, Unhoistables, nullptr);
926 DT, Unhoistables, nullptr, Visited);
916927 if (!IsHoistable) {
917928 // If the branch isn't hoistable, drop the selects in the entry
918929 // block, preferring the branch, which makes the branch the hoist
943954 if (RI.HasBranch) {
944955 assert(!DT.dominates(Branch, InsertPoint) &&
945956 "Branch can't be already above the hoist point");
957 DenseMap Visited;
946958 assert(checkHoistValue(Branch->getCondition(), InsertPoint,
947 DT, Unhoistables, nullptr) &&
959 DT, Unhoistables, nullptr, Visited) &&
948960 "checkHoistValue for branch");
949961 }
950962 for (auto *SI : Selects) {
951963 assert(!DT.dominates(SI, InsertPoint) &&
952964 "SI can't be already above the hoist point");
965 DenseMap Visited;
953966 assert(checkHoistValue(SI->getCondition(), InsertPoint, DT,
954 Unhoistables, nullptr) &&
967 Unhoistables, nullptr, Visited) &&
955968 "checkHoistValue for selects");
956969 }
957970 CHR_DEBUG(dbgs() << "Result\n");
10521065 assert(InsertPoint && "Null InsertPoint");
10531066 // If any of Bases isn't hoistable to the hoist point, split.
10541067 for (Value *V : ConditionValues) {
1055 if (!checkHoistValue(V, InsertPoint, DT, Unhoistables, nullptr)) {
1068 DenseMap Visited;
1069 if (!checkHoistValue(V, InsertPoint, DT, Unhoistables, nullptr, Visited)) {
10561070 CHR_DEBUG(dbgs() << "Split. checkHoistValue false " << *V << "\n");
10571071 return true; // Not hoistable, split.
10581072 }
13811395 "Must be truthy or falsy");
13821396 auto *BI = cast(R->getEntry()->getTerminator());
13831397 // Note checkHoistValue fills in HoistStops.
1398 DenseMap Visited;
13841399 bool IsHoistable = checkHoistValue(BI->getCondition(), InsertPoint, DT,
1385 Unhoistables, &HoistStops);
1400 Unhoistables, &HoistStops, Visited);
13861401 assert(IsHoistable && "Must be hoistable");
13871402 (void)(IsHoistable); // Unused in release build
13881403 IsHoisted = true;
13921407 OutermostScope->FalseBiasedSelects.count(SI) > 0) &&
13931408 "Must be true or false biased");
13941409 // Note checkHoistValue fills in HoistStops.
1410 DenseMap Visited;
13951411 bool IsHoistable = checkHoistValue(SI->getCondition(), InsertPoint, DT,
1396 Unhoistables, &HoistStops);
1412 Unhoistables, &HoistStops, Visited);
13971413 assert(IsHoistable && "Must be hoistable");
13981414 (void)(IsHoistable); // Unused in release build
13991415 IsHoisted = true;
20042004 ret i32 45
20052005 }
20062006
2007 ; Test a case with a really long use-def chains. This test checks that it's not
2008 ; really slow and doesn't appear to be hanging.
2009 define i64 @test_chr_22(i1 %i, i64* %j, i64 %v0) !prof !14 {
2010 bb0:
2011 %v1 = add i64 %v0, 3
2012 %v2 = add i64 %v1, %v0
2013 %c1 = icmp sgt i64 %v2, 99
2014 %v3 = select i1 %c1, i64 %v1, i64 %v2, !prof !15
2015 %v4 = add i64 %v2, %v2
2016 %v5 = add i64 %v4, %v2
2017 %v6 = add i64 %v5, %v4
2018 %v7 = add i64 %v6, %v5
2019 %v8 = add i64 %v7, %v6
2020 %v9 = add i64 %v8, %v7
2021 %v10 = add i64 %v9, %v8
2022 %v11 = add i64 %v10, %v9
2023 %v12 = add i64 %v11, %v10
2024 %v13 = add i64 %v12, %v11
2025 %v14 = add i64 %v13, %v12
2026 %v15 = add i64 %v14, %v13
2027 %v16 = add i64 %v15, %v14
2028 %v17 = add i64 %v16, %v15
2029 %v18 = add i64 %v17, %v16
2030 %v19 = add i64 %v18, %v17
2031 %v20 = add i64 %v19, %v18
2032 %v21 = add i64 %v20, %v19
2033 %v22 = add i64 %v21, %v20
2034 %v23 = add i64 %v22, %v21
2035 %v24 = add i64 %v23, %v22
2036 %v25 = add i64 %v24, %v23
2037 %v26 = add i64 %v25, %v24
2038 %v27 = add i64 %v26, %v25
2039 %v28 = add i64 %v27, %v26
2040 %v29 = add i64 %v28, %v27
2041 %v30 = add i64 %v29, %v28
2042 %v31 = add i64 %v30, %v29
2043 %v32 = add i64 %v31, %v30
2044 %v33 = add i64 %v32, %v31
2045 %v34 = add i64 %v33, %v32
2046 %v35 = add i64 %v34, %v33
2047 %v36 = add i64 %v35, %v34
2048 %v37 = add i64 %v36, %v35
2049 %v38 = add i64 %v37, %v36
2050 %v39 = add i64 %v38, %v37
2051 %v40 = add i64 %v39, %v38
2052 %v41 = add i64 %v40, %v39
2053 %v42 = add i64 %v41, %v40
2054 %v43 = add i64 %v42, %v41
2055 %v44 = add i64 %v43, %v42
2056 %v45 = add i64 %v44, %v43
2057 %v46 = add i64 %v45, %v44
2058 %v47 = add i64 %v46, %v45
2059 %v48 = add i64 %v47, %v46
2060 %v49 = add i64 %v48, %v47
2061 %v50 = add i64 %v49, %v48
2062 %v51 = add i64 %v50, %v49
2063 %v52 = add i64 %v51, %v50
2064 %v53 = add i64 %v52, %v51
2065 %v54 = add i64 %v53, %v52
2066 %v55 = add i64 %v54, %v53
2067 %v56 = add i64 %v55, %v54
2068 %v57 = add i64 %v56, %v55
2069 %v58 = add i64 %v57, %v56
2070 %v59 = add i64 %v58, %v57
2071 %v60 = add i64 %v59, %v58
2072 %v61 = add i64 %v60, %v59
2073 %v62 = add i64 %v61, %v60
2074 %v63 = add i64 %v62, %v61
2075 %v64 = add i64 %v63, %v62
2076 %v65 = add i64 %v64, %v63
2077 %v66 = add i64 %v65, %v64
2078 %v67 = add i64 %v66, %v65
2079 %v68 = add i64 %v67, %v66
2080 %v69 = add i64 %v68, %v67
2081 %v70 = add i64 %v69, %v68
2082 %v71 = add i64 %v70, %v69
2083 %v72 = add i64 %v71, %v70
2084 %v73 = add i64 %v72, %v71
2085 %v74 = add i64 %v73, %v72
2086 %v75 = add i64 %v74, %v73
2087 %v76 = add i64 %v75, %v74
2088 %v77 = add i64 %v76, %v75
2089 %v78 = add i64 %v77, %v76
2090 %v79 = add i64 %v78, %v77
2091 %v80 = add i64 %v79, %v78
2092 %v81 = add i64 %v80, %v79
2093 %v82 = add i64 %v81, %v80
2094 %v83 = add i64 %v82, %v81
2095 %v84 = add i64 %v83, %v82
2096 %v85 = add i64 %v84, %v83
2097 %v86 = add i64 %v85, %v84
2098 %v87 = add i64 %v86, %v85
2099 %v88 = add i64 %v87, %v86
2100 %v89 = add i64 %v88, %v87
2101 %v90 = add i64 %v89, %v88
2102 %v91 = add i64 %v90, %v89
2103 %v92 = add i64 %v91, %v90
2104 %v93 = add i64 %v92, %v91
2105 %v94 = add i64 %v93, %v92
2106 %v95 = add i64 %v94, %v93
2107 %v96 = add i64 %v95, %v94
2108 %v97 = add i64 %v96, %v95
2109 %v98 = add i64 %v97, %v96
2110 %v99 = add i64 %v98, %v97
2111 %v100 = add i64 %v99, %v98
2112 %v101 = add i64 %v100, %v99
2113 %v102 = add i64 %v101, %v100
2114 %v103 = add i64 %v102, %v101
2115 %v104 = add i64 %v103, %v102
2116 %v105 = add i64 %v104, %v103
2117 %v106 = add i64 %v105, %v104
2118 %v107 = add i64 %v106, %v105
2119 %v108 = add i64 %v107, %v106
2120 %v109 = add i64 %v108, %v107
2121 %v110 = add i64 %v109, %v108
2122 %v111 = add i64 %v110, %v109
2123 %v112 = add i64 %v111, %v110
2124 %v113 = add i64 %v112, %v111
2125 %v114 = add i64 %v113, %v112
2126 %v115 = add i64 %v114, %v113
2127 %v116 = add i64 %v115, %v114
2128 %v117 = add i64 %v116, %v115
2129 %v118 = add i64 %v117, %v116
2130 %v119 = add i64 %v118, %v117
2131 %v120 = add i64 %v119, %v118
2132 %v121 = add i64 %v120, %v119
2133 %v122 = add i64 %v121, %v120
2134 %v123 = add i64 %v122, %v121
2135 %v124 = add i64 %v123, %v122
2136 %v125 = add i64 %v124, %v123
2137 %v126 = add i64 %v125, %v124
2138 %v127 = add i64 %v126, %v125
2139 %v128 = add i64 %v127, %v126
2140 %v129 = add i64 %v128, %v127
2141 %v130 = add i64 %v129, %v128
2142 %v131 = add i64 %v130, %v129
2143 %v132 = add i64 %v131, %v130
2144 %v133 = add i64 %v132, %v131
2145 %v134 = add i64 %v133, %v132
2146 %v135 = add i64 %v134, %v133
2147 %v136 = add i64 %v135, %v134
2148 %v137 = add i64 %v136, %v135
2149 %v138 = add i64 %v137, %v136
2150 %v139 = add i64 %v138, %v137
2151 %v140 = add i64 %v139, %v138
2152 %v141 = add i64 %v140, %v139
2153 %v142 = add i64 %v141, %v140
2154 %v143 = add i64 %v142, %v141
2155 %v144 = add i64 %v143, %v142
2156 %v145 = add i64 %v144, %v143
2157 %v146 = add i64 %v145, %v144
2158 %v147 = add i64 %v146, %v145
2159 %v148 = add i64 %v147, %v146
2160 %v149 = add i64 %v148, %v147
2161 %v150 = add i64 %v149, %v148
2162 %v151 = add i64 %v150, %v149
2163 %v152 = add i64 %v151, %v150
2164 %v153 = add i64 %v152, %v151
2165 %v154 = add i64 %v153, %v152
2166 %v155 = add i64 %v154, %v153
2167 %v156 = add i64 %v155, %v154
2168 %v157 = add i64 %v156, %v155
2169 %v158 = add i64 %v157, %v156
2170 %v159 = add i64 %v158, %v157
2171 %v160 = add i64 %v159, %v158
2172 %v161 = add i64 %v160, %v159
2173 %v162 = add i64 %v161, %v160
2174 %v163 = add i64 %v162, %v161
2175 %v164 = add i64 %v163, %v162
2176 %v165 = add i64 %v164, %v163
2177 %v166 = add i64 %v165, %v164
2178 %v167 = add i64 %v166, %v165
2179 %v168 = add i64 %v167, %v166
2180 %v169 = add i64 %v168, %v167
2181 %v170 = add i64 %v169, %v168
2182 %v171 = add i64 %v170, %v169
2183 %v172 = add i64 %v171, %v170
2184 %v173 = add i64 %v172, %v171
2185 %v174 = add i64 %v173, %v172
2186 %v175 = add i64 %v174, %v173
2187 %v176 = add i64 %v175, %v174
2188 %v177 = add i64 %v176, %v175
2189 %v178 = add i64 %v177, %v176
2190 %v179 = add i64 %v178, %v177
2191 %v180 = add i64 %v179, %v178
2192 %v181 = add i64 %v180, %v179
2193 %v182 = add i64 %v181, %v180
2194 %v183 = add i64 %v182, %v181
2195 %v184 = add i64 %v183, %v182
2196 %v185 = add i64 %v184, %v183
2197 %v186 = add i64 %v185, %v184
2198 %v187 = add i64 %v186, %v185
2199 %v188 = add i64 %v187, %v186
2200 %v189 = add i64 %v188, %v187
2201 %v190 = add i64 %v189, %v188
2202 %v191 = add i64 %v190, %v189
2203 %v192 = add i64 %v191, %v190
2204 %v193 = add i64 %v192, %v191
2205 %v194 = add i64 %v193, %v192
2206 %v195 = add i64 %v194, %v193
2207 %v196 = add i64 %v195, %v194
2208 %v197 = add i64 %v196, %v195
2209 %v198 = add i64 %v197, %v196
2210 %v199 = add i64 %v198, %v197
2211 %v200 = add i64 %v199, %v198
2212 %v201 = add i64 %v200, %v199
2213 %v202 = add i64 %v201, %v200
2214 %v203 = add i64 %v202, %v201
2215 %v204 = add i64 %v203, %v202
2216 %v205 = add i64 %v204, %v203
2217 %v206 = add i64 %v205, %v204
2218 %v207 = add i64 %v206, %v205
2219 %v208 = add i64 %v207, %v206
2220 %v209 = add i64 %v208, %v207
2221 %v210 = add i64 %v209, %v208
2222 %v211 = add i64 %v210, %v209
2223 %v212 = add i64 %v211, %v210
2224 %v213 = add i64 %v212, %v211
2225 %v214 = add i64 %v213, %v212
2226 %v215 = add i64 %v214, %v213
2227 %v216 = add i64 %v215, %v214
2228 %v217 = add i64 %v216, %v215
2229 %v218 = add i64 %v217, %v216
2230 %v219 = add i64 %v218, %v217
2231 %v220 = add i64 %v219, %v218
2232 %v221 = add i64 %v220, %v219
2233 %v222 = add i64 %v221, %v220
2234 %v223 = add i64 %v222, %v221
2235 %v224 = add i64 %v223, %v222
2236 %v225 = add i64 %v224, %v223
2237 %v226 = add i64 %v225, %v224
2238 %v227 = add i64 %v226, %v225
2239 %v228 = add i64 %v227, %v226
2240 %v229 = add i64 %v228, %v227
2241 %v230 = add i64 %v229, %v228
2242 %v231 = add i64 %v230, %v229
2243 %v232 = add i64 %v231, %v230
2244 %v233 = add i64 %v232, %v231
2245 %v234 = add i64 %v233, %v232
2246 %v235 = add i64 %v234, %v233
2247 %v236 = add i64 %v235, %v234
2248 %v237 = add i64 %v236, %v235
2249 %v238 = add i64 %v237, %v236
2250 %v239 = add i64 %v238, %v237
2251 %v240 = add i64 %v239, %v238
2252 %v241 = add i64 %v240, %v239
2253 %v242 = add i64 %v241, %v240
2254 %v243 = add i64 %v242, %v241
2255 %v244 = add i64 %v243, %v242
2256 %v245 = add i64 %v244, %v243
2257 %v246 = add i64 %v245, %v244
2258 %v247 = add i64 %v246, %v245
2259 %v248 = add i64 %v247, %v246
2260 %v249 = add i64 %v248, %v247
2261 %v250 = add i64 %v249, %v248
2262 %v251 = add i64 %v250, %v249
2263 %v252 = add i64 %v251, %v250
2264 %v253 = add i64 %v252, %v251
2265 %v254 = add i64 %v253, %v252
2266 %v255 = add i64 %v254, %v253
2267 %v256 = add i64 %v255, %v254
2268 %v257 = add i64 %v256, %v255
2269 %v258 = add i64 %v257, %v256
2270 %v259 = add i64 %v258, %v257
2271 %v260 = add i64 %v259, %v258
2272 %v261 = add i64 %v260, %v259
2273 %v262 = add i64 %v261, %v260
2274 %v263 = add i64 %v262, %v261
2275 %v264 = add i64 %v263, %v262
2276 %v265 = add i64 %v264, %v263
2277 %v266 = add i64 %v265, %v264
2278 %v267 = add i64 %v266, %v265
2279 %v268 = add i64 %v267, %v266
2280 %v269 = add i64 %v268, %v267
2281 %v270 = add i64 %v269, %v268
2282 %v271 = add i64 %v270, %v269
2283 %v272 = add i64 %v271, %v270
2284 %v273 = add i64 %v272, %v271
2285 %v274 = add i64 %v273, %v272
2286 %v275 = add i64 %v274, %v273
2287 %v276 = add i64 %v275, %v274
2288 %v277 = add i64 %v276, %v275
2289 %v278 = add i64 %v277, %v276
2290 %v279 = add i64 %v278, %v277
2291 %v280 = add i64 %v279, %v278
2292 %v281 = add i64 %v280, %v279
2293 %v282 = add i64 %v281, %v280
2294 %v283 = add i64 %v282, %v281
2295 %v284 = add i64 %v283, %v282
2296 %v285 = add i64 %v284, %v283
2297 %v286 = add i64 %v285, %v284
2298 %v287 = add i64 %v286, %v285
2299 %v288 = add i64 %v287, %v286
2300 %v289 = add i64 %v288, %v287
2301 %v290 = add i64 %v289, %v288
2302 %v291 = add i64 %v290, %v289
2303 %v292 = add i64 %v291, %v290
2304 %v293 = add i64 %v292, %v291
2305 %v294 = add i64 %v293, %v292
2306 %v295 = add i64 %v294, %v293
2307 %v296 = add i64 %v295, %v294
2308 %v297 = add i64 %v296, %v295
2309 %v298 = add i64 %v297, %v296
2310 %v299 = add i64 %v298, %v297
2311 %v300 = add i64 %v299, %v298
2312 %v301 = icmp eq i64 %v300, 100
2313 %v302 = select i1 %v301, i64 %v298, i64 %v299, !prof !15
2314 store i64 %v302, i64* %j
2315 ret i64 99
2316 }
2317
20072318 !llvm.module.flags = !{!0}
20082319 !0 = !{i32 1, !"ProfileSummary", !1}
20092320 !1 = !{!2, !3, !4, !5, !6, !7, !8, !9}