]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
bitint: Fix handling of conditional bitfield loads [PR114365]
authorJakub Jelinek <jakub@redhat.com>
Wed, 20 Mar 2024 09:55:07 +0000 (10:55 +0100)
committerJakub Jelinek <jakub@redhat.com>
Wed, 20 Mar 2024 09:55:07 +0000 (10:55 +0100)
For the m_var_msb (aka left shift) case of large/huge _BitInt bitfield loads
handle_load adds a PHI node, but I forgot to actually update the temporary
the code later on uses, so the PHI result was unused and the code
incorrectly used something that wasn't valid SSA form.
In particular, we emitted
  if (_29 != 2)
    goto <bb 4>; [80.00%]
  else
    goto <bb 5>; [20.00%]

  <bb 4> [local count: 1073741824]:
  _33 = VIEW_CONVERT_EXPR<unsigned long[3]>(s.D.2771)[_31];

  <bb 5> [local count: 1073741824]:
  # _34 = PHI <_33(4), 0(3)>
  _35 = _32 >> 31;
  _36 = _33 << 33;
  _37 = _36 | _35;
  _38 = _37 << _19;
where instead of _33 the _36 def stmt should be using _34.

Fixed thusly.

2024-03-20  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/114365
* gimple-lower-bitint.cc (bitint_large_huge::handle_load): When adding
a PHI node, set iv2 to its result afterwards.

* gcc.dg/bitint-102.c: New test.

gcc/gimple-lower-bitint.cc
gcc/testsuite/gcc.dg/bitint-102.c [new file with mode: 0644]

index 40d814e5c38facd39e42ecad3e7fac46eae684c4..1ce13ca25799cfb9a3d507e45c7ba3469ba84189 100644 (file)
@@ -2026,6 +2026,7 @@ bitint_large_huge::handle_load (gimple *stmt, tree idx)
              add_phi_arg (phi, build_zero_cst (m_limb_type),
                           edge_false, UNKNOWN_LOCATION);
              m_gsi = gsi_after_labels (edge_true->dest);
+             iv2 = iv3;
            }
        }
       g = gimple_build_assign (make_ssa_name (m_limb_type), RSHIFT_EXPR,
diff --git a/gcc/testsuite/gcc.dg/bitint-102.c b/gcc/testsuite/gcc.dg/bitint-102.c
new file mode 100644 (file)
index 0000000..9f9861e
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR tree-optimization/114365 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-std=c23 -O2" } */
+
+struct S {
+  int : 31;
+#if __BITINT_MAXWIDTH__ >= 129
+  _BitInt(129) b : 129;
+#else
+  _BitInt(63) b : 63;
+#endif
+} s;
+
+void
+foo (int a)
+{
+  s.b <<= a;
+}