1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

[AssumptionCache] Do not track llvm.assume calls (PR49043)

This fixes PR49043 by invalidating the handle on RAUW. This will work
fine assuming all existing RAUW users add the new assumption to the
cache. That means, if a new llvm.assume call replaces an old one, you
need to add the new one now as a RAUW is not enough anymore.

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D96208
This commit is contained in:
Johannes Doerfert 2021-02-06 11:42:02 -06:00
parent b99993d408
commit fbfa693d11
2 changed files with 33 additions and 1 deletions

View File

@ -45,7 +45,7 @@ public:
enum : unsigned { ExprResultIdx = std::numeric_limits<unsigned>::max() };
struct ResultElem {
WeakTrackingVH Assume;
WeakVH Assume;
/// contains either ExprResultIdx or the index of the operand bundle
/// containing the knowledge.

View File

@ -0,0 +1,32 @@
; RUN: opt < %s -S -passes="print<assumptions>,gvn-sink,loop-unroll" -unroll-count=3 | FileCheck %s
;
; This crashed because the cached assumption was replaced and the replacement
; was then in the cache twice.
;
; PR49043
@g = external global i32
define void @main() {
bb:
%i1.i = load volatile i32, i32* @g
%i32.i = icmp eq i32 %i1.i, 0
call void @llvm.assume(i1 %i32.i) #3
br label %bb4.i
bb4.i: ; preds = %bb4.i, %bb
%i.i = load volatile i32, i32* @g
%i3.i = icmp eq i32 %i.i, 0
call void @llvm.assume(i1 %i3.i) #3
br label %bb4.i
func_1.exit: ; No predecessors!
unreachable
}
declare void @llvm.assume(i1)
; CHECK: call void @llvm.assume(
; CHECK: call void @llvm.assume(
; CHECK: call void @llvm.assume(