summaryrefslogtreecommitdiff
path: root/gcc/config/aarch64
diff options
context:
space:
mode:
authorwilco <wilco@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-20 12:24:48 +0000
committerwilco <wilco@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-20 12:24:48 +0000
commit2eaf269f2f71549489187537a1e2c3a7fa04863e (patch)
tree165f3fc8fc05c3a4ca201a83a58139a44d855c1e /gcc/config/aarch64
parent97c23bbe15264aa027435bd4feb1e42c10b5397b (diff)
downloadgcc-2eaf269f2f71549489187537a1e2c3a7fa04863e.tar.gz
Improve modes_tieable by returning true in more cases: allow scalar access
within vectors without requiring an extra move. Removing these moves helps the register allocator in deciding whether to use integer or FP registers on operations that can be done on both. This saves about 100 instructions in the gcc.target/aarch64 tests. A typical example: orr v1.8b, v0.8b, v1.8b fmov x0, d0 fmov x1, d1 add x0, x1, x0 ins v0.d[0], x0 orr v0.8b, v1.8b, v0.8b after: orr v1.8b, v0.8b, v1.8b add d0, d1, d0 orr v0.8b, v1.8b, v0.8b gcc/ * config/aarch64/aarch64.c (aarch64_modes_tieable_p): Allow scalar/single vector modes to be tieable. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@237597 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/aarch64')
-rw-r--r--gcc/config/aarch64/aarch64.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 4497002707e..46c917a17bc 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -12819,7 +12819,14 @@ aarch64_reverse_mask (enum machine_mode mode)
return force_reg (V16QImode, mask);
}
-/* Implement MODES_TIEABLE_P. */
+/* Implement MODES_TIEABLE_P. In principle we should always return true.
+ However due to issues with register allocation it is preferable to avoid
+ tieing integer scalar and FP scalar modes. Executing integer operations
+ in general registers is better than treating them as scalar vector
+ operations. This reduces latency and avoids redundant int<->FP moves.
+ So tie modes if they are either the same class, or vector modes with
+ other vector modes, vector structs or any scalar mode.
+*/
bool
aarch64_modes_tieable_p (machine_mode mode1, machine_mode mode2)
@@ -12830,9 +12837,12 @@ aarch64_modes_tieable_p (machine_mode mode1, machine_mode mode2)
/* We specifically want to allow elements of "structure" modes to
be tieable to the structure. This more general condition allows
other rarer situations too. */
- if (TARGET_SIMD
- && aarch64_vector_mode_p (mode1)
- && aarch64_vector_mode_p (mode2))
+ if (aarch64_vector_mode_p (mode1) && aarch64_vector_mode_p (mode2))
+ return true;
+
+ /* Also allow any scalar modes with vectors. */
+ if (aarch64_vector_mode_supported_p (mode1)
+ || aarch64_vector_mode_supported_p (mode2))
return true;
return false;