aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2009-04-09 16:07:43 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2009-04-09 16:07:43 +0000
commitb45f0e58d72a6ea2f54d007152b55fc44311359f (patch)
treed12ca0de4241fd0f950beabe6b910ba0a883eabd
parent9332c6ebd1b4ce843ddf9be3d9abdf6abeb3dfcd (diff)
downloadgcc-b45f0e58d72a6ea2f54d007152b55fc44311359f.zip
gcc-b45f0e58d72a6ea2f54d007152b55fc44311359f.tar.gz
gcc-b45f0e58d72a6ea2f54d007152b55fc44311359f.tar.bz2
expmed.c (expand_divmod): Always use a comparison for a division by a large unsigned integer.
2009-04-09 Paolo Bonzini <bonzini@gnu.org> * expmed.c (expand_divmod): Always use a comparison for a division by a large unsigned integer. * fold-const.c (tree_single_nonzero_warnv_p): Always treat decls for things others than variables or functions as nonzero. testsuite: 2009-04-09 Paolo Bonzini <bonzini@gnu.org> * gcc.dg/pr27150-1.c: Change to a link test. From-SVN: r145846
-rw-r--r--gcc/ChangeLog43
-rw-r--r--gcc/expmed.c6
-rw-r--r--gcc/fold-const.c4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/pr27150-1.c11
5 files changed, 60 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 529286f..90e7b11 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2009-04-09 Paolo Bonzini <bonzini@gnu.org>
+
+ * expmed.c (expand_divmod): Always use a comparison for a division
+ by a large unsigned integer.
+
+ * fold-const.c (tree_single_nonzero_warnv_p): Always treat decls
+ for things others than variables or functions as nonzero.
+
2009-04-09 Nick Clifton <nickc@redhat.com>
* unwind-compat.c: Change copyright header to refer to version
@@ -338,6 +346,41 @@
2009-04-09 Paolo Bonzini <bonzini@gnu.org>
+ * config/i386/i386.md (cmpcc): New.
+ * config/i386/sync.md (sync_compare_and_swap*): Set FLAGS_REG.
+ (sync_compare_and_swap_cc*): Delete.
+
+ * config/s390/s390.c (s390_compare_emitted): Remove.
+ (s390_emit_compare): Handle MODE_CC s390_compare_op0 like
+ s390_compare_emitted used to be handled. Assert that modes match.
+ (s390_emit_compare_and_swap): Use s390_emit_compare, do not
+ refer to sync_compare_and_swap_ccsi.
+ * config/s390/s390.h (s390_compare_emitted): Remove.
+ * config/s390/s390.md (seq): Look for MODE_CC s390_compare_op0
+ instead of s390_compare_emitted.
+ (stack_protect_test, sync_compare_and_swap_cc): Set s390_compare_op0
+ instead of s390_compare_emitted.
+ * config/s390/s390.md (cmpcc): New.
+ (sync_compare_and_swapqi, sync_compare_and_swaphi): Clobber
+ CC_REGNUM, do not pretend it's set.
+ (sync_compare_and_swap_cc*): Delete.
+ * config/s390/predicates.md (cc_reg_operand): New.
+
+ * expr.c (sync_compare_and_swap_cc): Delete.
+ * optabs.h (sync_compare_and_swap_cc): Delete.
+ * optabs.c (prepare_cmp_insn): Ignore which specific CCmode
+ is being used with can_compare_p.
+ (emit_cmp_and_jump_insn_1): Likewise when looking in the optab.
+ (find_cc_set): New.
+ (expand_bool_compare_and_swap): Do not use sync_compare_and_swap_cc,
+ look for a MODE_CC set instead. Use emit_store_flag.
+ (expand_compare_and_swap_loop): Likewise, with some additional
+ complication to avoid a force_reg when useless. Use
+ emit_cmp_and_jump_insns.
+ * genopinit.c (optabs): Delete sync_compare_and_swap_cc.
+ * doc/md.texi (sync_compare_and_swap_cc): Merge with
+ sync_compare_and_swap documentation.
+=======
* config/i386/i386.md (cmpcc): New.
* config/i386/sync.md (sync_compare_and_swap*): Set FLAGS_REG.
(sync_compare_and_swap_cc*): Delete.
diff --git a/gcc/expmed.c b/gcc/expmed.c
index da0db3b..165bcae 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -3998,10 +3998,8 @@ expand_divmod (int rem_flag, enum tree_code code, enum machine_mode mode,
{
/* Most significant bit of divisor is set; emit an scc
insn. */
- quotient = emit_store_flag (tquotient, GEU, op0, op1,
- compute_mode, 1, 1);
- if (quotient == 0)
- goto fail1;
+ quotient = emit_store_flag_force (tquotient, GEU, op0, op1,
+ compute_mode, 1, 1);
}
else
{
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 7dcf993..821e581 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -15018,8 +15018,8 @@ tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
return false;
/* Weak declarations may link to NULL. */
- if (VAR_OR_FUNCTION_DECL_P (base))
- return !DECL_WEAK (base);
+ if (DECL_P (base) && flag_delete_null_pointer_checks)
+ return !VAR_OR_FUNCTION_DECL_P (base) || !DECL_WEAK (base);
/* Constants are never weak. */
if (CONSTANT_CLASS_P (base))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ed0bc4b..145880d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2009-04-09 Paolo Bonzini <bonzini@gnu.org>
+
+ * gcc.dg/pr27150-1.c: Change to a link test.
+
2009-04-09 Jakub Jelinek <jakub@redhat.com>
* g++.dg/lookup/using2.C: Change copyright header to refer to version
diff --git a/gcc/testsuite/gcc.dg/pr27150-1.c b/gcc/testsuite/gcc.dg/pr27150-1.c
index 03810cd..5a00cf9 100644
--- a/gcc/testsuite/gcc.dg/pr27150-1.c
+++ b/gcc/testsuite/gcc.dg/pr27150-1.c
@@ -1,7 +1,14 @@
-/* { dg-do compile } */
+/* { dg-do link } */
/* { dg-options "-O2" } */
+extern int link_error ();
int g(int f)
{
- return (&f)!=0;
+ int a = ((&f)!=0);
+ if (!a) link_error ();
+ return a;
}
+int main()
+{
+ g(10);
+}