ponyc: LLVM Optimization Pass Crash on Merge successive reallocations of the same variable

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.

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 18 (16 by maintainers)

Most upvoted comments

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.

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)

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