[Issue 5812] New: Power expression optimisation: constant fold (x^^0) = 1

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Apr 3 18:10:21 PDT 2011


http://d.puremagic.com/issues/show_bug.cgi?id=5812

           Summary: Power expression optimisation: constant fold (x^^0) =
                    1
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: ibuclaw at ubuntu.com


--- Comment #0 from Iain Buclaw <ibuclaw at ubuntu.com> 2011-04-03 18:06:47 PDT ---
CTFE testcases (that currently fail)

  const x = 3;
  static assert((7 ^^ 0) == 1);
  static assert((7 ^^ 0.0) == 1);
  static assert((x ^^ 0) == 1);
  static assert((x ^^ 0.0) == 1);




Patch:

--- dmd.orig/expression.c       2011-02-18 01:15:38.000000000 +0000
+++ dmd/expression.c    2011-04-04 02:05:38.631620650 +0100
@@ -10302,6 +10302,15 @@ Expression *PowExp::semantic(Scope *sc)
             e = e->semantic(sc);
             return e;
         }
+        // Replace x ^^ 0 or x^^0.0 by (x, 1)
+        if ((e2->op == TOKint64 && e2->toInteger() == 0) ||
+                (e2->op == TOKfloat64 && e2->toReal() == 0.0))
+        {
+            typeCombine(sc);
+            e = new CommaExp(loc, e1, new IntegerExp(loc, 1, Type::tint32));
+            e = e->semantic(sc);
+            return e;
+        }
         // Replace -1 ^^ x by (x&1) ? -1 : 1, where x is integral
         if (e2->type->isintegral() && e1->op == TOKint64 &&
(sinteger_t)e1->toInteger() == -1L)
         {



Feel free to improve it.

Regards

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list