From 8dcef66a5f67e5d7c5fd6b51c3b3f45191beaa74 Mon Sep 17 00:00:00 2001 From: Dennis Date: Sat, 29 Mar 2025 12:25:53 +0100 Subject: [PATCH] Revert "Fix #21024 - Optimize x^^c expressions (#21082)" (#21114) This reverts commit fa1f860e4be6a0d796a47329be110be14fc1d667. --- compiler/src/dmd/expression.d | 9 ---- compiler/src/dmd/expression.h | 1 - compiler/src/dmd/expressionsem.d | 52 ---------------------- compiler/src/dmd/frontend.h | 1 - compiler/src/dmd/hdrgen.d | 6 --- compiler/test/fail_compilation/powinline.d | 38 ---------------- compiler/test/runnable/powinline.d | 44 ------------------ 7 files changed, 151 deletions(-) delete mode 100644 compiler/test/fail_compilation/powinline.d delete mode 100644 compiler/test/runnable/powinline.d diff --git a/compiler/src/dmd/expression.d b/compiler/src/dmd/expression.d index a51f918cca..d65b163ee6 100644 --- a/compiler/src/dmd/expression.d +++ b/compiler/src/dmd/expression.d @@ -3851,9 +3851,6 @@ extern (C++) final class CommaExp : BinExp /// false will be passed will be from the parser. bool allowCommaExp; - /// The original expression before any rewriting occurs. - /// This is used in error messages. - Expression originalExp; extern (D) this(Loc loc, Expression e1, Expression e2, bool generated = true) @safe { @@ -3861,12 +3858,6 @@ extern (C++) final class CommaExp : BinExp allowCommaExp = isGenerated = generated; } - extern (D) this(Loc loc, Expression e1, Expression e2, Expression oe) @safe - { - this(loc, e1, e2); - originalExp = oe; - } - override bool isLvalue() { return !rvalue && e2.isLvalue(); diff --git a/compiler/src/dmd/expression.h b/compiler/src/dmd/expression.h index 4a232fe7ae..3c8d90dd7e 100644 --- a/compiler/src/dmd/expression.h +++ b/compiler/src/dmd/expression.h @@ -990,7 +990,6 @@ class CommaExp final : public BinExp public: d_bool isGenerated; d_bool allowCommaExp; - Expression* originalExp; bool isLvalue() override; Optional toBool() override; void accept(Visitor *v) override { v->visit(this); } diff --git a/compiler/src/dmd/expressionsem.d b/compiler/src/dmd/expressionsem.d index f71c888c62..04efa1f86f 100644 --- a/compiler/src/dmd/expressionsem.d +++ b/compiler/src/dmd/expressionsem.d @@ -12796,58 +12796,6 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor return; } - // Inline the expression, if possible. - PowExp pe = cast(PowExp)e; - if (pe.e1.type.isScalar() && pe.e2.isIntegerExp()) - { - Expression one; - if (pe.e1.type.isIntegral()) { - one = new IntegerExp(e.loc, 1, pe.e1.type); - } else { - one = new RealExp(e.loc, CTFloat.one, pe.e1.type); - } - - const expo = cast(sinteger_t)pe.e2.toInteger(); - // Replace e1 ^^ -1 with 1 / e1 - if (expo == -1) - { - Expression ex = new DivExp(exp.loc, one, pe.e1); - ex = ex.expressionSemantic(sc); - result = ex; - return; - } - // Replace e1 ^^ 0 with 1 - else if (expo == 0) - { - Expression ex = one; - ex.loc = exp.loc; - ex = ex.expressionSemantic(sc); - result = ex; - return; - } - // Replace e1 ^^ 1 with e1 - else if (expo == 1) - { - Expression ex = pe.e1; - ex.loc = exp.loc; - ex = ex.expressionSemantic(sc); - result = ex; - return; - } - // Replace e1 ^^ 2 with e1 * e1 - else if (expo == 2) - { - auto v = copyToTemp(STC.const_, "__powtmp", pe.e1); - auto ve = new VarExp(exp.loc, v); - auto de = new DeclarationExp(exp.e1.loc, v); - auto me = new MulExp(exp.e2.loc, ve, ve); - Expression ex = new CommaExp(exp.loc, de, me, exp); - ex = ex.expressionSemantic(sc); - result = ex; - return; - } - } - Module mmath = Module.loadStdMath(); if (!mmath) { diff --git a/compiler/src/dmd/frontend.h b/compiler/src/dmd/frontend.h index c152c724ce..730d53e489 100644 --- a/compiler/src/dmd/frontend.h +++ b/compiler/src/dmd/frontend.h @@ -2766,7 +2766,6 @@ class CommaExp final : public BinExp public: const bool isGenerated; bool allowCommaExp; - Expression* originalExp; bool isLvalue() override; Optional toBool() override; void accept(Visitor* v) override; diff --git a/compiler/src/dmd/hdrgen.d b/compiler/src/dmd/hdrgen.d index 97e348350b..61ff273c6b 100644 --- a/compiler/src/dmd/hdrgen.d +++ b/compiler/src/dmd/hdrgen.d @@ -2724,12 +2724,6 @@ private void expressionPrettyPrint(Expression e, ref OutBuffer buf, ref HdrGenSt void visitComma(CommaExp e) { - if (e.originalExp !is null) - { - e.originalExp.expressionPrettyPrint(buf, hgs); - return; - } - // CommaExp is generated by the compiler so it shouldn't // appear in error messages or header files. // For now, this treats the case where the compiler diff --git a/compiler/test/fail_compilation/powinline.d b/compiler/test/fail_compilation/powinline.d deleted file mode 100644 index 11ebacd16a..0000000000 --- a/compiler/test/fail_compilation/powinline.d +++ /dev/null @@ -1,38 +0,0 @@ -/* -TEST_OUTPUT: ---- -fail_compilation/powinline.d(25): Error: cannot implicitly convert expression `(a + 5.0) ^^ 2L` of type `double` to `int` -fail_compilation/powinline.d(26): Error: cannot implicitly convert expression `(1.0 / foo()) ^^ 2L` of type `double` to `int` -fail_compilation/powinline.d(31): Error: void has no value -fail_compilation/powinline.d(31): Error: incompatible types for `(5.0) * (bar())`: `double` and `void` -fail_compilation/powinline.d(37): Error: cannot modify `immutable` expression `a` ---- -*/ - -double foo() -{ - return 5.0; -} - -void bar() -{ - return; -} - -void test1() -{ - double a = 2.0; - int b = (a + 5.0) ^^ 2.0; - b = (1 / foo()) ^^ 2.0; -} - -void test2() -{ - double a = (5.0 * bar()) ^^ 2.0; -} - -void test3() -{ - immutable double a = 3.0; - (a ^^= 2.0) = 6; -} diff --git a/compiler/test/runnable/powinline.d b/compiler/test/runnable/powinline.d deleted file mode 100644 index 7ec512c526..0000000000 --- a/compiler/test/runnable/powinline.d +++ /dev/null @@ -1,44 +0,0 @@ -/* -REQUIRED_ARGS: -betterC -RUN_OUTPUT: ---- -Success ---- -*/ -import core.stdc.stdio; - -void test1() -{ - enum real Two = 2.0; - static assert(Two^^3 == 8.0); -} - -void test2() -{ - double x = 5.0; - assert(x^^-1 == 1/x); - x = -1.0; - assert(x^^1 == x); - assert((x += 3) ^^ 2.0 == 4.0); - assert((x) ^^ 2.0 == 4.0); - assert((x *= 5) ^^ 2.0 == (x * x)); - assert(x^^-1 == 1.0 / x); - assert((x^^-1) ^^ 0.0 == 1.0); -} - -void test3() -{ - int x = 6; - assert(x ^^ 0 == 1); - assert((x += 3) ^^ 2 == 81); - assert(x ^^ 2 == (x ^^ 1) * (x ^^ 1)); - static assert(4.0 ^^ -1 == 0.25); -} - -extern(C) void main() -{ - test1(); - test2(); - test3(); - printf("Success\n"); -}