-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Whee.  The static checkers found another real bug.  The
tree-ssa-forwprop.c fix eliminates a potential NULL pointer dereference
due to a typo in a condition.  Basically if DEF_STMT is null, it would
be passed to can_propagate_from which would then dereference it.



Bootstrapped and regression tested on x86_64-unknown-linux-gnu. OK for
trunk?

Jeff


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJNlHnJAAoJEBRtltQi2kC7fFwH/13MwLl02m/xoFvk9T660jHk
gH82fngYkOho3E+hHlbOlahturVru0ti+B43XHvlZG0DhnCsci9YGn25cuSijv5i
vsRyRD9lKEfAlJk3N04aalbgLBZulHfKnn9vO8Lj7mBhezvd6mLz74AHW7dh68Ob
feZtQSnpW2gNqppl4JOkMcb79SUWsXGTFl0HAv9LGgtQwgzmh12VJ7i5meukzE0M
h4cFVU255INW7XrCPnA68r/oE6Bpy9xtl08VuyV7tTVejHz4msdrQV8e1bRWhCbP
O+lRI4lAfm3/8SceSdVwMUp/X5/MlBDrlnBX+wxG2imgYaMb735nZHcCVP/a2Kc=
=qyLX
-----END PGP SIGNATURE-----
        * tree-ssa-forwprop.c (forward_propagate_into_cond): Avoid 
        typo potentially leading to null pointer dereference.

        * caller-save.c (new_saved_hard_reg): Eliminate return value.
        (setup_save_areas): Corresponding changes to avoid useless
        assignments.

        * jump.c (reversed_comparison_code_parts): Avoid successive return
        statements when REVERSE_CONDITION is defined.

        * expr.c (expand_assignment): Avoid useless assignments.
        (expand_expr_real_1): Likewise.
        (expand_expr_real_2): Avoid useless statements.

        * tree-ssa-phiopt.c (minmax_replacement): Avoid useless statement.

        * cfgexpand.c (expand_gimple_basic_block): Avoid useless assignment.

        * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Avoid useless
        statements.

        * stmt.c (expand_expr_stmt): Avoid useless assignment.

Index: caller-save.c
===================================================================
*** caller-save.c       (revision 171731)
--- caller-save.c       (working copy)
*************** static int reg_restore_code (int, enum m
*** 82,88 ****
  
  struct saved_hard_reg;
  static void initiate_saved_hard_regs (void);
! static struct saved_hard_reg *new_saved_hard_reg (int, int);
  static void finish_saved_hard_regs (void);
  static int saved_hard_reg_compare_func (const void *, const void *);
  
--- 82,88 ----
  
  struct saved_hard_reg;
  static void initiate_saved_hard_regs (void);
! static void new_saved_hard_reg (int, int);
  static void finish_saved_hard_regs (void);
  static int saved_hard_reg_compare_func (const void *, const void *);
  
*************** initiate_saved_hard_regs (void)
*** 346,352 ****
  
  /* Allocate and return new saved hard register with given REGNO and
     CALL_FREQ.  */
! static struct saved_hard_reg *
  new_saved_hard_reg (int regno, int call_freq)
  {
    struct saved_hard_reg *saved_reg;
--- 346,352 ----
  
  /* Allocate and return new saved hard register with given REGNO and
     CALL_FREQ.  */
! static void
  new_saved_hard_reg (int regno, int call_freq)
  {
    struct saved_hard_reg *saved_reg;
*************** new_saved_hard_reg (int regno, int call_
*** 359,365 ****
    saved_reg->call_freq = call_freq;
    saved_reg->first_p = FALSE;
    saved_reg->next = -1;
-   return saved_reg;
  }
  
  /* Free memory allocated for the saved hard registers.  */
--- 359,364 ----
*************** setup_save_areas (void)
*** 463,469 ****
            if (hard_reg_map[regno] != NULL)
              hard_reg_map[regno]->call_freq += freq;
            else
!             saved_reg = new_saved_hard_reg (regno, freq);
            SET_HARD_REG_BIT (hard_regs_used, regno);
          }
        /* Look through all live pseudos, mark their hard registers.  */
--- 462,468 ----
            if (hard_reg_map[regno] != NULL)
              hard_reg_map[regno]->call_freq += freq;
            else
!             new_saved_hard_reg (regno, freq);
            SET_HARD_REG_BIT (hard_regs_used, regno);
          }
        /* Look through all live pseudos, mark their hard registers.  */
*************** setup_save_areas (void)
*** 483,489 ****
                if (hard_reg_map[r] != NULL)
                  hard_reg_map[r]->call_freq += freq;
                else
!                 saved_reg = new_saved_hard_reg (r, freq);
                 SET_HARD_REG_BIT (hard_regs_to_save, r);
                 SET_HARD_REG_BIT (hard_regs_used, r);
              }
--- 482,488 ----
                if (hard_reg_map[r] != NULL)
                  hard_reg_map[r]->call_freq += freq;
                else
!                 new_saved_hard_reg (r, freq);
                 SET_HARD_REG_BIT (hard_regs_to_save, r);
                 SET_HARD_REG_BIT (hard_regs_used, r);
              }
Index: jump.c
===================================================================
*** jump.c      (revision 171659)
--- jump.c      (working copy)
*************** reversed_comparison_code_parts (enum rtx
*** 308,315 ****
      {
  #ifdef REVERSE_CONDITION
        return REVERSE_CONDITION (code, mode);
! #endif
        return reverse_condition (code);
      }
  
    /* Try a few special cases based on the comparison code.  */
--- 308,316 ----
      {
  #ifdef REVERSE_CONDITION
        return REVERSE_CONDITION (code, mode);
! #else
        return reverse_condition (code);
+ #endif
      }
  
    /* Try a few special cases based on the comparison code.  */
Index: expr.c
===================================================================
*** expr.c      (revision 171659)
--- expr.c      (working copy)
*************** expand_assignment (tree to, tree from, b
*** 4124,4130 ****
    /* Don't crash if the lhs of the assignment was erroneous.  */
    if (TREE_CODE (to) == ERROR_MARK)
      {
!       result = expand_normal (from);
        return;
      }
  
--- 4124,4130 ----
    /* Don't crash if the lhs of the assignment was erroneous.  */
    if (TREE_CODE (to) == ERROR_MARK)
      {
!       expand_normal (from);
        return;
      }
  
*************** expand_expr_real_2 (sepops ops, rtx targ
*** 8170,8176 ****
      case VEC_UNPACK_LO_EXPR:
        {
        op0 = expand_normal (treeop0);
-       this_optab = optab_for_tree_code (code, type, optab_default);
        temp = expand_widen_pattern_expr (ops, op0, NULL_RTX, NULL_RTX,
                                          target, unsignedp);
        gcc_assert (temp);
--- 8170,8175 ----
*************** expand_expr_real_2 (sepops ops, rtx targ
*** 8182,8190 ****
        {
        op0 = expand_normal (treeop0);
        /* The signedness is determined from input operand.  */
-       this_optab = optab_for_tree_code (code,
-                                         TREE_TYPE (treeop0),
-                                         optab_default);
        temp = expand_widen_pattern_expr
          (ops, op0, NULL_RTX, NULL_RTX,
           target, TYPE_UNSIGNED (TREE_TYPE (treeop0)));
--- 8181,8186 ----
*************** expand_expr_real_1 (tree exp, rtx target
*** 8334,8340 ****
        {
          temp = expand_expr (exp, NULL_RTX, VOIDmode, modifier);
          if (MEM_P (temp))
!           temp = copy_to_reg (temp);
          return const0_rtx;
        }
  
--- 8330,8336 ----
        {
          temp = expand_expr (exp, NULL_RTX, VOIDmode, modifier);
          if (MEM_P (temp))
!           copy_to_reg (temp);
          return const0_rtx;
        }
  
Index: tree-ssa-phiopt.c
===================================================================
*** tree-ssa-phiopt.c   (revision 171659)
--- tree-ssa-phiopt.c   (working copy)
*************** minmax_replacement (basic_block cond_bb,
*** 695,701 ****
  
    cond = last_stmt (cond_bb);
    cmp = gimple_cond_code (cond);
-   result = PHI_RESULT (phi);
  
    /* This transformation is only valid for order comparisons.  Record which
       operand is smaller/larger if the result of the comparison is true.  */
--- 695,700 ----
Index: cfgexpand.c
===================================================================
*** cfgexpand.c (revision 171659)
--- cfgexpand.c (working copy)
*************** expand_gimple_basic_block (basic_block b
*** 3576,3582 ****
              val = gen_rtx_VAR_LOCATION
                (mode, var, (rtx)value, VAR_INIT_STATUS_INITIALIZED);
  
!             val = emit_debug_insn (val);
  
              if (dump_file && (dump_flags & TDF_DETAILS))
                {
--- 3576,3582 ----
              val = gen_rtx_VAR_LOCATION
                (mode, var, (rtx)value, VAR_INIT_STATUS_INITIALIZED);
  
!             emit_debug_insn (val);
  
              if (dump_file && (dump_flags & TDF_DETAILS))
                {
Index: tree-ssa-forwprop.c
===================================================================
*** tree-ssa-forwprop.c (revision 171659)
--- tree-ssa-forwprop.c (working copy)
*************** forward_propagate_into_cond (gimple_stmt
*** 553,559 ****
        {
        name = cond;
        def_stmt = get_prop_source_stmt (name, true, NULL);
!       if (def_stmt || !can_propagate_from (def_stmt))
          return did_something;
  
        rhs0 = gimple_assign_rhs1 (def_stmt);
--- 553,559 ----
        {
        name = cond;
        def_stmt = get_prop_source_stmt (name, true, NULL);
!       if (!def_stmt || !can_propagate_from (def_stmt))
          return did_something;
  
        rhs0 = gimple_assign_rhs1 (def_stmt);
Index: tree-ssa-dce.c
===================================================================
*** tree-ssa-dce.c      (revision 171659)
--- tree-ssa-dce.c      (working copy)
*************** mark_operand_necessary (tree op)
*** 271,278 ****
  static void
  mark_stmt_if_obviously_necessary (gimple stmt, bool aggressive)
  {
-   tree lhs = NULL_TREE;
- 
    /* With non-call exceptions, we have to assume that all statements could
       throw.  If a statement may throw, it is inherently necessary.  */
    if (cfun->can_throw_non_call_exceptions && stmt_could_throw_p (stmt))
--- 271,276 ----
*************** mark_stmt_if_obviously_necessary (gimple
*** 311,322 ****
        }
        if (!gimple_call_lhs (stmt))
          return;
-       lhs = gimple_call_lhs (stmt);
-       /* Fall through */
- 
-     case GIMPLE_ASSIGN:
-       if (!lhs)
-         lhs = gimple_assign_lhs (stmt);
        break;
  
      case GIMPLE_DEBUG:
--- 309,314 ----
Index: stmt.c
===================================================================
*** stmt.c      (revision 171659)
--- stmt.c      (working copy)
*************** expand_expr_stmt (tree exp)
*** 1455,1461 ****
        if (TYPE_MODE (type) == VOIDmode)
        ;
        else if (TYPE_MODE (type) != BLKmode)
!       value = copy_to_reg (value);
        else
        {
          rtx lab = gen_label_rtx ();
--- 1455,1461 ----
        if (TYPE_MODE (type) == VOIDmode)
        ;
        else if (TYPE_MODE (type) != BLKmode)
!       copy_to_reg (value);
        else
        {
          rtx lab = gen_label_rtx ();

Reply via email to