On Fri, Aug 2, 2024 at 6:15 PM Mariam Arutunian
<mariamarutun...@gmail.com> wrote:
>
> After the loop exit an internal function call (CRC, CRC_REV) is added,
> and its result is assigned to the output CRC variable (the variable where the 
> calculated CRC is stored after the loop execution).
> The removal of the loop is left to CFG cleanup and DCE.
>
>   gcc/
>
>     * gimple-crc-optimization.cc (get_data): New function.
>     (optimize_crc_loop): Likewise.
>     (build_polynomial_without_1): Likewise.
>     (execute): Add optimize_crc_loop function call.

+  /* If we have the data, use it.  */
+  if (m_phi_for_data)
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+       fprintf (dump_file,
+                "Data and CRC are xor-ed in the for loop.  Initializing data "
+                "with its value.\n");
+      tree data_arg = PHI_ARG_DEF (m_phi_for_data, 1);

how do you know statically that it's the second PHI arg def?  That
seems fragile.
I suppose you are looking for a latch definition?

+      if (TYPE_PRECISION (TREE_TYPE (data_arg)) == data_size)
+       return data_arg;
+      else
+       {
+         if (dump_file && (dump_flags & TDF_DETAILS))
+           fprintf (dump_file,
+                    "Loop iteration number and data's size differ.\n");
+         return nullptr;

that seems to be oddly placed in the transform rather than the analysis phase?

+  gcc_assert (m_phi_for_crc);
+
+  tree crc_arg = PHI_ARG_DEF (m_phi_for_crc, 1);

same issue here - I think you want to use PHI_ARG_DEF_FROM_EDGE?

+  /* We don't support the case where data is larger than the CRC.  */
+  if (TYPE_PRECISION (TREE_TYPE (crc_arg))
+      < TYPE_PRECISION (TREE_TYPE (data_arg)))
+    return false;

you can check that before building any stuff?

+  gimple_stmt_iterator si = gsi_start_bb (output_crc->bb);
+  gsi_insert_before (&si, call, GSI_SAME_STMT);

you want gsi_after_labels (gimple_bb (output_crc))

+  /* Remove phi statement, which was holding CRC result.  */
+  gimple_stmt_iterator tmp_gsi = gsi_for_stmt (output_crc);
+  gsi_remove (&tmp_gsi, true);

Please use remove_phi_node (&tmp_gsi, false).

otherwise looks fine.

Richard.

> Signed-off-by: Mariam Arutunian <mariamarutun...@gmail.com>

Reply via email to