[PATCH] tree-outof-ssa: fix unsignedp uninitialized in insert_value_copy_on_edge

Sam Price <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
insert_value_copy_on_edge declares 'unsignedp' uninitialized and sets it
only as a side effect of an argument to gcc_assert.  When src_mode and
dest_mode differ it is then passed to convert_modes, which uses it to
choose between zero and sign extension.

gcc_assert does not always evaluate its argument.  With GCC_VERSION
< 4005 and without assert checking, gcc/system.h defines

  #define gcc_assert(EXPR) ((void)(0 && (EXPR)))

so promote_ssa_mode is never called and unsignedp is passed to
convert_modes indeterminate, selecting zero or sign extension at random.
GCC_VERSION is __GNUC__ * 1000 + __GNUC_MINOR__, so any host compiler
reporting less than 4.5 takes this branch.

Relying on a side effect in gcc_assert is against the coding
conventions regardless of which expansion is in use.  Call
promote_ssa_mode outside the assert, as the same file already does in
get_temp_reg, and keep the assert for the invariant alone.  unsignedp is
initialized for the !REG_P path, where promote_ssa_mode is not called.

Signed-off-by: Sam Price <[email protected]>
Assisted-by: Claude (Anthropic)
---

Found while getting gcc.c-torture running against a MicroBlaze port to
LLVM, comparing the two compilers over the suite.

 gcc/tree-outof-ssa.cc | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/gcc/tree-outof-ssa.cc b/gcc/tree-outof-ssa.cc
index f4bc4878bd6ca..65fb2e16ea4ed 100644
--- a/gcc/tree-outof-ssa.cc
+++ b/gcc/tree-outof-ssa.cc
@@ -308,7 +308,7 @@ insert_value_copy_on_edge (edge e, int dest, tree src, location_t locus)
 {
   rtx dest_rtx, seq, x;
   machine_mode dest_mode, src_mode;
-  int unsignedp;
+  int unsignedp = 0;
 
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
@@ -334,8 +334,11 @@ insert_value_copy_on_edge (edge e, int dest, tree src, location_t locus)
   src_mode = TYPE_MODE (TREE_TYPE (src));
   dest_mode = GET_MODE (dest_rtx);
   gcc_assert (src_mode == TYPE_MODE (TREE_TYPE (name)));
-  gcc_assert (!REG_P (dest_rtx)
-	      || dest_mode == promote_ssa_mode (name, &unsignedp));
+  if (REG_P (dest_rtx))
+    {
+      machine_mode pmode = promote_ssa_mode (name, &unsignedp);
+      gcc_assert (dest_mode == pmode);
+    }
 
   if (src_mode != dest_mode)
     {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.