aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <jlaw@ventanamicro.com>2024-05-08 13:44:00 -0600
committerJeff Law <jlaw@ventanamicro.com>2024-05-08 13:44:00 -0600
commit1c234097487927a4388ddcc690b63597bb3a90dc (patch)
tree45ea0f51f01184691c615f1c9fcc52c00a6f7621
parentde4eea7d7ea86e54843507c68d6672eca9d8c7bb (diff)
downloadgcc-1c234097487927a4388ddcc690b63597bb3a90dc.zip
gcc-1c234097487927a4388ddcc690b63597bb3a90dc.tar.gz
gcc-1c234097487927a4388ddcc690b63597bb3a90dc.tar.bz2
[RISC-V][V2] Fix incorrect if-then-else nesting of Zbs usage in constant synthesis
Reposting without the patch that ignores whitespace. The CI system doesn't like including both patches, that'll generate a failure to apply and none of the tests actually get run. So I managed to goof the if-then-else level of the bseti bits last week. They were supposed to be a last ditch effort to improve the result, but ended up inside a conditional where they don't really belong. I almost always use Zba, Zbb and Zbs together, so it slipped by. So it's NFC if you always test with Zbb and Zbs enabled together. But if you enabled Zbs without Zbb you'd see a failure to use bseti. gcc/ * config/riscv/riscv.cc (riscv_build_integer_1): Fix incorrect if-then-else nesting of Zbs code.
-rw-r--r--gcc/config/riscv/riscv.cc81
1 files changed, 41 insertions, 40 deletions
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 62207b6..633b55f 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -878,50 +878,51 @@ riscv_build_integer_1 (struct riscv_integer_op codes[RISCV_MAX_INTEGER_OPS],
codes[1].use_uw = false;
cost = 2;
}
- /* Final cases, particularly focused on bseti. */
- else if (cost > 2 && TARGET_ZBS)
- {
- int i = 0;
+ }
- /* First handle any bits set by LUI. Be careful of the
- SImode sign bit!. */
- if (value & 0x7ffff800)
- {
- alt_codes[i].code = (i == 0 ? UNKNOWN : IOR);
- alt_codes[i].value = value & 0x7ffff800;
- alt_codes[i].use_uw = false;
- value &= ~0x7ffff800;
- i++;
- }
+ /* Final cases, particularly focused on bseti. */
+ if (cost > 2 && TARGET_ZBS)
+ {
+ int i = 0;
- /* Next, any bits we can handle with addi. */
- if (value & 0x7ff)
- {
- alt_codes[i].code = (i == 0 ? UNKNOWN : PLUS);
- alt_codes[i].value = value & 0x7ff;
- alt_codes[i].use_uw = false;
- value &= ~0x7ff;
- i++;
- }
+ /* First handle any bits set by LUI. Be careful of the
+ SImode sign bit!. */
+ if (value & 0x7ffff800)
+ {
+ alt_codes[i].code = (i == 0 ? UNKNOWN : IOR);
+ alt_codes[i].value = value & 0x7ffff800;
+ alt_codes[i].use_uw = false;
+ value &= ~0x7ffff800;
+ i++;
+ }
- /* And any residuals with bseti. */
- while (i < cost && value)
- {
- HOST_WIDE_INT bit = ctz_hwi (value);
- alt_codes[i].code = (i == 0 ? UNKNOWN : IOR);
- alt_codes[i].value = 1UL << bit;
- alt_codes[i].use_uw = false;
- value &= ~(1ULL << bit);
- i++;
- }
+ /* Next, any bits we can handle with addi. */
+ if (value & 0x7ff)
+ {
+ alt_codes[i].code = (i == 0 ? UNKNOWN : PLUS);
+ alt_codes[i].value = value & 0x7ff;
+ alt_codes[i].use_uw = false;
+ value &= ~0x7ff;
+ i++;
+ }
- /* If LUI+ADDI+BSETI resulted in a more efficient
- sequence, then use it. */
- if (i < cost)
- {
- memcpy (codes, alt_codes, sizeof (alt_codes));
- cost = i;
- }
+ /* And any residuals with bseti. */
+ while (i < cost && value)
+ {
+ HOST_WIDE_INT bit = ctz_hwi (value);
+ alt_codes[i].code = (i == 0 ? UNKNOWN : IOR);
+ alt_codes[i].value = 1UL << bit;
+ alt_codes[i].use_uw = false;
+ value &= ~(1ULL << bit);
+ i++;
+ }
+
+ /* If LUI+ADDI+BSETI resulted in a more efficient
+ sequence, then use it. */
+ if (i < cost)
+ {
+ memcpy (codes, alt_codes, sizeof (alt_codes));
+ cost = i;
}
}