Summary: Assumption cache's self-updating mechanism does not correctly handle the case when blocks are extracted from the function by the CodeExtractor. As a result function's assumption cache may have stale references to the llvm.assume calls that were moved to the outlined function. This patch fixes this problem by removing extracted llvm.assume calls from the function’s assumption cache. Reviewers: hfinkel, vsk, fhahn, davidxl, sanjoy Reviewed By: hfinkel, vsk Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D57215 llvm-svn: 353500
30 lines
785 B
LLVM
30 lines
785 B
LLVM
; RUN: opt -passes="function(slp-vectorizer),module(hotcoldsplit),function(slp-vectorizer,print<assumptions>)" -disable-output %s 2>&1 | FileCheck %s
|
|
;
|
|
; Make sure this compiles. Check that function assumption cache is refreshed
|
|
; after extracting blocks with assume calls from the function.
|
|
|
|
; CHECK: Cached assumptions for function: fun
|
|
; CHECK-NEXT: Cached assumptions for function: fun.cold
|
|
; CHECK-NEXT: %cmp = icmp uge i32 %x, 64
|
|
|
|
declare void @fun2(i32) #0
|
|
|
|
define void @fun(i32 %x) {
|
|
entry:
|
|
br i1 undef, label %if.then, label %if.else
|
|
|
|
if.then:
|
|
ret void
|
|
|
|
if.else:
|
|
%cmp = icmp uge i32 %x, 64
|
|
call void @llvm.assume(i1 %cmp)
|
|
call void @fun2(i32 %x)
|
|
unreachable
|
|
}
|
|
|
|
declare void @llvm.assume(i1) #1
|
|
|
|
attributes #0 = { alwaysinline }
|
|
attributes #1 = { nounwind }
|