1 1.1 mrg /* Code for GIMPLE range related routines. 2 1.1 mrg Copyright (C) 2019-2022 Free Software Foundation, Inc. 3 1.1 mrg Contributed by Andrew MacLeod <amacleod (at) redhat.com> 4 1.1 mrg and Aldy Hernandez <aldyh (at) redhat.com>. 5 1.1 mrg 6 1.1 mrg This file is part of GCC. 7 1.1 mrg 8 1.1 mrg GCC is free software; you can redistribute it and/or modify 9 1.1 mrg it under the terms of the GNU General Public License as published by 10 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 11 1.1 mrg any later version. 12 1.1 mrg 13 1.1 mrg GCC is distributed in the hope that it will be useful, 14 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 15 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 1.1 mrg GNU General Public License for more details. 17 1.1 mrg 18 1.1 mrg You should have received a copy of the GNU General Public License 19 1.1 mrg along with GCC; see the file COPYING3. If not see 20 1.1 mrg <http://www.gnu.org/licenses/>. */ 21 1.1 mrg 22 1.1 mrg #include "config.h" 23 1.1 mrg #include "system.h" 24 1.1 mrg #include "coretypes.h" 25 1.1 mrg #include "backend.h" 26 1.1 mrg #include "insn-codes.h" 27 1.1 mrg #include "tree.h" 28 1.1 mrg #include "gimple.h" 29 1.1 mrg #include "ssa.h" 30 1.1 mrg #include "gimple-pretty-print.h" 31 1.1 mrg #include "optabs-tree.h" 32 1.1 mrg #include "gimple-fold.h" 33 1.1 mrg #include "wide-int.h" 34 1.1 mrg #include "fold-const.h" 35 1.1 mrg #include "case-cfn-macros.h" 36 1.1 mrg #include "omp-general.h" 37 1.1 mrg #include "cfgloop.h" 38 1.1 mrg #include "tree-ssa-loop.h" 39 1.1 mrg #include "tree-scalar-evolution.h" 40 1.1 mrg #include "langhooks.h" 41 1.1 mrg #include "vr-values.h" 42 1.1 mrg #include "range.h" 43 1.1 mrg #include "value-query.h" 44 1.1 mrg #include "range-op.h" 45 1.1 mrg #include "gimple-range.h" 46 1.1 mrg // Construct a fur_source, and set the m_query field. 47 1.1 mrg 48 1.1 mrg fur_source::fur_source (range_query *q) 49 1.1 mrg { 50 1.1 mrg if (q) 51 1.1 mrg m_query = q; 52 1.1 mrg else if (cfun) 53 1.1 mrg m_query = get_range_query (cfun); 54 1.1 mrg else 55 1.1 mrg m_query = get_global_range_query (); 56 1.1 mrg m_gori = NULL; 57 1.1 mrg } 58 1.1 mrg 59 1.1 mrg // Invoke range_of_expr on EXPR. 60 1.1 mrg 61 1.1 mrg bool 62 1.1 mrg fur_source::get_operand (irange &r, tree expr) 63 1.1 mrg { 64 1.1 mrg return m_query->range_of_expr (r, expr); 65 1.1 mrg } 66 1.1 mrg 67 1.1 mrg // Evaluate EXPR for this stmt as a PHI argument on edge E. Use the current 68 1.1 mrg // range_query to get the range on the edge. 69 1.1 mrg 70 1.1 mrg bool 71 1.1 mrg fur_source::get_phi_operand (irange &r, tree expr, edge e) 72 1.1 mrg { 73 1.1 mrg return m_query->range_on_edge (r, e, expr); 74 1.1 mrg } 75 1.1 mrg 76 1.1 mrg // Default is no relation. 77 1.1 mrg 78 1.1 mrg relation_kind 79 1.1 mrg fur_source::query_relation (tree op1 ATTRIBUTE_UNUSED, 80 1.1 mrg tree op2 ATTRIBUTE_UNUSED) 81 1.1 mrg { 82 1.1 mrg return VREL_NONE; 83 1.1 mrg } 84 1.1 mrg 85 1.1 mrg // Default registers nothing. 86 1.1 mrg 87 1.1 mrg void 88 1.1 mrg fur_source::register_relation (gimple *s ATTRIBUTE_UNUSED, 89 1.1 mrg relation_kind k ATTRIBUTE_UNUSED, 90 1.1 mrg tree op1 ATTRIBUTE_UNUSED, 91 1.1 mrg tree op2 ATTRIBUTE_UNUSED) 92 1.1 mrg { 93 1.1 mrg } 94 1.1 mrg 95 1.1 mrg // Default registers nothing. 96 1.1 mrg 97 1.1 mrg void 98 1.1 mrg fur_source::register_relation (edge e ATTRIBUTE_UNUSED, 99 1.1 mrg relation_kind k ATTRIBUTE_UNUSED, 100 1.1 mrg tree op1 ATTRIBUTE_UNUSED, 101 1.1 mrg tree op2 ATTRIBUTE_UNUSED) 102 1.1 mrg { 103 1.1 mrg } 104 1.1 mrg 105 1.1 mrg // This version of fur_source will pick a range up off an edge. 106 1.1 mrg 107 1.1 mrg class fur_edge : public fur_source 108 1.1 mrg { 109 1.1 mrg public: 110 1.1 mrg fur_edge (edge e, range_query *q = NULL); 111 1.1 mrg virtual bool get_operand (irange &r, tree expr) OVERRIDE; 112 1.1 mrg virtual bool get_phi_operand (irange &r, tree expr, edge e) OVERRIDE; 113 1.1 mrg private: 114 1.1 mrg edge m_edge; 115 1.1 mrg }; 116 1.1 mrg 117 1.1 mrg // Instantiate an edge based fur_source. 118 1.1 mrg 119 1.1 mrg inline 120 1.1 mrg fur_edge::fur_edge (edge e, range_query *q) : fur_source (q) 121 1.1 mrg { 122 1.1 mrg m_edge = e; 123 1.1 mrg } 124 1.1 mrg 125 1.1 mrg // Get the value of EXPR on edge m_edge. 126 1.1 mrg 127 1.1 mrg bool 128 1.1 mrg fur_edge::get_operand (irange &r, tree expr) 129 1.1 mrg { 130 1.1 mrg return m_query->range_on_edge (r, m_edge, expr); 131 1.1 mrg } 132 1.1 mrg 133 1.1 mrg // Evaluate EXPR for this stmt as a PHI argument on edge E. Use the current 134 1.1 mrg // range_query to get the range on the edge. 135 1.1 mrg 136 1.1 mrg bool 137 1.1 mrg fur_edge::get_phi_operand (irange &r, tree expr, edge e) 138 1.1 mrg { 139 1.1 mrg // Edge to edge recalculations not supoprted yet, until we sort it out. 140 1.1 mrg gcc_checking_assert (e == m_edge); 141 1.1 mrg return m_query->range_on_edge (r, e, expr); 142 1.1 mrg } 143 1.1 mrg 144 1.1 mrg // Instantiate a stmt based fur_source. 145 1.1 mrg 146 1.1 mrg fur_stmt::fur_stmt (gimple *s, range_query *q) : fur_source (q) 147 1.1 mrg { 148 1.1 mrg m_stmt = s; 149 1.1 mrg } 150 1.1 mrg 151 1.1 mrg // Retreive range of EXPR as it occurs as a use on stmt M_STMT. 152 1.1 mrg 153 1.1 mrg bool 154 1.1 mrg fur_stmt::get_operand (irange &r, tree expr) 155 1.1 mrg { 156 1.1 mrg return m_query->range_of_expr (r, expr, m_stmt); 157 1.1 mrg } 158 1.1 mrg 159 1.1 mrg // Evaluate EXPR for this stmt as a PHI argument on edge E. Use the current 160 1.1 mrg // range_query to get the range on the edge. 161 1.1 mrg 162 1.1 mrg bool 163 1.1 mrg fur_stmt::get_phi_operand (irange &r, tree expr, edge e) 164 1.1 mrg { 165 1.1 mrg // Pick up the range of expr from edge E. 166 1.1 mrg fur_edge e_src (e, m_query); 167 1.1 mrg return e_src.get_operand (r, expr); 168 1.1 mrg } 169 1.1 mrg 170 1.1 mrg // Return relation based from m_stmt. 171 1.1 mrg 172 1.1 mrg relation_kind 173 1.1 mrg fur_stmt::query_relation (tree op1, tree op2) 174 1.1 mrg { 175 1.1 mrg return m_query->query_relation (m_stmt, op1, op2); 176 1.1 mrg } 177 1.1 mrg 178 1.1 mrg // Instantiate a stmt based fur_source with a GORI object. 179 1.1 mrg 180 1.1 mrg 181 1.1 mrg fur_depend::fur_depend (gimple *s, gori_compute *gori, range_query *q) 182 1.1 mrg : fur_stmt (s, q) 183 1.1 mrg { 184 1.1 mrg gcc_checking_assert (gori); 185 1.1 mrg m_gori = gori; 186 1.1 mrg // Set relations if there is an oracle in the range_query. 187 1.1 mrg // This will enable registering of relationships as they are discovered. 188 1.1 mrg m_oracle = q->oracle (); 189 1.1 mrg 190 1.1 mrg } 191 1.1 mrg 192 1.1 mrg // Register a relation on a stmt if there is an oracle. 193 1.1 mrg 194 1.1 mrg void 195 1.1 mrg fur_depend::register_relation (gimple *s, relation_kind k, tree op1, tree op2) 196 1.1 mrg { 197 1.1 mrg if (m_oracle) 198 1.1 mrg m_oracle->register_stmt (s, k, op1, op2); 199 1.1 mrg } 200 1.1 mrg 201 1.1 mrg // Register a relation on an edge if there is an oracle. 202 1.1 mrg 203 1.1 mrg void 204 1.1 mrg fur_depend::register_relation (edge e, relation_kind k, tree op1, tree op2) 205 1.1 mrg { 206 1.1 mrg if (m_oracle) 207 1.1 mrg m_oracle->register_edge (e, k, op1, op2); 208 1.1 mrg } 209 1.1 mrg 210 1.1 mrg // This version of fur_source will pick a range up from a list of ranges 211 1.1 mrg // supplied by the caller. 212 1.1 mrg 213 1.1 mrg class fur_list : public fur_source 214 1.1 mrg { 215 1.1 mrg public: 216 1.1 mrg fur_list (irange &r1); 217 1.1 mrg fur_list (irange &r1, irange &r2); 218 1.1 mrg fur_list (unsigned num, irange *list); 219 1.1 mrg virtual bool get_operand (irange &r, tree expr) OVERRIDE; 220 1.1 mrg virtual bool get_phi_operand (irange &r, tree expr, edge e) OVERRIDE; 221 1.1 mrg private: 222 1.1 mrg int_range_max m_local[2]; 223 1.1 mrg irange *m_list; 224 1.1 mrg unsigned m_index; 225 1.1 mrg unsigned m_limit; 226 1.1 mrg }; 227 1.1 mrg 228 1.1 mrg // One range supplied for unary operations. 229 1.1 mrg 230 1.1 mrg fur_list::fur_list (irange &r1) : fur_source (NULL) 231 1.1 mrg { 232 1.1 mrg m_list = m_local; 233 1.1 mrg m_index = 0; 234 1.1 mrg m_limit = 1; 235 1.1 mrg m_local[0] = r1; 236 1.1 mrg } 237 1.1 mrg 238 1.1 mrg // Two ranges supplied for binary operations. 239 1.1 mrg 240 1.1 mrg fur_list::fur_list (irange &r1, irange &r2) : fur_source (NULL) 241 1.1 mrg { 242 1.1 mrg m_list = m_local; 243 1.1 mrg m_index = 0; 244 1.1 mrg m_limit = 2; 245 1.1 mrg m_local[0] = r1; 246 1.1 mrg m_local[1] = r2; 247 1.1 mrg } 248 1.1 mrg 249 1.1 mrg // Arbitrary number of ranges in a vector. 250 1.1 mrg 251 1.1 mrg fur_list::fur_list (unsigned num, irange *list) : fur_source (NULL) 252 1.1 mrg { 253 1.1 mrg m_list = list; 254 1.1 mrg m_index = 0; 255 1.1 mrg m_limit = num; 256 1.1 mrg } 257 1.1 mrg 258 1.1 mrg // Get the next operand from the vector, ensure types are compatible. 259 1.1 mrg 260 1.1 mrg bool 261 1.1 mrg fur_list::get_operand (irange &r, tree expr) 262 1.1 mrg { 263 1.1 mrg if (m_index >= m_limit) 264 1.1 mrg return m_query->range_of_expr (r, expr); 265 1.1 mrg r = m_list[m_index++]; 266 1.1 mrg gcc_checking_assert (range_compatible_p (TREE_TYPE (expr), r.type ())); 267 1.1 mrg return true; 268 1.1 mrg } 269 1.1 mrg 270 1.1 mrg // This will simply pick the next operand from the vector. 271 1.1 mrg bool 272 1.1 mrg fur_list::get_phi_operand (irange &r, tree expr, edge e ATTRIBUTE_UNUSED) 273 1.1 mrg { 274 1.1 mrg return get_operand (r, expr); 275 1.1 mrg } 276 1.1 mrg 277 1.1 mrg // Fold stmt S into range R using R1 as the first operand. 278 1.1 mrg 279 1.1 mrg bool 280 1.1 mrg fold_range (irange &r, gimple *s, irange &r1) 281 1.1 mrg { 282 1.1 mrg fold_using_range f; 283 1.1 mrg fur_list src (r1); 284 1.1 mrg return f.fold_stmt (r, s, src); 285 1.1 mrg } 286 1.1 mrg 287 1.1 mrg // Fold stmt S into range R using R1 and R2 as the first two operands. 288 1.1 mrg 289 1.1 mrg bool 290 1.1 mrg fold_range (irange &r, gimple *s, irange &r1, irange &r2) 291 1.1 mrg { 292 1.1 mrg fold_using_range f; 293 1.1 mrg fur_list src (r1, r2); 294 1.1 mrg return f.fold_stmt (r, s, src); 295 1.1 mrg } 296 1.1 mrg 297 1.1 mrg // Fold stmt S into range R using NUM_ELEMENTS from VECTOR as the initial 298 1.1 mrg // operands encountered. 299 1.1 mrg 300 1.1 mrg bool 301 1.1 mrg fold_range (irange &r, gimple *s, unsigned num_elements, irange *vector) 302 1.1 mrg { 303 1.1 mrg fold_using_range f; 304 1.1 mrg fur_list src (num_elements, vector); 305 1.1 mrg return f.fold_stmt (r, s, src); 306 1.1 mrg } 307 1.1 mrg 308 1.1 mrg // Fold stmt S into range R using range query Q. 309 1.1 mrg 310 1.1 mrg bool 311 1.1 mrg fold_range (irange &r, gimple *s, range_query *q) 312 1.1 mrg { 313 1.1 mrg fold_using_range f; 314 1.1 mrg fur_stmt src (s, q); 315 1.1 mrg return f.fold_stmt (r, s, src); 316 1.1 mrg } 317 1.1 mrg 318 1.1 mrg // Recalculate stmt S into R using range query Q as if it were on edge ON_EDGE. 319 1.1 mrg 320 1.1 mrg bool 321 1.1 mrg fold_range (irange &r, gimple *s, edge on_edge, range_query *q) 322 1.1 mrg { 323 1.1 mrg fold_using_range f; 324 1.1 mrg fur_edge src (on_edge, q); 325 1.1 mrg return f.fold_stmt (r, s, src); 326 1.1 mrg } 327 1.1 mrg 328 1.1 mrg // ------------------------------------------------------------------------- 329 1.1 mrg 330 1.1 mrg // Adjust the range for a pointer difference where the operands came 331 1.1 mrg // from a memchr. 332 1.1 mrg // 333 1.1 mrg // This notices the following sequence: 334 1.1 mrg // 335 1.1 mrg // def = __builtin_memchr (arg, 0, sz) 336 1.1 mrg // n = def - arg 337 1.1 mrg // 338 1.1 mrg // The range for N can be narrowed to [0, PTRDIFF_MAX - 1]. 339 1.1 mrg 340 1.1 mrg static void 341 1.1 mrg adjust_pointer_diff_expr (irange &res, const gimple *diff_stmt) 342 1.1 mrg { 343 1.1 mrg tree op0 = gimple_assign_rhs1 (diff_stmt); 344 1.1 mrg tree op1 = gimple_assign_rhs2 (diff_stmt); 345 1.1 mrg tree op0_ptype = TREE_TYPE (TREE_TYPE (op0)); 346 1.1 mrg tree op1_ptype = TREE_TYPE (TREE_TYPE (op1)); 347 1.1 mrg gimple *call; 348 1.1 mrg 349 1.1 mrg if (TREE_CODE (op0) == SSA_NAME 350 1.1 mrg && TREE_CODE (op1) == SSA_NAME 351 1.1 mrg && (call = SSA_NAME_DEF_STMT (op0)) 352 1.1 mrg && is_gimple_call (call) 353 1.1 mrg && gimple_call_builtin_p (call, BUILT_IN_MEMCHR) 354 1.1 mrg && TYPE_MODE (op0_ptype) == TYPE_MODE (char_type_node) 355 1.1 mrg && TYPE_PRECISION (op0_ptype) == TYPE_PRECISION (char_type_node) 356 1.1 mrg && TYPE_MODE (op1_ptype) == TYPE_MODE (char_type_node) 357 1.1 mrg && TYPE_PRECISION (op1_ptype) == TYPE_PRECISION (char_type_node) 358 1.1 mrg && gimple_call_builtin_p (call, BUILT_IN_MEMCHR) 359 1.1 mrg && vrp_operand_equal_p (op1, gimple_call_arg (call, 0)) 360 1.1 mrg && integer_zerop (gimple_call_arg (call, 1))) 361 1.1 mrg { 362 1.1 mrg tree max = vrp_val_max (ptrdiff_type_node); 363 1.1 mrg unsigned prec = TYPE_PRECISION (TREE_TYPE (max)); 364 1.1 mrg wide_int wmaxm1 = wi::to_wide (max, prec) - 1; 365 1.1 mrg res.intersect (wi::zero (prec), wmaxm1); 366 1.1 mrg } 367 1.1 mrg } 368 1.1 mrg 369 1.1 mrg // Adjust the range for an IMAGPART_EXPR. 370 1.1 mrg 371 1.1 mrg static void 372 1.1 mrg adjust_imagpart_expr (irange &res, const gimple *stmt) 373 1.1 mrg { 374 1.1 mrg tree name = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0); 375 1.1 mrg 376 1.1 mrg if (TREE_CODE (name) != SSA_NAME || !SSA_NAME_DEF_STMT (name)) 377 1.1 mrg return; 378 1.1 mrg 379 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (name); 380 1.1 mrg if (is_gimple_call (def_stmt) && gimple_call_internal_p (def_stmt)) 381 1.1 mrg { 382 1.1 mrg switch (gimple_call_internal_fn (def_stmt)) 383 1.1 mrg { 384 1.1 mrg case IFN_ADD_OVERFLOW: 385 1.1 mrg case IFN_SUB_OVERFLOW: 386 1.1 mrg case IFN_MUL_OVERFLOW: 387 1.1 mrg case IFN_ATOMIC_COMPARE_EXCHANGE: 388 1.1 mrg { 389 1.1 mrg int_range<2> r; 390 1.1 mrg r.set_varying (boolean_type_node); 391 1.1 mrg tree type = TREE_TYPE (gimple_assign_lhs (stmt)); 392 1.1 mrg range_cast (r, type); 393 1.1 mrg res.intersect (r); 394 1.1 mrg } 395 1.1 mrg default: 396 1.1 mrg break; 397 1.1 mrg } 398 1.1 mrg return; 399 1.1 mrg } 400 1.1 mrg if (is_gimple_assign (def_stmt) 401 1.1 mrg && gimple_assign_rhs_code (def_stmt) == COMPLEX_CST) 402 1.1 mrg { 403 1.1 mrg tree cst = gimple_assign_rhs1 (def_stmt); 404 1.1 mrg if (TREE_CODE (cst) == COMPLEX_CST) 405 1.1 mrg { 406 1.1 mrg wide_int imag = wi::to_wide (TREE_IMAGPART (cst)); 407 1.1 mrg res.intersect (imag, imag); 408 1.1 mrg } 409 1.1 mrg } 410 1.1 mrg } 411 1.1 mrg 412 1.1 mrg // Adjust the range for a REALPART_EXPR. 413 1.1 mrg 414 1.1 mrg static void 415 1.1 mrg adjust_realpart_expr (irange &res, const gimple *stmt) 416 1.1 mrg { 417 1.1 mrg tree name = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0); 418 1.1 mrg 419 1.1 mrg if (TREE_CODE (name) != SSA_NAME) 420 1.1 mrg return; 421 1.1 mrg 422 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (name); 423 1.1 mrg if (!SSA_NAME_DEF_STMT (name)) 424 1.1 mrg return; 425 1.1 mrg 426 1.1 mrg if (is_gimple_assign (def_stmt) 427 1.1 mrg && gimple_assign_rhs_code (def_stmt) == COMPLEX_CST) 428 1.1 mrg { 429 1.1 mrg tree cst = gimple_assign_rhs1 (def_stmt); 430 1.1 mrg if (TREE_CODE (cst) == COMPLEX_CST) 431 1.1 mrg { 432 1.1 mrg tree imag = TREE_REALPART (cst); 433 1.1 mrg int_range<2> tmp (imag, imag); 434 1.1 mrg res.intersect (tmp); 435 1.1 mrg } 436 1.1 mrg } 437 1.1 mrg } 438 1.1 mrg 439 1.1 mrg // This function looks for situations when walking the use/def chains 440 1.1 mrg // may provide additonal contextual range information not exposed on 441 1.1 mrg // this statement. 442 1.1 mrg 443 1.1 mrg static void 444 1.1 mrg gimple_range_adjustment (irange &res, const gimple *stmt) 445 1.1 mrg { 446 1.1 mrg switch (gimple_expr_code (stmt)) 447 1.1 mrg { 448 1.1 mrg case POINTER_DIFF_EXPR: 449 1.1 mrg adjust_pointer_diff_expr (res, stmt); 450 1.1 mrg return; 451 1.1 mrg 452 1.1 mrg case IMAGPART_EXPR: 453 1.1 mrg adjust_imagpart_expr (res, stmt); 454 1.1 mrg return; 455 1.1 mrg 456 1.1 mrg case REALPART_EXPR: 457 1.1 mrg adjust_realpart_expr (res, stmt); 458 1.1 mrg return; 459 1.1 mrg 460 1.1 mrg default: 461 1.1 mrg break; 462 1.1 mrg } 463 1.1 mrg } 464 1.1 mrg 465 1.1 mrg // Return the base of the RHS of an assignment. 466 1.1 mrg 467 1.1 mrg static tree 468 1.1 mrg gimple_range_base_of_assignment (const gimple *stmt) 469 1.1 mrg { 470 1.1 mrg gcc_checking_assert (gimple_code (stmt) == GIMPLE_ASSIGN); 471 1.1 mrg tree op1 = gimple_assign_rhs1 (stmt); 472 1.1 mrg if (gimple_assign_rhs_code (stmt) == ADDR_EXPR) 473 1.1 mrg return get_base_address (TREE_OPERAND (op1, 0)); 474 1.1 mrg return op1; 475 1.1 mrg } 476 1.1 mrg 477 1.1 mrg // Return the first operand of this statement if it is a valid operand 478 1.1 mrg // supported by ranges, otherwise return NULL_TREE. Special case is 479 1.1 mrg // &(SSA_NAME expr), return the SSA_NAME instead of the ADDR expr. 480 1.1 mrg 481 1.1 mrg tree 482 1.1 mrg gimple_range_operand1 (const gimple *stmt) 483 1.1 mrg { 484 1.1 mrg gcc_checking_assert (gimple_range_handler (stmt)); 485 1.1 mrg 486 1.1 mrg switch (gimple_code (stmt)) 487 1.1 mrg { 488 1.1 mrg case GIMPLE_COND: 489 1.1 mrg return gimple_cond_lhs (stmt); 490 1.1 mrg case GIMPLE_ASSIGN: 491 1.1 mrg { 492 1.1 mrg tree base = gimple_range_base_of_assignment (stmt); 493 1.1 mrg if (base && TREE_CODE (base) == MEM_REF) 494 1.1 mrg { 495 1.1 mrg // If the base address is an SSA_NAME, we return it 496 1.1 mrg // here. This allows processing of the range of that 497 1.1 mrg // name, while the rest of the expression is simply 498 1.1 mrg // ignored. The code in range_ops will see the 499 1.1 mrg // ADDR_EXPR and do the right thing. 500 1.1 mrg tree ssa = TREE_OPERAND (base, 0); 501 1.1 mrg if (TREE_CODE (ssa) == SSA_NAME) 502 1.1 mrg return ssa; 503 1.1 mrg } 504 1.1 mrg return base; 505 1.1 mrg } 506 1.1 mrg default: 507 1.1 mrg break; 508 1.1 mrg } 509 1.1 mrg return NULL; 510 1.1 mrg } 511 1.1 mrg 512 1.1 mrg // Return the second operand of statement STMT, otherwise return NULL_TREE. 513 1.1 mrg 514 1.1 mrg tree 515 1.1 mrg gimple_range_operand2 (const gimple *stmt) 516 1.1 mrg { 517 1.1 mrg gcc_checking_assert (gimple_range_handler (stmt)); 518 1.1 mrg 519 1.1 mrg switch (gimple_code (stmt)) 520 1.1 mrg { 521 1.1 mrg case GIMPLE_COND: 522 1.1 mrg return gimple_cond_rhs (stmt); 523 1.1 mrg case GIMPLE_ASSIGN: 524 1.1 mrg if (gimple_num_ops (stmt) >= 3) 525 1.1 mrg return gimple_assign_rhs2 (stmt); 526 1.1 mrg default: 527 1.1 mrg break; 528 1.1 mrg } 529 1.1 mrg return NULL_TREE; 530 1.1 mrg } 531 1.1 mrg 532 1.1 mrg // Calculate a range for statement S and return it in R. If NAME is provided it 533 1.1 mrg // represents the SSA_NAME on the LHS of the statement. It is only required 534 1.1 mrg // if there is more than one lhs/output. If a range cannot 535 1.1 mrg // be calculated, return false. 536 1.1 mrg 537 1.1 mrg bool 538 1.1 mrg fold_using_range::fold_stmt (irange &r, gimple *s, fur_source &src, tree name) 539 1.1 mrg { 540 1.1 mrg bool res = false; 541 1.1 mrg // If name and S are specified, make sure it is an LHS of S. 542 1.1 mrg gcc_checking_assert (!name || !gimple_get_lhs (s) || 543 1.1 mrg name == gimple_get_lhs (s)); 544 1.1 mrg 545 1.1 mrg if (!name) 546 1.1 mrg name = gimple_get_lhs (s); 547 1.1 mrg 548 1.1 mrg // Process addresses. 549 1.1 mrg if (gimple_code (s) == GIMPLE_ASSIGN 550 1.1 mrg && gimple_assign_rhs_code (s) == ADDR_EXPR) 551 1.1 mrg return range_of_address (r, s, src); 552 1.1 mrg 553 1.1 mrg if (gimple_range_handler (s)) 554 1.1 mrg res = range_of_range_op (r, s, src); 555 1.1 mrg else if (is_a<gphi *>(s)) 556 1.1 mrg res = range_of_phi (r, as_a<gphi *> (s), src); 557 1.1 mrg else if (is_a<gcall *>(s)) 558 1.1 mrg res = range_of_call (r, as_a<gcall *> (s), src); 559 1.1 mrg else if (is_a<gassign *> (s) && gimple_assign_rhs_code (s) == COND_EXPR) 560 1.1 mrg res = range_of_cond_expr (r, as_a<gassign *> (s), src); 561 1.1 mrg 562 1.1 mrg if (!res) 563 1.1 mrg { 564 1.1 mrg // If no name specified or range is unsupported, bail. 565 1.1 mrg if (!name || !gimple_range_ssa_p (name)) 566 1.1 mrg return false; 567 1.1 mrg // We don't understand the stmt, so return the global range. 568 1.1 mrg r = gimple_range_global (name); 569 1.1 mrg return true; 570 1.1 mrg } 571 1.1 mrg 572 1.1 mrg if (r.undefined_p ()) 573 1.1 mrg return true; 574 1.1 mrg 575 1.1 mrg // We sometimes get compatible types copied from operands, make sure 576 1.1 mrg // the correct type is being returned. 577 1.1 mrg if (name && TREE_TYPE (name) != r.type ()) 578 1.1 mrg { 579 1.1 mrg gcc_checking_assert (range_compatible_p (r.type (), TREE_TYPE (name))); 580 1.1 mrg range_cast (r, TREE_TYPE (name)); 581 1.1 mrg } 582 1.1 mrg return true; 583 1.1 mrg } 584 1.1 mrg 585 1.1 mrg // Calculate a range for range_op statement S and return it in R. If any 586 1.1 mrg // If a range cannot be calculated, return false. 587 1.1 mrg 588 1.1 mrg bool 589 1.1 mrg fold_using_range::range_of_range_op (irange &r, gimple *s, fur_source &src) 590 1.1 mrg { 591 1.1 mrg int_range_max range1, range2; 592 1.1 mrg tree type = gimple_range_type (s); 593 1.1 mrg if (!type) 594 1.1 mrg return false; 595 1.1 mrg range_operator *handler = gimple_range_handler (s); 596 1.1 mrg gcc_checking_assert (handler); 597 1.1 mrg 598 1.1 mrg tree lhs = gimple_get_lhs (s); 599 1.1 mrg tree op1 = gimple_range_operand1 (s); 600 1.1 mrg tree op2 = gimple_range_operand2 (s); 601 1.1 mrg 602 1.1 mrg if (src.get_operand (range1, op1)) 603 1.1 mrg { 604 1.1 mrg if (!op2) 605 1.1 mrg { 606 1.1 mrg // Fold range, and register any dependency if available. 607 1.1 mrg int_range<2> r2 (type); 608 1.1 mrg handler->fold_range (r, type, range1, r2); 609 1.1 mrg if (lhs && gimple_range_ssa_p (op1)) 610 1.1 mrg { 611 1.1 mrg if (src.gori ()) 612 1.1 mrg src.gori ()->register_dependency (lhs, op1); 613 1.1 mrg relation_kind rel; 614 1.1 mrg rel = handler->lhs_op1_relation (r, range1, range1); 615 1.1 mrg if (rel != VREL_NONE) 616 1.1 mrg src.register_relation (s, rel, lhs, op1); 617 1.1 mrg } 618 1.1 mrg } 619 1.1 mrg else if (src.get_operand (range2, op2)) 620 1.1 mrg { 621 1.1 mrg relation_kind rel = src.query_relation (op1, op2); 622 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS) && rel != VREL_NONE) 623 1.1 mrg { 624 1.1 mrg fprintf (dump_file, " folding with relation "); 625 1.1 mrg print_generic_expr (dump_file, op1, TDF_SLIM); 626 1.1 mrg print_relation (dump_file, rel); 627 1.1 mrg print_generic_expr (dump_file, op2, TDF_SLIM); 628 1.1 mrg fputc ('\n', dump_file); 629 1.1 mrg } 630 1.1 mrg // Fold range, and register any dependency if available. 631 1.1 mrg handler->fold_range (r, type, range1, range2, rel); 632 1.1 mrg relation_fold_and_or (r, s, src); 633 1.1 mrg if (lhs) 634 1.1 mrg { 635 1.1 mrg if (src.gori ()) 636 1.1 mrg { 637 1.1 mrg src.gori ()->register_dependency (lhs, op1); 638 1.1 mrg src.gori ()->register_dependency (lhs, op2); 639 1.1 mrg } 640 1.1 mrg if (gimple_range_ssa_p (op1)) 641 1.1 mrg { 642 1.1 mrg rel = handler->lhs_op1_relation (r, range1, range2); 643 1.1 mrg if (rel != VREL_NONE) 644 1.1 mrg src.register_relation (s, rel, lhs, op1); 645 1.1 mrg } 646 1.1 mrg if (gimple_range_ssa_p (op2)) 647 1.1 mrg { 648 1.1 mrg rel= handler->lhs_op2_relation (r, range1, range2); 649 1.1 mrg if (rel != VREL_NONE) 650 1.1 mrg src.register_relation (s, rel, lhs, op2); 651 1.1 mrg } 652 1.1 mrg } 653 1.1 mrg // Check for an existing BB, as we maybe asked to fold an 654 1.1 mrg // artificial statement not in the CFG. 655 1.1 mrg else if (is_a<gcond *> (s) && gimple_bb (s)) 656 1.1 mrg { 657 1.1 mrg basic_block bb = gimple_bb (s); 658 1.1 mrg edge e0 = EDGE_SUCC (bb, 0); 659 1.1 mrg edge e1 = EDGE_SUCC (bb, 1); 660 1.1 mrg 661 1.1 mrg if (!single_pred_p (e0->dest)) 662 1.1 mrg e0 = NULL; 663 1.1 mrg if (!single_pred_p (e1->dest)) 664 1.1 mrg e1 = NULL; 665 1.1 mrg src.register_outgoing_edges (as_a<gcond *> (s), r, e0, e1); 666 1.1 mrg } 667 1.1 mrg } 668 1.1 mrg else 669 1.1 mrg r.set_varying (type); 670 1.1 mrg } 671 1.1 mrg else 672 1.1 mrg r.set_varying (type); 673 1.1 mrg // Make certain range-op adjustments that aren't handled any other way. 674 1.1 mrg gimple_range_adjustment (r, s); 675 1.1 mrg return true; 676 1.1 mrg } 677 1.1 mrg 678 1.1 mrg // Calculate the range of an assignment containing an ADDR_EXPR. 679 1.1 mrg // Return the range in R. 680 1.1 mrg // If a range cannot be calculated, set it to VARYING and return true. 681 1.1 mrg 682 1.1 mrg bool 683 1.1 mrg fold_using_range::range_of_address (irange &r, gimple *stmt, fur_source &src) 684 1.1 mrg { 685 1.1 mrg gcc_checking_assert (gimple_code (stmt) == GIMPLE_ASSIGN); 686 1.1 mrg gcc_checking_assert (gimple_assign_rhs_code (stmt) == ADDR_EXPR); 687 1.1 mrg 688 1.1 mrg bool strict_overflow_p; 689 1.1 mrg tree expr = gimple_assign_rhs1 (stmt); 690 1.1 mrg poly_int64 bitsize, bitpos; 691 1.1 mrg tree offset; 692 1.1 mrg machine_mode mode; 693 1.1 mrg int unsignedp, reversep, volatilep; 694 1.1 mrg tree base = get_inner_reference (TREE_OPERAND (expr, 0), &bitsize, 695 1.1 mrg &bitpos, &offset, &mode, &unsignedp, 696 1.1 mrg &reversep, &volatilep); 697 1.1 mrg 698 1.1 mrg 699 1.1 mrg if (base != NULL_TREE 700 1.1 mrg && TREE_CODE (base) == MEM_REF 701 1.1 mrg && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME) 702 1.1 mrg { 703 1.1 mrg tree ssa = TREE_OPERAND (base, 0); 704 1.1 mrg tree lhs = gimple_get_lhs (stmt); 705 1.1 mrg if (lhs && gimple_range_ssa_p (ssa) && src.gori ()) 706 1.1 mrg src.gori ()->register_dependency (lhs, ssa); 707 1.1 mrg gcc_checking_assert (irange::supports_type_p (TREE_TYPE (ssa))); 708 1.1 mrg src.get_operand (r, ssa); 709 1.1 mrg range_cast (r, TREE_TYPE (gimple_assign_rhs1 (stmt))); 710 1.1 mrg 711 1.1 mrg poly_offset_int off = 0; 712 1.1 mrg bool off_cst = false; 713 1.1 mrg if (offset == NULL_TREE || TREE_CODE (offset) == INTEGER_CST) 714 1.1 mrg { 715 1.1 mrg off = mem_ref_offset (base); 716 1.1 mrg if (offset) 717 1.1 mrg off += poly_offset_int::from (wi::to_poly_wide (offset), 718 1.1 mrg SIGNED); 719 1.1 mrg off <<= LOG2_BITS_PER_UNIT; 720 1.1 mrg off += bitpos; 721 1.1 mrg off_cst = true; 722 1.1 mrg } 723 1.1 mrg /* If &X->a is equal to X, the range of X is the result. */ 724 1.1 mrg if (off_cst && known_eq (off, 0)) 725 1.1 mrg return true; 726 1.1 mrg else if (flag_delete_null_pointer_checks 727 1.1 mrg && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr))) 728 1.1 mrg { 729 1.1 mrg /* For -fdelete-null-pointer-checks -fno-wrapv-pointer we don't 730 1.1 mrg allow going from non-NULL pointer to NULL. */ 731 1.1 mrg if (!range_includes_zero_p (&r)) 732 1.1 mrg { 733 1.1 mrg /* We could here instead adjust r by off >> LOG2_BITS_PER_UNIT 734 1.1 mrg using POINTER_PLUS_EXPR if off_cst and just fall back to 735 1.1 mrg this. */ 736 1.1 mrg r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt))); 737 1.1 mrg return true; 738 1.1 mrg } 739 1.1 mrg } 740 1.1 mrg /* If MEM_REF has a "positive" offset, consider it non-NULL 741 1.1 mrg always, for -fdelete-null-pointer-checks also "negative" 742 1.1 mrg ones. Punt for unknown offsets (e.g. variable ones). */ 743 1.1 mrg if (!TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr)) 744 1.1 mrg && off_cst 745 1.1 mrg && known_ne (off, 0) 746 1.1 mrg && (flag_delete_null_pointer_checks || known_gt (off, 0))) 747 1.1 mrg { 748 1.1 mrg r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt))); 749 1.1 mrg return true; 750 1.1 mrg } 751 1.1 mrg r = int_range<2> (TREE_TYPE (gimple_assign_rhs1 (stmt))); 752 1.1 mrg return true; 753 1.1 mrg } 754 1.1 mrg 755 1.1 mrg // Handle "= &a". 756 1.1 mrg if (tree_single_nonzero_warnv_p (expr, &strict_overflow_p)) 757 1.1 mrg { 758 1.1 mrg r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt))); 759 1.1 mrg return true; 760 1.1 mrg } 761 1.1 mrg 762 1.1 mrg // Otherwise return varying. 763 1.1 mrg r = int_range<2> (TREE_TYPE (gimple_assign_rhs1 (stmt))); 764 1.1 mrg return true; 765 1.1 mrg } 766 1.1 mrg 767 1.1 mrg // Calculate a range for phi statement S and return it in R. 768 1.1 mrg // If a range cannot be calculated, return false. 769 1.1 mrg 770 1.1 mrg bool 771 1.1 mrg fold_using_range::range_of_phi (irange &r, gphi *phi, fur_source &src) 772 1.1 mrg { 773 1.1 mrg tree phi_def = gimple_phi_result (phi); 774 1.1 mrg tree type = gimple_range_type (phi); 775 1.1 mrg int_range_max arg_range; 776 1.1 mrg int_range_max equiv_range; 777 1.1 mrg unsigned x; 778 1.1 mrg 779 1.1 mrg if (!type) 780 1.1 mrg return false; 781 1.1 mrg 782 1.1 mrg // Track if all executable arguments are the same. 783 1.1 mrg tree single_arg = NULL_TREE; 784 1.1 mrg bool seen_arg = false; 785 1.1 mrg 786 1.1 mrg // Start with an empty range, unioning in each argument's range. 787 1.1 mrg r.set_undefined (); 788 1.1 mrg for (x = 0; x < gimple_phi_num_args (phi); x++) 789 1.1 mrg { 790 1.1 mrg tree arg = gimple_phi_arg_def (phi, x); 791 1.1 mrg // An argument that is the same as the def provides no new range. 792 1.1 mrg if (arg == phi_def) 793 1.1 mrg continue; 794 1.1 mrg 795 1.1 mrg edge e = gimple_phi_arg_edge (phi, x); 796 1.1 mrg 797 1.1 mrg // Get the range of the argument on its edge. 798 1.1 mrg src.get_phi_operand (arg_range, arg, e); 799 1.1 mrg 800 1.1 mrg if (!arg_range.undefined_p ()) 801 1.1 mrg { 802 1.1 mrg // Register potential dependencies for stale value tracking. 803 1.1 mrg // Likewise, if the incoming PHI argument is equivalent to this 804 1.1 mrg // PHI definition, it provides no new info. Accumulate these ranges 805 1.1 mrg // in case all arguments are equivalences. 806 1.1 mrg if (src.query ()->query_relation (e, arg, phi_def, false) == EQ_EXPR) 807 1.1 mrg equiv_range.union_(arg_range); 808 1.1 mrg else 809 1.1 mrg r.union_ (arg_range); 810 1.1 mrg 811 1.1 mrg if (gimple_range_ssa_p (arg) && src.gori ()) 812 1.1 mrg src.gori ()->register_dependency (phi_def, arg); 813 1.1 mrg 814 1.1 mrg // Track if all arguments are the same. 815 1.1 mrg if (!seen_arg) 816 1.1 mrg { 817 1.1 mrg seen_arg = true; 818 1.1 mrg single_arg = arg; 819 1.1 mrg } 820 1.1 mrg else if (single_arg != arg) 821 1.1 mrg single_arg = NULL_TREE; 822 1.1 mrg } 823 1.1 mrg 824 1.1 mrg // Once the value reaches varying, stop looking. 825 1.1 mrg if (r.varying_p () && single_arg == NULL_TREE) 826 1.1 mrg break; 827 1.1 mrg } 828 1.1 mrg 829 1.1 mrg // If all arguments were equivalences, use the equivalence ranges as no 830 1.1 mrg // arguments were processed. 831 1.1 mrg if (r.undefined_p () && !equiv_range.undefined_p ()) 832 1.1 mrg r = equiv_range; 833 1.1 mrg 834 1.1 mrg // If the PHI boils down to a single effective argument, look at it. 835 1.1 mrg if (single_arg) 836 1.1 mrg { 837 1.1 mrg // Symbolic arguments are equivalences. 838 1.1 mrg if (gimple_range_ssa_p (single_arg)) 839 1.1 mrg src.register_relation (phi, EQ_EXPR, phi_def, single_arg); 840 1.1 mrg else if (src.get_operand (arg_range, single_arg) 841 1.1 mrg && arg_range.singleton_p ()) 842 1.1 mrg { 843 1.1 mrg // Numerical arguments that are a constant can be returned as 844 1.1 mrg // the constant. This can help fold later cases where even this 845 1.1 mrg // constant might have been UNDEFINED via an unreachable edge. 846 1.1 mrg r = arg_range; 847 1.1 mrg return true; 848 1.1 mrg } 849 1.1 mrg } 850 1.1 mrg 851 1.1 mrg // If SCEV is available, query if this PHI has any knonwn values. 852 1.1 mrg if (scev_initialized_p () && !POINTER_TYPE_P (TREE_TYPE (phi_def))) 853 1.1 mrg { 854 1.1 mrg value_range loop_range; 855 1.1 mrg class loop *l = loop_containing_stmt (phi); 856 1.1 mrg if (l && loop_outer (l)) 857 1.1 mrg { 858 1.1 mrg range_of_ssa_name_with_loop_info (loop_range, phi_def, l, phi, src); 859 1.1 mrg if (!loop_range.varying_p ()) 860 1.1 mrg { 861 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 862 1.1 mrg { 863 1.1 mrg fprintf (dump_file, " Loops range found for "); 864 1.1 mrg print_generic_expr (dump_file, phi_def, TDF_SLIM); 865 1.1 mrg fprintf (dump_file, ": "); 866 1.1 mrg loop_range.dump (dump_file); 867 1.1 mrg fprintf (dump_file, " and calculated range :"); 868 1.1 mrg r.dump (dump_file); 869 1.1 mrg fprintf (dump_file, "\n"); 870 1.1 mrg } 871 1.1 mrg r.intersect (loop_range); 872 1.1 mrg } 873 1.1 mrg } 874 1.1 mrg } 875 1.1 mrg 876 1.1 mrg return true; 877 1.1 mrg } 878 1.1 mrg 879 1.1 mrg // Calculate a range for call statement S and return it in R. 880 1.1 mrg // If a range cannot be calculated, return false. 881 1.1 mrg 882 1.1 mrg bool 883 1.1 mrg fold_using_range::range_of_call (irange &r, gcall *call, fur_source &src) 884 1.1 mrg { 885 1.1 mrg tree type = gimple_range_type (call); 886 1.1 mrg if (!type) 887 1.1 mrg return false; 888 1.1 mrg 889 1.1 mrg tree lhs = gimple_call_lhs (call); 890 1.1 mrg bool strict_overflow_p; 891 1.1 mrg 892 1.1 mrg if (range_of_builtin_call (r, call, src)) 893 1.1 mrg ; 894 1.1 mrg else if (gimple_stmt_nonnegative_warnv_p (call, &strict_overflow_p)) 895 1.1 mrg r.set (build_int_cst (type, 0), TYPE_MAX_VALUE (type)); 896 1.1 mrg else if (gimple_call_nonnull_result_p (call) 897 1.1 mrg || gimple_call_nonnull_arg (call)) 898 1.1 mrg r = range_nonzero (type); 899 1.1 mrg else 900 1.1 mrg r.set_varying (type); 901 1.1 mrg 902 1.1 mrg // If there is an LHS, intersect that with what is known. 903 1.1 mrg if (lhs) 904 1.1 mrg { 905 1.1 mrg value_range def; 906 1.1 mrg def = gimple_range_global (lhs); 907 1.1 mrg r.intersect (def); 908 1.1 mrg } 909 1.1 mrg return true; 910 1.1 mrg } 911 1.1 mrg 912 1.1 mrg // Return the range of a __builtin_ubsan* in CALL and set it in R. 913 1.1 mrg // CODE is the type of ubsan call (PLUS_EXPR, MINUS_EXPR or 914 1.1 mrg // MULT_EXPR). 915 1.1 mrg 916 1.1 mrg void 917 1.1 mrg fold_using_range::range_of_builtin_ubsan_call (irange &r, gcall *call, 918 1.1 mrg tree_code code, fur_source &src) 919 1.1 mrg { 920 1.1 mrg gcc_checking_assert (code == PLUS_EXPR || code == MINUS_EXPR 921 1.1 mrg || code == MULT_EXPR); 922 1.1 mrg tree type = gimple_range_type (call); 923 1.1 mrg range_operator *op = range_op_handler (code, type); 924 1.1 mrg gcc_checking_assert (op); 925 1.1 mrg int_range_max ir0, ir1; 926 1.1 mrg tree arg0 = gimple_call_arg (call, 0); 927 1.1 mrg tree arg1 = gimple_call_arg (call, 1); 928 1.1 mrg src.get_operand (ir0, arg0); 929 1.1 mrg src.get_operand (ir1, arg1); 930 1.1 mrg // Check for any relation between arg0 and arg1. 931 1.1 mrg relation_kind relation = src.query_relation (arg0, arg1); 932 1.1 mrg 933 1.1 mrg bool saved_flag_wrapv = flag_wrapv; 934 1.1 mrg // Pretend the arithmetic is wrapping. If there is any overflow, 935 1.1 mrg // we'll complain, but will actually do wrapping operation. 936 1.1 mrg flag_wrapv = 1; 937 1.1 mrg op->fold_range (r, type, ir0, ir1, relation); 938 1.1 mrg flag_wrapv = saved_flag_wrapv; 939 1.1 mrg 940 1.1 mrg // If for both arguments vrp_valueize returned non-NULL, this should 941 1.1 mrg // have been already folded and if not, it wasn't folded because of 942 1.1 mrg // overflow. Avoid removing the UBSAN_CHECK_* calls in that case. 943 1.1 mrg if (r.singleton_p ()) 944 1.1 mrg r.set_varying (type); 945 1.1 mrg } 946 1.1 mrg 947 1.1 mrg // Return TRUE if we recognize the target character set and return the 948 1.1 mrg // range for lower case and upper case letters. 949 1.1 mrg 950 1.1 mrg static bool 951 1.1 mrg get_letter_range (tree type, irange &lowers, irange &uppers) 952 1.1 mrg { 953 1.1 mrg // ASCII 954 1.1 mrg int a = lang_hooks.to_target_charset ('a'); 955 1.1 mrg int z = lang_hooks.to_target_charset ('z'); 956 1.1 mrg int A = lang_hooks.to_target_charset ('A'); 957 1.1 mrg int Z = lang_hooks.to_target_charset ('Z'); 958 1.1 mrg 959 1.1 mrg if ((z - a == 25) && (Z - A == 25)) 960 1.1 mrg { 961 1.1 mrg lowers = int_range<2> (build_int_cst (type, a), build_int_cst (type, z)); 962 1.1 mrg uppers = int_range<2> (build_int_cst (type, A), build_int_cst (type, Z)); 963 1.1 mrg return true; 964 1.1 mrg } 965 1.1 mrg // Unknown character set. 966 1.1 mrg return false; 967 1.1 mrg } 968 1.1 mrg 969 1.1 mrg // For a builtin in CALL, return a range in R if known and return 970 1.1 mrg // TRUE. Otherwise return FALSE. 971 1.1 mrg 972 1.1 mrg bool 973 1.1 mrg fold_using_range::range_of_builtin_call (irange &r, gcall *call, 974 1.1 mrg fur_source &src) 975 1.1 mrg { 976 1.1 mrg combined_fn func = gimple_call_combined_fn (call); 977 1.1 mrg if (func == CFN_LAST) 978 1.1 mrg return false; 979 1.1 mrg 980 1.1 mrg tree type = gimple_range_type (call); 981 1.1 mrg tree arg; 982 1.1 mrg int mini, maxi, zerov = 0, prec; 983 1.1 mrg scalar_int_mode mode; 984 1.1 mrg 985 1.1 mrg switch (func) 986 1.1 mrg { 987 1.1 mrg case CFN_BUILT_IN_CONSTANT_P: 988 1.1 mrg arg = gimple_call_arg (call, 0); 989 1.1 mrg if (src.get_operand (r, arg) && r.singleton_p ()) 990 1.1 mrg { 991 1.1 mrg r.set (build_one_cst (type), build_one_cst (type)); 992 1.1 mrg return true; 993 1.1 mrg } 994 1.1 mrg if (cfun->after_inlining) 995 1.1 mrg { 996 1.1 mrg r.set_zero (type); 997 1.1 mrg // r.equiv_clear (); 998 1.1 mrg return true; 999 1.1 mrg } 1000 1.1 mrg break; 1001 1.1 mrg 1002 1.1 mrg case CFN_BUILT_IN_TOUPPER: 1003 1.1 mrg { 1004 1.1 mrg arg = gimple_call_arg (call, 0); 1005 1.1 mrg // If the argument isn't compatible with the LHS, do nothing. 1006 1.1 mrg if (!range_compatible_p (type, TREE_TYPE (arg))) 1007 1.1 mrg return false; 1008 1.1 mrg if (!src.get_operand (r, arg)) 1009 1.1 mrg return false; 1010 1.1 mrg 1011 1.1 mrg int_range<3> lowers; 1012 1.1 mrg int_range<3> uppers; 1013 1.1 mrg if (!get_letter_range (type, lowers, uppers)) 1014 1.1 mrg return false; 1015 1.1 mrg 1016 1.1 mrg // Return the range passed in without any lower case characters, 1017 1.1 mrg // but including all the upper case ones. 1018 1.1 mrg lowers.invert (); 1019 1.1 mrg r.intersect (lowers); 1020 1.1 mrg r.union_ (uppers); 1021 1.1 mrg return true; 1022 1.1 mrg } 1023 1.1 mrg 1024 1.1 mrg case CFN_BUILT_IN_TOLOWER: 1025 1.1 mrg { 1026 1.1 mrg arg = gimple_call_arg (call, 0); 1027 1.1 mrg // If the argument isn't compatible with the LHS, do nothing. 1028 1.1 mrg if (!range_compatible_p (type, TREE_TYPE (arg))) 1029 1.1 mrg return false; 1030 1.1 mrg if (!src.get_operand (r, arg)) 1031 1.1 mrg return false; 1032 1.1 mrg 1033 1.1 mrg int_range<3> lowers; 1034 1.1 mrg int_range<3> uppers; 1035 1.1 mrg if (!get_letter_range (type, lowers, uppers)) 1036 1.1 mrg return false; 1037 1.1 mrg 1038 1.1 mrg // Return the range passed in without any upper case characters, 1039 1.1 mrg // but including all the lower case ones. 1040 1.1 mrg uppers.invert (); 1041 1.1 mrg r.intersect (uppers); 1042 1.1 mrg r.union_ (lowers); 1043 1.1 mrg return true; 1044 1.1 mrg } 1045 1.1 mrg 1046 1.1 mrg CASE_CFN_FFS: 1047 1.1 mrg CASE_CFN_POPCOUNT: 1048 1.1 mrg // __builtin_ffs* and __builtin_popcount* return [0, prec]. 1049 1.1 mrg arg = gimple_call_arg (call, 0); 1050 1.1 mrg prec = TYPE_PRECISION (TREE_TYPE (arg)); 1051 1.1 mrg mini = 0; 1052 1.1 mrg maxi = prec; 1053 1.1 mrg src.get_operand (r, arg); 1054 1.1 mrg // If arg is non-zero, then ffs or popcount are non-zero. 1055 1.1 mrg if (!range_includes_zero_p (&r)) 1056 1.1 mrg mini = 1; 1057 1.1 mrg // If some high bits are known to be zero, decrease the maximum. 1058 1.1 mrg if (!r.undefined_p ()) 1059 1.1 mrg { 1060 1.1 mrg if (TYPE_SIGN (r.type ()) == SIGNED) 1061 1.1 mrg range_cast (r, unsigned_type_for (r.type ())); 1062 1.1 mrg wide_int max = r.upper_bound (); 1063 1.1 mrg maxi = wi::floor_log2 (max) + 1; 1064 1.1 mrg } 1065 1.1 mrg r.set (build_int_cst (type, mini), build_int_cst (type, maxi)); 1066 1.1 mrg return true; 1067 1.1 mrg 1068 1.1 mrg CASE_CFN_PARITY: 1069 1.1 mrg r.set (build_zero_cst (type), build_one_cst (type)); 1070 1.1 mrg return true; 1071 1.1 mrg 1072 1.1 mrg CASE_CFN_CLZ: 1073 1.1 mrg // __builtin_c[lt]z* return [0, prec-1], except when the 1074 1.1 mrg // argument is 0, but that is undefined behavior. 1075 1.1 mrg // 1076 1.1 mrg // For __builtin_c[lt]z* consider argument of 0 always undefined 1077 1.1 mrg // behavior, for internal fns depending on C?Z_DEFINED_VALUE_AT_ZERO. 1078 1.1 mrg arg = gimple_call_arg (call, 0); 1079 1.1 mrg prec = TYPE_PRECISION (TREE_TYPE (arg)); 1080 1.1 mrg mini = 0; 1081 1.1 mrg maxi = prec - 1; 1082 1.1 mrg mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg)); 1083 1.1 mrg if (gimple_call_internal_p (call)) 1084 1.1 mrg { 1085 1.1 mrg if (optab_handler (clz_optab, mode) != CODE_FOR_nothing 1086 1.1 mrg && CLZ_DEFINED_VALUE_AT_ZERO (mode, zerov) == 2) 1087 1.1 mrg { 1088 1.1 mrg // Only handle the single common value. 1089 1.1 mrg if (zerov == prec) 1090 1.1 mrg maxi = prec; 1091 1.1 mrg else 1092 1.1 mrg // Magic value to give up, unless we can prove arg is non-zero. 1093 1.1 mrg mini = -2; 1094 1.1 mrg } 1095 1.1 mrg } 1096 1.1 mrg 1097 1.1 mrg src.get_operand (r, arg); 1098 1.1 mrg // From clz of minimum we can compute result maximum. 1099 1.1 mrg if (!r.undefined_p ()) 1100 1.1 mrg { 1101 1.1 mrg // From clz of minimum we can compute result maximum. 1102 1.1 mrg if (wi::gt_p (r.lower_bound (), 0, TYPE_SIGN (r.type ()))) 1103 1.1 mrg { 1104 1.1 mrg maxi = prec - 1 - wi::floor_log2 (r.lower_bound ()); 1105 1.1 mrg if (mini == -2) 1106 1.1 mrg mini = 0; 1107 1.1 mrg } 1108 1.1 mrg else if (!range_includes_zero_p (&r)) 1109 1.1 mrg { 1110 1.1 mrg mini = 0; 1111 1.1 mrg maxi = prec - 1; 1112 1.1 mrg } 1113 1.1 mrg if (mini == -2) 1114 1.1 mrg break; 1115 1.1 mrg // From clz of maximum we can compute result minimum. 1116 1.1 mrg wide_int max = r.upper_bound (); 1117 1.1 mrg int newmini = prec - 1 - wi::floor_log2 (max); 1118 1.1 mrg if (max == 0) 1119 1.1 mrg { 1120 1.1 mrg // If CLZ_DEFINED_VALUE_AT_ZERO is 2 with VALUE of prec, 1121 1.1 mrg // return [prec, prec], otherwise ignore the range. 1122 1.1 mrg if (maxi == prec) 1123 1.1 mrg mini = prec; 1124 1.1 mrg } 1125 1.1 mrg else 1126 1.1 mrg mini = newmini; 1127 1.1 mrg } 1128 1.1 mrg if (mini == -2) 1129 1.1 mrg break; 1130 1.1 mrg r.set (build_int_cst (type, mini), build_int_cst (type, maxi)); 1131 1.1 mrg return true; 1132 1.1 mrg 1133 1.1 mrg CASE_CFN_CTZ: 1134 1.1 mrg // __builtin_ctz* return [0, prec-1], except for when the 1135 1.1 mrg // argument is 0, but that is undefined behavior. 1136 1.1 mrg // 1137 1.1 mrg // For __builtin_ctz* consider argument of 0 always undefined 1138 1.1 mrg // behavior, for internal fns depending on CTZ_DEFINED_VALUE_AT_ZERO. 1139 1.1 mrg arg = gimple_call_arg (call, 0); 1140 1.1 mrg prec = TYPE_PRECISION (TREE_TYPE (arg)); 1141 1.1 mrg mini = 0; 1142 1.1 mrg maxi = prec - 1; 1143 1.1 mrg mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg)); 1144 1.1 mrg if (gimple_call_internal_p (call)) 1145 1.1 mrg { 1146 1.1 mrg if (optab_handler (ctz_optab, mode) != CODE_FOR_nothing 1147 1.1 mrg && CTZ_DEFINED_VALUE_AT_ZERO (mode, zerov) == 2) 1148 1.1 mrg { 1149 1.1 mrg // Handle only the two common values. 1150 1.1 mrg if (zerov == -1) 1151 1.1 mrg mini = -1; 1152 1.1 mrg else if (zerov == prec) 1153 1.1 mrg maxi = prec; 1154 1.1 mrg else 1155 1.1 mrg // Magic value to give up, unless we can prove arg is non-zero. 1156 1.1 mrg mini = -2; 1157 1.1 mrg } 1158 1.1 mrg } 1159 1.1 mrg src.get_operand (r, arg); 1160 1.1 mrg if (!r.undefined_p ()) 1161 1.1 mrg { 1162 1.1 mrg // If arg is non-zero, then use [0, prec - 1]. 1163 1.1 mrg if (!range_includes_zero_p (&r)) 1164 1.1 mrg { 1165 1.1 mrg mini = 0; 1166 1.1 mrg maxi = prec - 1; 1167 1.1 mrg } 1168 1.1 mrg // If some high bits are known to be zero, we can decrease 1169 1.1 mrg // the maximum. 1170 1.1 mrg wide_int max = r.upper_bound (); 1171 1.1 mrg if (max == 0) 1172 1.1 mrg { 1173 1.1 mrg // Argument is [0, 0]. If CTZ_DEFINED_VALUE_AT_ZERO 1174 1.1 mrg // is 2 with value -1 or prec, return [-1, -1] or [prec, prec]. 1175 1.1 mrg // Otherwise ignore the range. 1176 1.1 mrg if (mini == -1) 1177 1.1 mrg maxi = -1; 1178 1.1 mrg else if (maxi == prec) 1179 1.1 mrg mini = prec; 1180 1.1 mrg } 1181 1.1 mrg // If value at zero is prec and 0 is in the range, we can't lower 1182 1.1 mrg // the upper bound. We could create two separate ranges though, 1183 1.1 mrg // [0,floor_log2(max)][prec,prec] though. 1184 1.1 mrg else if (maxi != prec) 1185 1.1 mrg maxi = wi::floor_log2 (max); 1186 1.1 mrg } 1187 1.1 mrg if (mini == -2) 1188 1.1 mrg break; 1189 1.1 mrg r.set (build_int_cst (type, mini), build_int_cst (type, maxi)); 1190 1.1 mrg return true; 1191 1.1 mrg 1192 1.1 mrg CASE_CFN_CLRSB: 1193 1.1 mrg arg = gimple_call_arg (call, 0); 1194 1.1 mrg prec = TYPE_PRECISION (TREE_TYPE (arg)); 1195 1.1 mrg r.set (build_int_cst (type, 0), build_int_cst (type, prec - 1)); 1196 1.1 mrg return true; 1197 1.1 mrg case CFN_UBSAN_CHECK_ADD: 1198 1.1 mrg range_of_builtin_ubsan_call (r, call, PLUS_EXPR, src); 1199 1.1 mrg return true; 1200 1.1 mrg case CFN_UBSAN_CHECK_SUB: 1201 1.1 mrg range_of_builtin_ubsan_call (r, call, MINUS_EXPR, src); 1202 1.1 mrg return true; 1203 1.1 mrg case CFN_UBSAN_CHECK_MUL: 1204 1.1 mrg range_of_builtin_ubsan_call (r, call, MULT_EXPR, src); 1205 1.1 mrg return true; 1206 1.1 mrg 1207 1.1 mrg case CFN_GOACC_DIM_SIZE: 1208 1.1 mrg case CFN_GOACC_DIM_POS: 1209 1.1 mrg // Optimizing these two internal functions helps the loop 1210 1.1 mrg // optimizer eliminate outer comparisons. Size is [1,N] 1211 1.1 mrg // and pos is [0,N-1]. 1212 1.1 mrg { 1213 1.1 mrg bool is_pos = func == CFN_GOACC_DIM_POS; 1214 1.1 mrg int axis = oacc_get_ifn_dim_arg (call); 1215 1.1 mrg int size = oacc_get_fn_dim_size (current_function_decl, axis); 1216 1.1 mrg if (!size) 1217 1.1 mrg // If it's dynamic, the backend might know a hardware limitation. 1218 1.1 mrg size = targetm.goacc.dim_limit (axis); 1219 1.1 mrg 1220 1.1 mrg r.set (build_int_cst (type, is_pos ? 0 : 1), 1221 1.1 mrg size 1222 1.1 mrg ? build_int_cst (type, size - is_pos) : vrp_val_max (type)); 1223 1.1 mrg return true; 1224 1.1 mrg } 1225 1.1 mrg 1226 1.1 mrg case CFN_BUILT_IN_STRLEN: 1227 1.1 mrg if (tree lhs = gimple_call_lhs (call)) 1228 1.1 mrg if (ptrdiff_type_node 1229 1.1 mrg && (TYPE_PRECISION (ptrdiff_type_node) 1230 1.1 mrg == TYPE_PRECISION (TREE_TYPE (lhs)))) 1231 1.1 mrg { 1232 1.1 mrg tree type = TREE_TYPE (lhs); 1233 1.1 mrg tree max = vrp_val_max (ptrdiff_type_node); 1234 1.1 mrg wide_int wmax 1235 1.1 mrg = wi::to_wide (max, TYPE_PRECISION (TREE_TYPE (max))); 1236 1.1 mrg tree range_min = build_zero_cst (type); 1237 1.1 mrg // To account for the terminating NULL, the maximum length 1238 1.1 mrg // is one less than the maximum array size, which in turn 1239 1.1 mrg // is one less than PTRDIFF_MAX (or SIZE_MAX where it's 1240 1.1 mrg // smaller than the former type). 1241 1.1 mrg // FIXME: Use max_object_size() - 1 here. 1242 1.1 mrg tree range_max = wide_int_to_tree (type, wmax - 2); 1243 1.1 mrg r.set (range_min, range_max); 1244 1.1 mrg return true; 1245 1.1 mrg } 1246 1.1 mrg break; 1247 1.1 mrg default: 1248 1.1 mrg break; 1249 1.1 mrg } 1250 1.1 mrg return false; 1251 1.1 mrg } 1252 1.1 mrg 1253 1.1 mrg 1254 1.1 mrg // Calculate a range for COND_EXPR statement S and return it in R. 1255 1.1 mrg // If a range cannot be calculated, return false. 1256 1.1 mrg 1257 1.1 mrg bool 1258 1.1 mrg fold_using_range::range_of_cond_expr (irange &r, gassign *s, fur_source &src) 1259 1.1 mrg { 1260 1.1 mrg int_range_max cond_range, range1, range2; 1261 1.1 mrg tree cond = gimple_assign_rhs1 (s); 1262 1.1 mrg tree op1 = gimple_assign_rhs2 (s); 1263 1.1 mrg tree op2 = gimple_assign_rhs3 (s); 1264 1.1 mrg 1265 1.1 mrg tree type = gimple_range_type (s); 1266 1.1 mrg if (!type) 1267 1.1 mrg return false; 1268 1.1 mrg 1269 1.1 mrg gcc_checking_assert (gimple_assign_rhs_code (s) == COND_EXPR); 1270 1.1 mrg gcc_checking_assert (range_compatible_p (TREE_TYPE (op1), TREE_TYPE (op2))); 1271 1.1 mrg src.get_operand (cond_range, cond); 1272 1.1 mrg src.get_operand (range1, op1); 1273 1.1 mrg src.get_operand (range2, op2); 1274 1.1 mrg 1275 1.1 mrg // Try to see if there is a dependence between the COND and either operand 1276 1.1 mrg if (src.gori ()) 1277 1.1 mrg if (src.gori ()->condexpr_adjust (range1, range2, s, cond, op1, op2, src)) 1278 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1279 1.1 mrg { 1280 1.1 mrg fprintf (dump_file, "Possible COND_EXPR adjustment. Range op1 : "); 1281 1.1 mrg range1.dump(dump_file); 1282 1.1 mrg fprintf (dump_file, " and Range op2: "); 1283 1.1 mrg range2.dump(dump_file); 1284 1.1 mrg fprintf (dump_file, "\n"); 1285 1.1 mrg } 1286 1.1 mrg 1287 1.1 mrg // If the condition is known, choose the appropriate expression. 1288 1.1 mrg if (cond_range.singleton_p ()) 1289 1.1 mrg { 1290 1.1 mrg // False, pick second operand. 1291 1.1 mrg if (cond_range.zero_p ()) 1292 1.1 mrg r = range2; 1293 1.1 mrg else 1294 1.1 mrg r = range1; 1295 1.1 mrg } 1296 1.1 mrg else 1297 1.1 mrg { 1298 1.1 mrg r = range1; 1299 1.1 mrg r.union_ (range2); 1300 1.1 mrg } 1301 1.1 mrg gcc_checking_assert (r.undefined_p () 1302 1.1 mrg || range_compatible_p (r.type (), type)); 1303 1.1 mrg return true; 1304 1.1 mrg } 1305 1.1 mrg 1306 1.1 mrg // If SCEV has any information about phi node NAME, return it as a range in R. 1307 1.1 mrg 1308 1.1 mrg void 1309 1.1 mrg fold_using_range::range_of_ssa_name_with_loop_info (irange &r, tree name, 1310 1.1 mrg class loop *l, gphi *phi, 1311 1.1 mrg fur_source &src) 1312 1.1 mrg { 1313 1.1 mrg gcc_checking_assert (TREE_CODE (name) == SSA_NAME); 1314 1.1 mrg tree min, max, type = TREE_TYPE (name); 1315 1.1 mrg if (bounds_of_var_in_loop (&min, &max, src.query (), l, phi, name)) 1316 1.1 mrg { 1317 1.1 mrg if (TREE_CODE (min) != INTEGER_CST) 1318 1.1 mrg { 1319 1.1 mrg if (src.query ()->range_of_expr (r, min, phi) && !r.undefined_p ()) 1320 1.1 mrg min = wide_int_to_tree (type, r.lower_bound ()); 1321 1.1 mrg else 1322 1.1 mrg min = vrp_val_min (type); 1323 1.1 mrg } 1324 1.1 mrg if (TREE_CODE (max) != INTEGER_CST) 1325 1.1 mrg { 1326 1.1 mrg if (src.query ()->range_of_expr (r, max, phi) && !r.undefined_p ()) 1327 1.1 mrg max = wide_int_to_tree (type, r.upper_bound ()); 1328 1.1 mrg else 1329 1.1 mrg max = vrp_val_max (type); 1330 1.1 mrg } 1331 1.1 mrg r.set (min, max); 1332 1.1 mrg } 1333 1.1 mrg else 1334 1.1 mrg r.set_varying (type); 1335 1.1 mrg } 1336 1.1 mrg 1337 1.1 mrg // ----------------------------------------------------------------------- 1338 1.1 mrg 1339 1.1 mrg // Check if an && or || expression can be folded based on relations. ie 1340 1.1 mrg // c_2 = a_6 > b_7 1341 1.1 mrg // c_3 = a_6 < b_7 1342 1.1 mrg // c_4 = c_2 && c_3 1343 1.1 mrg // c_2 and c_3 can never be true at the same time, 1344 1.1 mrg // Therefore c_4 can always resolve to false based purely on the relations. 1345 1.1 mrg 1346 1.1 mrg void 1347 1.1 mrg fold_using_range::relation_fold_and_or (irange& lhs_range, gimple *s, 1348 1.1 mrg fur_source &src) 1349 1.1 mrg { 1350 1.1 mrg // No queries or already folded. 1351 1.1 mrg if (!src.gori () || !src.query ()->oracle () || lhs_range.singleton_p ()) 1352 1.1 mrg return; 1353 1.1 mrg 1354 1.1 mrg // Only care about AND and OR expressions. 1355 1.1 mrg enum tree_code code = gimple_expr_code (s); 1356 1.1 mrg bool is_and = false; 1357 1.1 mrg if (code == BIT_AND_EXPR || code == TRUTH_AND_EXPR) 1358 1.1 mrg is_and = true; 1359 1.1 mrg else if (code != BIT_IOR_EXPR && code != TRUTH_OR_EXPR) 1360 1.1 mrg return; 1361 1.1 mrg 1362 1.1 mrg tree lhs = gimple_get_lhs (s); 1363 1.1 mrg tree ssa1 = gimple_range_ssa_p (gimple_range_operand1 (s)); 1364 1.1 mrg tree ssa2 = gimple_range_ssa_p (gimple_range_operand2 (s)); 1365 1.1 mrg 1366 1.1 mrg // Deal with || and && only when there is a full set of symbolics. 1367 1.1 mrg if (!lhs || !ssa1 || !ssa2 1368 1.1 mrg || (TREE_CODE (TREE_TYPE (lhs)) != BOOLEAN_TYPE) 1369 1.1 mrg || (TREE_CODE (TREE_TYPE (ssa1)) != BOOLEAN_TYPE) 1370 1.1 mrg || (TREE_CODE (TREE_TYPE (ssa2)) != BOOLEAN_TYPE)) 1371 1.1 mrg return; 1372 1.1 mrg 1373 1.1 mrg // Now we know its a boolean AND or OR expression with boolean operands. 1374 1.1 mrg // Ideally we search dependencies for common names, and see what pops out. 1375 1.1 mrg // until then, simply try to resolve direct dependencies. 1376 1.1 mrg 1377 1.1 mrg gimple *ssa1_stmt = SSA_NAME_DEF_STMT (ssa1); 1378 1.1 mrg gimple *ssa2_stmt = SSA_NAME_DEF_STMT (ssa2); 1379 1.1 mrg 1380 1.1 mrg range_operator *handler1 = gimple_range_handler (SSA_NAME_DEF_STMT (ssa1)); 1381 1.1 mrg range_operator *handler2 = gimple_range_handler (SSA_NAME_DEF_STMT (ssa2)); 1382 1.1 mrg 1383 1.1 mrg // If either handler is not present, no relation can be found. 1384 1.1 mrg if (!handler1 || !handler2) 1385 1.1 mrg return; 1386 1.1 mrg 1387 1.1 mrg // Both stmts will need to have 2 ssa names in the stmt. 1388 1.1 mrg tree ssa1_dep1 = gimple_range_ssa_p (gimple_range_operand1 (ssa1_stmt)); 1389 1.1 mrg tree ssa1_dep2 = gimple_range_ssa_p (gimple_range_operand2 (ssa1_stmt)); 1390 1.1 mrg tree ssa2_dep1 = gimple_range_ssa_p (gimple_range_operand1 (ssa2_stmt)); 1391 1.1 mrg tree ssa2_dep2 = gimple_range_ssa_p (gimple_range_operand2 (ssa2_stmt)); 1392 1.1 mrg 1393 1.1 mrg if (!ssa1_dep1 || !ssa1_dep2 || !ssa2_dep1 || !ssa2_dep2) 1394 1.1 mrg return; 1395 1.1 mrg 1396 1.1 mrg // Make sure they are the same dependencies, and detect the order of the 1397 1.1 mrg // relationship. 1398 1.1 mrg bool reverse_op2 = true; 1399 1.1 mrg if (ssa1_dep1 == ssa2_dep1 && ssa1_dep2 == ssa2_dep2) 1400 1.1 mrg reverse_op2 = false; 1401 1.1 mrg else if (ssa1_dep1 != ssa2_dep2 || ssa1_dep2 != ssa2_dep1) 1402 1.1 mrg return; 1403 1.1 mrg 1404 1.1 mrg int_range<2> bool_one (boolean_true_node, boolean_true_node); 1405 1.1 mrg 1406 1.1 mrg relation_kind relation1 = handler1->op1_op2_relation (bool_one); 1407 1.1 mrg relation_kind relation2 = handler2->op1_op2_relation (bool_one); 1408 1.1 mrg if (relation1 == VREL_NONE || relation2 == VREL_NONE) 1409 1.1 mrg return; 1410 1.1 mrg 1411 1.1 mrg if (reverse_op2) 1412 1.1 mrg relation2 = relation_negate (relation2); 1413 1.1 mrg 1414 1.1 mrg // x && y is false if the relation intersection of the true cases is NULL. 1415 1.1 mrg if (is_and && relation_intersect (relation1, relation2) == VREL_EMPTY) 1416 1.1 mrg lhs_range = int_range<2> (boolean_false_node, boolean_false_node); 1417 1.1 mrg // x || y is true if the union of the true cases is NO-RELATION.. 1418 1.1 mrg // ie, one or the other being true covers the full range of possibilties. 1419 1.1 mrg else if (!is_and && relation_union (relation1, relation2) == VREL_NONE) 1420 1.1 mrg lhs_range = bool_one; 1421 1.1 mrg else 1422 1.1 mrg return; 1423 1.1 mrg 1424 1.1 mrg range_cast (lhs_range, TREE_TYPE (lhs)); 1425 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1426 1.1 mrg { 1427 1.1 mrg fprintf (dump_file, " Relation adjustment: "); 1428 1.1 mrg print_generic_expr (dump_file, ssa1, TDF_SLIM); 1429 1.1 mrg fprintf (dump_file, " and "); 1430 1.1 mrg print_generic_expr (dump_file, ssa2, TDF_SLIM); 1431 1.1 mrg fprintf (dump_file, " combine to produce "); 1432 1.1 mrg lhs_range.dump (dump_file); 1433 1.1 mrg fputc ('\n', dump_file); 1434 1.1 mrg } 1435 1.1 mrg 1436 1.1 mrg return; 1437 1.1 mrg } 1438 1.1 mrg 1439 1.1 mrg // Register any outgoing edge relations from a conditional branch. 1440 1.1 mrg 1441 1.1 mrg void 1442 1.1 mrg fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge e1) 1443 1.1 mrg { 1444 1.1 mrg int_range_max r; 1445 1.1 mrg int_range<2> e0_range, e1_range; 1446 1.1 mrg tree name; 1447 1.1 mrg range_operator *handler; 1448 1.1 mrg basic_block bb = gimple_bb (s); 1449 1.1 mrg 1450 1.1 mrg if (e0) 1451 1.1 mrg { 1452 1.1 mrg // If this edge is never taken, ignore it. 1453 1.1 mrg gcond_edge_range (e0_range, e0); 1454 1.1 mrg e0_range.intersect (lhs_range); 1455 1.1 mrg if (e0_range.undefined_p ()) 1456 1.1 mrg e0 = NULL; 1457 1.1 mrg } 1458 1.1 mrg 1459 1.1 mrg 1460 1.1 mrg if (e1) 1461 1.1 mrg { 1462 1.1 mrg // If this edge is never taken, ignore it. 1463 1.1 mrg gcond_edge_range (e1_range, e1); 1464 1.1 mrg e1_range.intersect (lhs_range); 1465 1.1 mrg if (e1_range.undefined_p ()) 1466 1.1 mrg e1 = NULL; 1467 1.1 mrg } 1468 1.1 mrg 1469 1.1 mrg if (!e0 && !e1) 1470 1.1 mrg return; 1471 1.1 mrg 1472 1.1 mrg // First, register the gcond itself. This will catch statements like 1473 1.1 mrg // if (a_2 < b_5) 1474 1.1 mrg tree ssa1 = gimple_range_ssa_p (gimple_range_operand1 (s)); 1475 1.1 mrg tree ssa2 = gimple_range_ssa_p (gimple_range_operand2 (s)); 1476 1.1 mrg if (ssa1 && ssa2) 1477 1.1 mrg { 1478 1.1 mrg handler = gimple_range_handler (s); 1479 1.1 mrg gcc_checking_assert (handler); 1480 1.1 mrg if (e0) 1481 1.1 mrg { 1482 1.1 mrg relation_kind relation = handler->op1_op2_relation (e0_range); 1483 1.1 mrg if (relation != VREL_NONE) 1484 1.1 mrg register_relation (e0, relation, ssa1, ssa2); 1485 1.1 mrg } 1486 1.1 mrg if (e1) 1487 1.1 mrg { 1488 1.1 mrg relation_kind relation = handler->op1_op2_relation (e1_range); 1489 1.1 mrg if (relation != VREL_NONE) 1490 1.1 mrg register_relation (e1, relation, ssa1, ssa2); 1491 1.1 mrg } 1492 1.1 mrg } 1493 1.1 mrg 1494 1.1 mrg // Outgoing relations of GORI exports require a gori engine. 1495 1.1 mrg if (!gori ()) 1496 1.1 mrg return; 1497 1.1 mrg 1498 1.1 mrg // Now look for other relations in the exports. This will find stmts 1499 1.1 mrg // leading to the condition such as: 1500 1.1 mrg // c_2 = a_4 < b_7 1501 1.1 mrg // if (c_2) 1502 1.1 mrg FOR_EACH_GORI_EXPORT_NAME (*(gori ()), bb, name) 1503 1.1 mrg { 1504 1.1 mrg if (TREE_CODE (TREE_TYPE (name)) != BOOLEAN_TYPE) 1505 1.1 mrg continue; 1506 1.1 mrg gimple *stmt = SSA_NAME_DEF_STMT (name); 1507 1.1 mrg handler = gimple_range_handler (stmt); 1508 1.1 mrg if (!handler) 1509 1.1 mrg continue; 1510 1.1 mrg tree ssa1 = gimple_range_ssa_p (gimple_range_operand1 (stmt)); 1511 1.1 mrg tree ssa2 = gimple_range_ssa_p (gimple_range_operand2 (stmt)); 1512 1.1 mrg if (ssa1 && ssa2) 1513 1.1 mrg { 1514 1.1 mrg if (e0 && gori ()->outgoing_edge_range_p (r, e0, name, *m_query) 1515 1.1 mrg && r.singleton_p ()) 1516 1.1 mrg { 1517 1.1 mrg relation_kind relation = handler->op1_op2_relation (r); 1518 1.1 mrg if (relation != VREL_NONE) 1519 1.1 mrg register_relation (e0, relation, ssa1, ssa2); 1520 1.1 mrg } 1521 1.1 mrg if (e1 && gori ()->outgoing_edge_range_p (r, e1, name, *m_query) 1522 1.1 mrg && r.singleton_p ()) 1523 1.1 mrg { 1524 1.1 mrg relation_kind relation = handler->op1_op2_relation (r); 1525 1.1 mrg if (relation != VREL_NONE) 1526 1.1 mrg register_relation (e1, relation, ssa1, ssa2); 1527 1.1 mrg } 1528 1.1 mrg } 1529 1.1 mrg } 1530 1.1 mrg } 1531