diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-08-04 06:42:31 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-08-04 06:42:31 +0000 |
commit | 706f37e8df7b9e18d3f17d18e938d02d0a4d3c47 (patch) | |
tree | eee17ffdfe056955df5fa1204deeae3ae3f4e6c5 /llvm/lib/Transforms/Utils/DemoteRegToStack.cpp | |
parent | c8d578311473fceb50579906658b0c017ef5b193 (diff) | |
download | llvm-706f37e8df7b9e18d3f17d18e938d02d0a4d3c47.zip llvm-706f37e8df7b9e18d3f17d18e938d02d0a4d3c47.tar.gz llvm-706f37e8df7b9e18d3f17d18e938d02d0a4d3c47.tar.bz2 |
Linker: Fix references to uniqued nodes after r243883
r243883 started moving 'distinct' nodes instead of duplicated them in
lib/Linker. This had the side-effect of sometimes not cloning uniqued
nodes that reference them. I missed a corner case:
!named = !{!0}
!0 = !{!1}
!1 = distinct !{!0}
!0 is the entry point for "remapping", and a temporary clone (say,
!0-temp) is created and mapped in case we need to model a uniquing
cycle.
Recursive descent into !1. !1 is distinct, so we leave it alone,
but update its operand to !0-temp.
Pop back out to !0. Its only operand, !1, hasn't changed, so we don't
need to use !0-temp. !0-temp goes out of scope, and we're finished
remapping, but we're left with:
!named = !{!0}
!0 = !{!1}
!1 = distinct !{null} ; uh oh...
Previously, if !0 and !0-temp ended up with identical operands, then
!0-temp couldn't have been referenced at all. Now that distinct nodes
don't get duplicated, that assumption is invalid. We need to
!0-temp->replaceAllUsesWith(!0) before freeing !0-temp.
I found this while running an internal `-flto -g` bootstrap. Strangely,
there was no case of this in the open source bootstrap I'd done before
commit...
llvm-svn: 243961
Diffstat (limited to 'llvm/lib/Transforms/Utils/DemoteRegToStack.cpp')
0 files changed, 0 insertions, 0 deletions