Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LLVM Optimization Pass Crash on Merge successive reallocations of the same variable #3126

Closed
Jwashton opened this issue Mar 29, 2019 · 18 comments
Labels
bug Something isn't working needs investigation This needs to be looked into before its "ready for work"

Comments

@Jwashton
Copy link

I'm going through the this book. When I compile my tests on this branch of my code I sometimes get this issue during the optimization step.

$ (cd test && ponyc)
Building builtin -> /usr/lib/pony/0.28.0/packages/builtin
Building . -> /home/jwashton/Projects/ray_tracer_challenge/test
Building ponytest -> /usr/lib/pony/0.28.0/packages/ponytest
Building time -> /usr/lib/pony/0.28.0/packages/time
Building collections -> /usr/lib/pony/0.28.0/packages/collections
Building random -> /usr/lib/pony/0.28.0/packages/random
Building .. -> /home/jwashton/Projects/ray_tracer_challenge
Building promises -> /usr/lib/pony/0.28.0/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Stack dump:
0.	Running pass 'Function Pass Manager' on module 'test'.
1.	Running pass 'Merge successive reallocations of the same variable' on function '@_TestCanvas_ref_apply_oo'

Sometimes it works, sometimes it doesn't. Sometimes the issue disappears if I just try to compile again. Other times I find that any change I make to the code will make it go away (for example commenting out any one of the test suites in test/main.pony). This fact has so far frustrated my attempts to make a more minimal test case, but I'll keep trying.

Is the issue perhaps related to this loop from the _TestCanvas test?

This is on Fedora 29, kernel 5.0.4-200, using ponyc straight from the Fedora copr repository, per the readme.

$ ponyc --version
0.28.0 [release]
compiled with: llvm 3.9.1 -- cc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)
Defaults: pic=false ssl=openssl_1.1.0

I'm very willing to provide more information upon request.

@SeanTAllen
Copy link
Member

I'm unable to reproduce on MacOS El Capitan Ponyc 0.28.0 built with LLVM 7.0.1

@SeanTAllen
Copy link
Member

Also unable to reproduce using Ubuntu Bionic with Ponyc 0.28.0 built with vendored LLVM 7.0.1

@SeanTAllen
Copy link
Member

SeanTAllen commented Mar 29, 2019

@Jwashton would you be able to build a version of ponyc from source, use that and see if you run into an issue?

If you have a lot of horsepower to throw at it and time, you could try using our "vendored" LLVM. That means you'd be building LLVM and then statically linking it in:

make -f Makefile-lib-llvm default_ssl=openssl_1.1.0 use=llvm_link_static -j8 install

@Jwashton
Copy link
Author

I can't seem to reproduce this issue with a locally built version of ponyc and the system LLVM. Now recompiling with the vendored LLVM...

@SeanTAllen
Copy link
Member

For the locally built, can you post the ponyc --version output?

@Jwashton
Copy link
Author

$ ./build/release/ponyc --version
0.28.0-13fe1d39 [release]
compiled with: llvm 7.0.1 -- cc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)
Defaults: pic=false ssl=openssl_1.1.0

@SeanTAllen
Copy link
Member

So this could be an llvm 3.9.1 issue.

@SeanTAllen
Copy link
Member

I am able to reproduce this using MacOS, latest ponyc and llvm 3.9.1.

So, this would be somehow related to the llvm version.

@SeanTAllen SeanTAllen changed the title Optimization heisenbug LLVM 3.9.1 Optimization Pass Crash on Merge successive reallocations of the same variable Mar 30, 2019
@SeanTAllen
Copy link
Member

Can anyone else triage and verify my findings?

@SeanTAllen
Copy link
Member

This could exist in other non-LLVM 7 versions, if anyone can test for that, it would be great.

@jemc
Copy link
Member

jemc commented Apr 2, 2019

I can try testing this in conjunction with #3122 for multiple LLVM versions.

@winksaville
Copy link
Contributor

winksaville commented Apr 2, 2019

I tested this on my Arch Linux desktop:

$ uname -a
Linux wink-desktop 5.0.4-arch1-1-ARCH #1 SMP PREEMPT Sat Mar 23 21:00:33 UTC 2019 x86_64 GNU/Linux

$ git log -1
commit ce2d872196ac3531b27c5a6de0db05ba19192427 (HEAD, origin/compilation_issue)
Author: William Ashton <William@AshtonFam.org>
Date:   Fri Mar 29 17:25:21 2019 -0400

    Reproduced without failing test

I tried 7.0.1 and 3.9.1:

$ ~/prgs/ponylang/ponyc-wink1/build.7.0.1/release/ponyc --version
0.28.0-b3200b21 [release]
compiled with: llvm 7.0.1 -- cc (GCC) 8.2.1 20181127
Defaults: pic=true ssl=openssl_1.1.0
$ ~/prgs/ponylang/ponyc-wink1/build.3.9.1/release/ponyc --version
0.28.0-b3200b21 [release]
compiled with: llvm 3.9.1 -- cc (GCC) 8.2.1 20181127
Defaults: pic=true ssl=openssl_1.1.0
wink@wink-desktop:~/prgs/graphics/ray_tracer_challenge/test ((remotes/origin/compilation_issue))

It worked 10 times with 7.0.1 and failed 5 in 10 times with 3.9.1:

$ for i in {1..10}; do ~/prgs/ponylang/ponyc-wink1/build.3.9.1/release/ponyc; done
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Stack dump:
0.	Running pass 'Function Pass Manager' on module 'test'.
1.	Running pass 'Merge successive reallocations of the same variable' on function '@_TestCanvas_ref_apply_oo'
Segmentation fault (core dumped)
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Stack dump:
0.	Running pass 'Function Pass Manager' on module 'test'.
1.	Running pass 'Merge successive reallocations of the same variable' on function '@_TestCanvas_ref_apply_oo'
Segmentation fault (core dumped)
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Stack dump:
0.	Running pass 'Function Pass Manager' on module 'test'.
1.	Running pass 'Merge successive reallocations of the same variable' on function '@_TestCanvas_ref_apply_oo'
Segmentation fault (core dumped)
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Stack dump:
0.	Running pass 'Function Pass Manager' on module 'test'.
1.	Running pass 'Merge successive reallocations of the same variable' on function '@_TestCanvas_ref_apply_oo'
Segmentation fault (core dumped)
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Stack dump:
0.	Running pass 'Function Pass Manager' on module 'test'.
1.	Running pass 'Merge successive reallocations of the same variable' on function '@_TestCanvas_ref_apply_oo'
Segmentation fault (core dumped)

@winksaville
Copy link
Contributor

While testing #3122 I created a debug version of llvm-3.9.1 and linked it to a release version of ponyc:

wink@wink-desktop:~/prgs/ponylang/ponyc-wink1 (support-simultaneous-llvm-checkouts)
$ time make -j12 -f Makefile-lib-llvm default_pic=true default_ssl=openssl_1.1.0 use=llvm_link_static LLVM_CFG=llvm-3.9.1.cfg LLVM_BUILD_TYPE=Debug
make[1]: Entering directory '/home/wink/prgs/ponylang/ponyc-wink1/lib/llvm'
getting /home/wink/prgs/ponylang/ponyc-wink1/lib/llvm/gen/v3.9.1-Debug/tgt/get-submodule
Synchronizing submodule url for 'src'
Submodule path 'src': checked out 'd0d8eb2e5415b8be29343e3c17a18e49e67b5551'
checkout 41dbbb7c22da5
Checking out files: 100% (49116/49116), done.
Previous HEAD position was d0d8eb2e541 Merging r345839:
HEAD is now at 41dbbb7c22d Merging r288433:
generate v3.9.1-Debug hash=41dbbb7c22d ref= (HEAD, tag: llvmorg-3.9.1-rc3, tag: llvmorg-3.9.1, origin/release/3.9.x)

...

heap.cc
pool.cc
Linking libponyrt
Linking libblake2
Linking libponyrt-pic
Linking libgtest
Linking libgbenchmark
Linking libponyc
Linking libponyrt.tests
Linking libponyrt.benchmarks
Linking ponyc
Linking libponyc.benchmarks
Linking libponyc.tests
make[1]: Leaving directory '/home/wink/prgs/ponylang/ponyc-wink1'

real	12m41.963s
user	112m40.493s
sys	7m1.313s

Here is the version info:

wink@wink-desktop:~/prgs/ponylang/ponyc-wink1 (support-simultaneous-llvm-checkouts)
$ ~/prgs/ponylang/ponyc-wink1/build.3.9.1/release-llvm-Debug/ponyc --version
0.28.0-536bdefd [release]
compiled with: llvm 3.9.1 -- cc (GCC) 8.2.1 20181127
Defaults: pic=true ssl=openssl_1.1.0

I then tested it in the loop as before and all 10 succeeded. I'm not sure what that proves but its a data point that seems to point to a problem in LLVM as in this test and in my other test pony was compiled in Release mode:

$ for i in {1..10}; do ~/prgs/ponylang/ponyc-wink1/build.3.9.1/release-llvm-Debug/ponyc; done
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test
Building builtin -> /home/wink/prgs/ponylang/ponyc-wink1/packages/builtin
Building . -> /home/wink/prgs/graphics/ray_tracer_challenge/test
Building ponytest -> /home/wink/prgs/ponylang/ponyc-wink1/packages/ponytest
Building time -> /home/wink/prgs/ponylang/ponyc-wink1/packages/time
Building collections -> /home/wink/prgs/ponylang/ponyc-wink1/packages/collections
Building random -> /home/wink/prgs/ponylang/ponyc-wink1/packages/random
Building .. -> /home/wink/prgs/graphics/ray_tracer_challenge
Building promises -> /home/wink/prgs/ponylang/ponyc-wink1/packages/promises
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Writing ./test.o
Linking ./test

@jemc
Copy link
Member

jemc commented Apr 16, 2019

If this is looking like a bug in earlier versions of LLVM, I'm tempted to say we shouldn't bother investigating further until it's been reproduced on a more recent version of LLVM.

@ergl
Copy link
Member

ergl commented Dec 10, 2019

Managed to reproduce this behaviour on LLVM 7.1.0 with the following code:

actor Main
  let a: Array[(U64, U64)] = [as (U64, U64):
    (0,0); (1,0); (2,0); (3,0); (4,0); (5,0); (6,0)
    (7,0); (8,0); (9,0); (0,2); (9,2); (0,3); (9,3)
    (0,4); (9,4); (0,5); (9,5); (0,6); (9,6); (0,7)
    (9,7); (0,8); (9,8); (0,9); (1,9); (2,9); (3,9)
    (4,9); (5,9); (6,9); (7,9); (8,9)
  ]

  new create(env: Env) => None

(although the code works correctly in the pony playground)

Compiling the above:

$ ponyc test/
Building builtin -> /usr/local/Cellar/ponyc/0.33.0/packages/builtin
Building test/ -> ~/Downloads/test
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Stack dump:
0.	Running pass 'Function Pass Manager' on module 'test'.
1.	Running pass 'Merge successive reallocations of the same variable' on function '@Main_Dispatch'
Segmentation fault: 11

This is on macOS Mojave 10.14.6, ponyc version:

ponyc --version
0.33.0 [release]
compiled with: llvm 7.1.0 -- Apple clang version 11.0.0 (clang-1100.0.33.8)
Defaults: pic=false

@SeanTAllen SeanTAllen changed the title LLVM 3.9.1 Optimization Pass Crash on Merge successive reallocations of the same variable LLVM Optimization Pass Crash on Merge successive reallocations of the same variable Dec 17, 2019
@SeanTAllen SeanTAllen added needs investigation This needs to be looked into before its "ready for work" bug Something isn't working and removed bug: 1 - needs investigation labels May 12, 2020
@SeanTAllen
Copy link
Member

Not an issue with LLVM version we currently support.

@ergl
Copy link
Member

ergl commented Sep 6, 2020

@SeanTAllen I can still reproduce this crash on my machine (macOS Mojave 10.14.6) with the example I posted in my comment above. This is with LLVM 9.0.1

$ ponyc test/
Building builtin -> ~/.local/share/ponyup/ponyc-release-0.37.0-x86_64-darwin/packages/builtin
Building test/ -> ~/Downloads/test
Generating
 Reachability
 Selector painting
 Data prototypes
 Data types
 Function prototypes
 Functions
 Descriptors
Optimising
Stack dump:
0.	Running pass 'Function Pass Manager' on module 'test'.
1.	Running pass 'Merge successive reallocations of the same variable' on function '@Main_Dispatch'
Segmentation fault: 11
$ ponyc --version
0.37.0-991bec5c [release]
Compiled with: LLVM 9.0.1 -- AppleClang-11.0.3.11030032-x86_64
Defaults: pic=true 

@SeanTAllen
Copy link
Member

@ergl can you open a new issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working needs investigation This needs to be looked into before its "ready for work"
Projects
None yet
Development

No branches or pull requests

5 participants