]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end: Fixup constant integers when expanding __builtin_crc [PR118288]
authorUros Bizjak <ubizjak@gmail.com>
Sun, 16 Feb 2025 21:01:27 +0000 (22:01 +0100)
committerUros Bizjak <ubizjak@gmail.com>
Mon, 17 Feb 2025 19:47:53 +0000 (20:47 +0100)
Constant integers with MSB set have to be represented as corresponding
signed integers.  Use gen_int_mode to emit them in the correct way.

PR middle-end/118288

gcc/ChangeLog:

* builtins.cc (expand_builtin_crc_table_based):
Use gen_int_mode to emit constant integers with MSB set.

gcc/testsuite/ChangeLog:

* gcc.dg/pr118288.c: New test.

gcc/builtins.cc
gcc/testsuite/gcc.dg/pr118288.c [new file with mode: 0644]

index 468bd65bc42ab75cdd0b5c54f2d6ebfce1e848dc..c8841032f03997d50d75a09cd74b0f3f2c2ab6eb 100644 (file)
@@ -7803,6 +7803,9 @@ expand_builtin_crc_table_based (internal_fn fn, scalar_mode crc_mode,
   gcc_assert (TREE_CODE (rhs3) == INTEGER_CST);
   rtx op3 = gen_int_mode (TREE_INT_CST_LOW (rhs3), crc_mode);
 
+  if (CONST_INT_P (op2))
+    op2 = gen_int_mode (INTVAL (op2), crc_mode);
+
   if (fn == IFN_CRC)
     expand_crc_table_based (target, op1, op2, op3, data_mode);
   else
diff --git a/gcc/testsuite/gcc.dg/pr118288.c b/gcc/testsuite/gcc.dg/pr118288.c
new file mode 100644 (file)
index 0000000..8cc981d
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR middle-end 118288 */
+/* { dg-do compile }  */
+/* { dg-options "-O2" } */
+
+signed char crc8_data8 ()
+{
+  return __builtin_crc8_data8 ('a', 0xff, 0x12);
+}