<html>
<head>
<base href="https://bugs.llvm.org/">
</head>
<body><table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Bug ID</th>
<td><a class="bz_bug_link
bz_status_NEW "
title="NEW - newgvn assertion BeforeCC->isEquivalentTo(AfterCC) && "Value number changed after main loop completed!"
href="https://bugs.llvm.org/show_bug.cgi?id=42557">42557</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>newgvn assertion BeforeCC->isEquivalentTo(AfterCC) && "Value number changed after main loop completed!
</td>
</tr>
<tr>
<th>Product</th>
<td>libraries
</td>
</tr>
<tr>
<th>Version</th>
<td>trunk
</td>
</tr>
<tr>
<th>Hardware</th>
<td>PC
</td>
</tr>
<tr>
<th>OS</th>
<td>All
</td>
</tr>
<tr>
<th>Status</th>
<td>NEW
</td>
</tr>
<tr>
<th>Severity</th>
<td>enhancement
</td>
</tr>
<tr>
<th>Priority</th>
<td>P
</td>
</tr>
<tr>
<th>Component</th>
<td>Scalar Optimizations
</td>
</tr>
<tr>
<th>Assignee</th>
<td>unassignedbugs@nondot.org
</td>
</tr>
<tr>
<th>Reporter</th>
<td>nick@wasmer.io
</td>
</tr>
<tr>
<th>CC</th>
<td>llvm-bugs@lists.llvm.org
</td>
</tr></table>
<p>
<div>
<pre>This testcase is reduced out of sqlite.
$ cat c.ll
; ModuleID = '<stdin>'
source_filename = "module"
target triple = "x86_64-apple-darwin18.6.0"
declare void @use1(i1)
declare i1 @get1()
define void @hoge(i32 %tmp6) {
bb:
%A = call i1 @get1()
%B = call i1 @get1()
br label %bb1
bb1: ; preds = %bb1, %bb
%tmp = phi i32 [ 0, %bb ], [ %tmp6, %bb1 ]
br i1 %A, label %bb2, label %bb1
bb2: ; preds = %bb1
br i1 %B, label %bb16, label %bb11
bb16: ; preds = %bb2
%tmp17 = add i32 %tmp, 1
br label %bb11
bb11: ; preds = %bb16, %bb2
%tmp12 = phi i32 [ %tmp17, %bb16 ], [ 0, %bb2 ]
%tmp13 = icmp eq i32 %tmp12, 0
call void @use1(i1 %tmp13)
%tmp15 = icmp ne i32 %tmp, 0
br i1 %tmp15, label %bb18, label %bb19
bb18: ; preds = %bb11
br label %bb19
bb19: ; preds = %bb18, %bb11
%tmp20 = phi i32 [ %tmp12, %bb11 ], [ 1, %bb18 ]
%tmp21 = icmp eq i32 %tmp20, 0
call void @use1(i1 %tmp21)
ret void
}
$ opt -newgvn c.ll
Assertion failed: (BeforeCC->isEquivalentTo(AfterCC) && "Value number changed
after main loop completed!"), function verifyIterationSettled, file
/Users/nicklewycky/llvm-project/llvm/lib/Transforms/Scalar/NewGVN.cpp, line
3305.
Stack dump:
0. Program arguments: llvm-head/bin/opt -newgvn c.ll -debug
1. Running pass 'Function Pass Manager' on module 'c.ll'.
2. Running pass 'Global Value Numbering' on function '@hoge'
0 opt 0x0000000107fdc74c
llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 60
1 opt 0x0000000107fdccd9
PrintStackTraceSignalHandler(void*) + 25
2 opt 0x0000000107fdaa26 llvm::sys::RunSignalHandlers() +
118
3 opt 0x0000000107fdfc22 SignalHandler(int) + 210
4 libsystem_platform.dylib 0x00007fff7148ab5d _sigtramp + 29
5 opt 0x000000010a524b98
llvm::DenseMapInfo<llvm::codeview::GloballyHashedType>::Tombstone + 2160352
6 libsystem_c.dylib 0x00007fff713446a6 abort + 127
7 libsystem_c.dylib 0x00007fff7130d20d basename_r + 0
8 opt 0x0000000107c68587 (anonymous
namespace)::NewGVN::verifyIterationSettled(llvm::Function&) + 1639
9 opt 0x0000000107c5aa78 (anonymous
namespace)::NewGVN::runGVN() + 1624
10 opt 0x0000000107c5fc27 (anonymous
namespace)::NewGVNLegacyPass::runOnFunction(llvm::Function&) + 327
11 opt 0x000000010720e359
llvm::FPPassManager::runOnFunction(llvm::Function&) + 681
12 opt 0x000000010720e96f
llvm::FPPassManager::runOnModule(llvm::Module&) + 175
13 opt 0x000000010720f0f5 (anonymous
namespace)::MPPassManager::runOnModule(llvm::Module&) + 789
14 opt 0x000000010720ec15
llvm::legacy::PassManagerImpl::run(llvm::Module&) + 293
15 opt 0x000000010720f711
llvm::legacy::PassManager::run(llvm::Module&) + 33
16 opt 0x00000001047d6200 main + 10880
17 libdyld.dylib 0x00007fff7129f3d5 start + 1
18 libdyld.dylib 0x0000000000000004 start + 18446603338617588784
In the final round, newgvn decides that %tmp21's leader is "i1 false", while in
the verification comparison round it does not. The congruence classes only have
one member, %tmp21.
However, this is incorrect, there is a path where %tmp21 could equal true, when
%A is true and %B is false (and %tmp6 doesn't matter). Then %tmp = i32 0, we go
to
%bb11, %tmp12 = i32 0, %tmp15 = i1 false, go to %bb19 directly, %tmp20 = i32 0,
%tmp21 = i1 true.</pre>
</div>
</p>
<hr>
<span>You are receiving this mail because:</span>
<ul>
<li>You are on the CC list for the bug.</li>
</ul>
</body>
</html>