https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93990

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I have tried:
--- gcc/config/i386/i386-expand.c.jj    2020-01-12 11:54:36.323414766 +0100
+++ gcc/config/i386/i386-expand.c       2020-03-03 12:44:54.116134173 +0100
@@ -11902,7 +11902,18 @@ rdseed_step:
       emit_insn (gen_rtx_SET (target, pat));

       /* Store the result.  */
-      emit_move_insn (gen_rtx_MEM (mode0, op4), op0);
+      {
+        op4 = gen_rtx_MEM (mode0, op4);
+        tree type = (mode0 == SImode ? unsigned_type_node
+                                    : long_long_unsigned_type_node);
+       if (TREE_CODE (arg3) == ADDR_EXPR
+           && useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (arg3, 0)),
+                                         type))
+         set_mem_attributes (op4, TREE_OPERAND (arg3, 0), 0);
+       else
+         set_mem_attributes (op4, type, 0);
+       emit_move_insn (op4, op0);
+      }

       return target;

but even that doesn't help, the stores now have [1 result0+0 S8 A64] instead of
former [0  S8 A8], but RTL DSE still doesn't remove those for whatever reason.

Reply via email to