dmd D Programming Language compiler
Find a file
Fares A. Bakhit fa1f860e4b
Fix #21024 - Optimize x^^c expressions (#21082)
* Fix #21024 - Optimize x^^c expressions

Reason for the *magic* constraint c<8 on inlining x^^c:

https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/fpu/e_powl.S;h=47f129f34d368d7c67b8e5f2462b36b0bebb7621;hb=HEAD#l136

* Fix poor assumption about expression state

* Restrict optimization to floating point expressions

* Generalize optimization to any scalar data type

* Fix segfault on x^^c where x is a single member anonymous enum

DMD segfaulted on compiling the unittests in std/algorithm/sorting.o, the
unittest that caused the segfault can be reduced to:

    enum real Two = 2.0;
    auto _ = Two^^3;

I'm not sure why copying the anonymous enum into a `const` variable causes
the compiler to segfault.

* Add tests to x^^c inlining optimization

* Fix missing type for e1 ^^ -1 to 1 / e1 rewrite

* Move rewrites from constant folding to expression semantic and restrict them to [-1, 2]

* Improve error message for the x^^2 rewrite.

Before:
    ex.d(4): Error: can implicitly convert expression `(const const(double) __powtmp2 = x + 5.0;) , __powtmp2 * ...` of type `double` to `int`
        int y = ( x + 5 ) ^^ 2;
                ^
and after:
    ex.d(4): Error: cannot implicitly convert expression `(x + 5.0) ^^ 2L` of type `double` to `int`
        int y = ( x + 5 ) ^^ 2;
                ^

* Update C++ frontend header to match change in `CommaExp`

* Address code review feedback

Co-authored-by: Dennis Korpel <dkorpel@gmail.com>

---------

Co-authored-by: Dennis Korpel <dkorpel@gmail.com>
2025-03-29 12:13:38 +01:00
.azure-pipelines
.circleci
.github/workflows GHA main: Add Alpine Linux job, to CI-test musl libc (#20741) 2025-01-28 00:28:20 +01:00
changelog Add C++23 to CppStdRevision enum (#21043) 2025-03-21 08:29:14 +08:00
ci GHA main: Add Alpine Linux job, to CI-test musl libc (#20741) 2025-01-28 00:28:20 +01:00
compiler Fix #21024 - Optimize x^^c expressions (#21082) 2025-03-29 12:13:38 +01:00
druntime Add C++23 to CppStdRevision enum (#21043) 2025-03-21 08:29:14 +08:00
src
.cirrus.yml
.codecov.yml
.editorconfig
.git-blame-ignore-revs
.gitattributes
.gitignore add __rvalue(expression) builtin (#17050) 2024-12-15 12:13:28 -08:00
.pre-commit-config.yaml
azure-pipelines.yml
CODEOWNERS
config.d
CONTRIBUTING.md Update the contributor guide, remove bugzilla references (#20591) 2024-12-23 20:18:16 +08:00
dub.sdl
LICENSE.txt
Makefile Remove 'samples' folder 2025-01-11 08:12:48 +08:00
posix.mak
README.md Remove 'samples' folder 2025-01-11 08:12:48 +08:00
VERSION bump VERSION to v2.111.0-rc.1 2025-03-21 20:27:52 +01:00

dlang logo

DMD

GitHub tag Code coverage license

Build status CircleCI Build Status Buildkite


DMD is the reference compiler for the D programming language.

Releases, language specification and other resources can be found on the homepage. Please refer to the guidelines for bug reports to report a problem or browse the list of open bugs.

Overview

This repository is structured into the following directories. Refer to their respective README.md for more in-depth information.

Directory Description
changelog changelog entries for the upcoming release
ci CI related scripts / utilities
compiler root of all compiler (DMD/frontend) related code
compiler/src source code, build system and build instructions
compiler/test tests and testing infrastructure
compiler/docs man pages and internal documentation
compiler/ini predefined dmd.conf files
druntime root of all runtime related code

With a D compiler and dub installed, dmd can be built with:

dub build dmd:compiler

For more information regarding compiling, installing, and hacking on DMD, check the contribution guide and visit the D Wiki.

Nightlies

Nightly builds based of the current DMD / Phobos master branch can be found here.