[PATCH]: handle scalb* in tree_expr_nonnegative_warnv_p

Kaveh R. GHAZI ghazi@caip.rutgers.edu
Sun Feb 18 04:52:00 GMT 2007


This patch treats scalb*/scalbn*/scalbln* et al. as nonnegative if the
first argument is nonnegative.

Bootstrapped on sparc-sun-solaris2.10, no regressions.

Okay for mainline?

		Thanks,
		--Kaveh


2007-02-16  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

	* fold-const.c (tree_expr_nonnegative_warnv_p): Handle scalb,
	scalbn and scalbln.

testsuite:
	* gcc.dg/torture/builtin-nonneg-1.c: Add checks for scalb, scalbn
	and scalbln.

diff -rup orig/egcc-SVN20070216/gcc/fold-const.c egcc-SVN20070216/gcc/fold-const.c
--- orig/egcc-SVN20070216/gcc/fold-const.c	2007-02-16 09:17:22.000000000 -0500
+++ egcc-SVN20070216/gcc/fold-const.c	2007-02-16 15:11:45.878775308 -0500
@@ -13352,6 +13352,9 @@ tree_expr_nonnegative_warnv_p (tree t, b
 	    CASE_FLT_FN (BUILT_IN_NEARBYINT):
 	    CASE_FLT_FN (BUILT_IN_RINT):
 	    CASE_FLT_FN (BUILT_IN_ROUND):
+	    CASE_FLT_FN (BUILT_IN_SCALB):
+	    CASE_FLT_FN (BUILT_IN_SCALBLN):
+	    CASE_FLT_FN (BUILT_IN_SCALBN):
 	    CASE_FLT_FN (BUILT_IN_SIGNBIT):
 	    CASE_FLT_FN (BUILT_IN_SINH):
 	    CASE_FLT_FN (BUILT_IN_TANH):
diff -rup orig/egcc-SVN20070216/gcc/testsuite/gcc.dg/torture/builtin-nonneg-1.c egcc-SVN20070216/gcc/testsuite/gcc.dg/torture/builtin-nonneg-1.c
--- orig/egcc-SVN20070216/gcc/testsuite/gcc.dg/torture/builtin-nonneg-1.c	2006-01-22 23:31:01.000000000 -0500
+++ egcc-SVN20070216/gcc/testsuite/gcc.dg/torture/builtin-nonneg-1.c	2007-02-16 15:14:56.598496225 -0500
@@ -120,9 +120,9 @@ void test(double d1, double d2, float f1
      || signbitl(FN##l(fabsl(ld1),fabsl(ld2)))) \
    link_failure_##FN()

-  /* These are nonnegative if the first argument is, 2nd arg is int.  */
-#define ARG2TEST1_A2INT(FN) \
- extern void link_failure_##FN (void); PROTOTYPE2TYPE2(FN, int) \
+  /* These are nonnegative if the first argument is, 2nd arg is an int.  */
+#define ARG1TEST2_A2INT(FN, INTTYPE) \
+ extern void link_failure_##FN (void); PROTOTYPE2TYPE2(FN, INTTYPE) \
  if (signbit(FN(fabs(d1),d2)) || signbitf(FN##f(fabsf(f1),f2)) \
      || signbitl(FN##l(fabsl(ld1),ld2))) \
    link_failure_##FN()
@@ -143,7 +143,7 @@ void test(double d1, double d2, float f1
   ARG1TEST1 (expm1);
   ARG1TEST1 (floor);
   ARG1TEST2 (fmod);
-  ARG2TEST1_A2INT (ldexp);
+  ARG1TEST2_A2INT (ldexp, int);
   ARG1TEST1_RTYPE (llrint, long long);
   ARG1TEST1_RTYPE (llround, long long);
   ARG1TEST1_RTYPE (lrint, long);
@@ -155,6 +155,9 @@ void test(double d1, double d2, float f1
   ARG1TEST2 (pow);
   ARG1TEST1 (rint);
   ARG1TEST1 (round);
+  ARG1TEST2 (scalb);
+  ARG1TEST2_A2INT (scalbln, long);
+  ARG1TEST2_A2INT (scalbn, int);
   ARG1TEST1_RTYPE (signbit, int);
   ARG1TEST1 (sinh);
   ARG1TEST1 (tanh);



More information about the Gcc-patches mailing list