aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRobin Dapp <rdapp@linux.ibm.com>2022-02-08 14:56:29 +0100
committerRobin Dapp <rdapp@linux.ibm.com>2022-02-08 15:28:53 +0100
commit1e3185e714e877b2b4d14ade0865322f71a8cbf6 (patch)
tree189545d046eac4085f79dd745f925d88ec4a9e61 /gcc
parent38a177fa4c2fd1ce75581145b3b8f12592b4aacd (diff)
downloadgcc-1e3185e714e877b2b4d14ade0865322f71a8cbf6.zip
gcc-1e3185e714e877b2b4d14ade0865322f71a8cbf6.tar.gz
gcc-1e3185e714e877b2b4d14ade0865322f71a8cbf6.tar.bz2
s390: Increase costs for load on condition and change movqicc expander.
This patch changes the costs for a load on condition from 5 to 6 in order to ensure that we only if-convert two and not three or more SETS like if (cond) { a = b; c = d; e = f; } In the movqicc expander we emit a paradoxical subreg directly that combine would otherwise try to create by using a non-optimal sequence (which would be too expensive). Also, fix two oversights in ifcvt testcases. gcc/ChangeLog: * config/s390/s390.cc (s390_rtx_costs): Increase costs for load on condition. * config/s390/s390.md: Use paradoxical subreg. gcc/testsuite/ChangeLog: * gcc.target/s390/ifcvt-two-insns-int.c: Fix array size. * gcc.target/s390/ifcvt-two-insns-long.c: Dito.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/s390/s390.cc2
-rw-r--r--gcc/config/s390/s390.md4
-rw-r--r--gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c3
-rw-r--r--gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c3
4 files changed, 5 insertions, 7 deletions
diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc
index c6cfe41..d2af6d8 100644
--- a/gcc/config/s390/s390.cc
+++ b/gcc/config/s390/s390.cc
@@ -3636,7 +3636,7 @@ s390_rtx_costs (rtx x, machine_mode mode, int outer_code,
/* It is going to be a load/store on condition. Make it
slightly more expensive than a normal load. */
- *total = COSTS_N_INSNS (1) + 1;
+ *total = COSTS_N_INSNS (1) + 2;
rtx dst = SET_DEST (x);
rtx then = XEXP (SET_SRC (x), 1);
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index e3ccbac..5eee8e8 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -7003,9 +7003,9 @@
if (!CONSTANT_P (els))
els = simplify_gen_subreg (E_SImode, els, <MODE>mode, 0);
- rtx tmp_target = gen_reg_rtx (E_SImode);
+ rtx tmp_target = simplify_gen_subreg (E_SImode, operands[0], <MODE>mode, 0);
+
emit_insn (gen_movsicc (tmp_target, operands[1], then, els));
- emit_move_insn (operands[0], gen_lowpart (<MODE>mode, tmp_target));
DONE;
})
diff --git a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c
index 1ced710..031cc43 100644
--- a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c
+++ b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c
@@ -5,7 +5,6 @@
/* { dg-final { scan-assembler "lochinle\t%r.?,1" } } */
/* { dg-final { scan-assembler "locrnle\t.*" } } */
-#include <stdbool.h>
#include <limits.h>
#include <stdio.h>
#include <assert.h>
@@ -33,7 +32,7 @@ int main()
{
int a[] = {2, 1, -13, INT_MAX, INT_MIN, 0};
- int res = foo (a, sizeof (a));
+ int res = foo (a, sizeof (a) / sizeof (a[0]));
assert (res == (INT_MIN + 1));
}
diff --git a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c
index 5a1173f..cd04d2a 100644
--- a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c
+++ b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c
@@ -5,7 +5,6 @@
/* { dg-final { scan-assembler "locghinle\t%r.?,1" } } */
/* { dg-final { scan-assembler "locgrnle\t.*" } } */
-#include <stdbool.h>
#include <limits.h>
#include <stdio.h>
#include <assert.h>
@@ -33,7 +32,7 @@ int main()
{
long a[] = {2, 1, -13, LONG_MAX, LONG_MIN, 0};
- long res = foo (a, sizeof (a));
+ long res = foo (a, sizeof (a) / sizeof (a[0]));
assert (res == (LONG_MIN + 1));
}