Summary: | A missed opportunity for SLSR | ||
---|---|---|---|
Product: | gcc | Reporter: | Martin Liška <marxin> |
Component: | tree-optimization | Assignee: | Bill Schmidt <bill.schmidt> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | bill.schmidt, danglin, rguenth |
Priority: | P3 | ||
Version: | 7.0 | ||
Target Milestone: | --- | ||
Host: | Target: | ||
Build: | Known to work: | ||
Known to fail: | Last reconfirmed: | 2016-10-19 00:00:00 | |
Bug Depends on: | |||
Bug Blocks: | 71490 |
Description
Martin Liška
2016-07-18 09:11:19 UTC
I'll have a look soon. *** Bug 77552 has been marked as a duplicate of this bug. *** Confirmed. Something is causing us to hate the second case now, assigning "infinite" cost to it: Processing dependency tree rooted at 5. Using existing initializer: _3 = -_2; Increment vector: 0 increment: -8 count: 1 cost: -24 initializer: _3 1 increment: -16 count: 1 cost: 1000 initializer: This is an example of a known limitation in SLSR. The explanation is in analyze_increments: /* FORNOW: If we need to add an initializer, give up if a cast from the candidate's type to its stride's type can lose precision. This could eventually be handled better by expressly retaining the result of a cast to a wider type in the stride. Example: short int _1; _2 = (int) _1; _3 = _2 * 10; _4 = x + _3; ADD: x + (10 * _1) : int _5 = _2 * 15; _6 = x + _3; ADD: x + (15 * _1) : int Right now replacing _6 would cause insertion of an initializer of the form "short int T = _1 * 5;" followed by a cast to int, which could overflow incorrectly. Had we recorded _2 or (int)_1 as the stride, this wouldn't happen. However, doing this breaks other opportunities, so this will require some care. */ In this case, we have "int" rather than "short int," and "int *" rather than "int". Assuming a 64-bit machine, casting from a 64-bit wrapping type to a 32-bit non-wrapping type isn't legal. I need to look at the stride-selection logic again. The various cast-sensitive bits of this are tricky to get right. Author: wschmidt Date: Mon Oct 31 03:04:59 2016 New Revision: 241695 URL: https://gcc.gnu.org/viewcvs?rev=241695&root=gcc&view=rev Log: [gcc] 2016-10-30 Bill Schmidt <wschmidt@linux.vnet.ibm.com> PR tree-optimization/71915 PR tree-optimization/71490 * gimple-ssa-strength-reduction.c (struct slsr_cand_d): Add stride_type field. (find_basis_for_base_expr): Require stride types to match when seeking a basis. (alloc_cand_and_find_basis): Record the stride type. (slsr_process_phi): Pass stride type to alloc_cand_and_find_basis. (backtrace_base_for_ref): Pass types to legal_cast_p_1 rather than the expressions having those types. (slsr_process_ref): Pass stride type to alloc_cand_and_find_basis. (create_mul_ssa_cand): Likewise. (create_mul_imm_cand): Likewise. (create_add_ssa_cand): Likewise. (create_add_imm_cand): Likewise. (legal_cast_p_1): Change interface to accept types rather than the expressions having those types. (legal_cast_p): Pass types to legal_cast_p_1. (slsr_process_cast): Pass stride type to alloc_cand_and_find_basis. (slsr_process_copy): Likewise. (dump_candidate): Display stride type when a cast exists. (create_add_on_incoming_edge): Introduce a cast when necessary for the stride type. (analyze_increments): Change the code checking for invalid casts to rely on the stride type, and update the documentation and example. Change the code checking for pointer multiplies to rely on the stride type. (insert_initializers): Introduce a cast when necessary for the stride type. Use the stride type for the type of the initializer. [gcc/testsuite] 2016-10-30 Bill Schmidt <wschmidt@linux.vnet.ibm.com> PR tree-optimization/71915 PR tree-optimization/71490 * gcc.dg/tree-ssa/pr54245.c: Delete. * gcc.dg/tree-ssa/slsr-8.c: Adjust for new optimization and document why. Removed: trunk/gcc/testsuite/gcc.dg/tree-ssa/pr54245.c Modified: trunk/gcc/ChangeLog trunk/gcc/gimple-ssa-strength-reduction.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gcc.dg/tree-ssa/slsr-8.c Fixed. |