1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-24 13:33:37 +02:00
llvm-mirror/test/Transforms/SimplifyCFG/critedge-assume.ll
Peter Collingbourne fccb6e3a69 AssumptionCache: Disable the verifier by default, move it behind a hidden cl::opt and verify from releaseMemory().
This is a short term solution to the problem that many passes currently fail
to update the assumption cache. In the long term the verifier should not
be controllable with a flag. We should either fix all passes to correctly
update the assumption cache and enable the verifier unconditionally or
somehow arrange for the assumption list to be updated automatically by passes.

Differential Revision: https://reviews.llvm.org/D30003

llvm-svn: 295236
2017-02-15 21:10:09 +00:00

84 lines
2.8 KiB
LLVM

; RUN: opt -o %t %s -instcombine -simplifycfg -thinlto-bc -verify-assumption-cache
; RUN: llvm-dis -o - %t | FileCheck %s
; Test that the simplifycfg pass correctly updates the assumption cache
; when it clones the llvm.assume call as part of creating a critical
; edge. To do that, we set up a pass pipeline such that (1) an assumption
; cache is created for foo before simplifycfg updates it, and (2) foo's
; assumption cache is verified after simplifycfg has run. To satisfy 1, we
; run the instcombine pass first in our pipeline. To satisfy 2, we use the
; ThinLTOBitcodeWriter pass to write bitcode (that pass uses the assumption
; cache). That ensures that the pass manager does not call releaseMemory()
; on the AssumptionCacheTracker before the end of the pipeline, which would
; wipe out the bad assumption cache before it is verified.
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%class.F = type { i8 }
%class.B = type { i8 }
%class.A = type { %class.C }
%class.C = type { i32 (...)** }
define void @foo(%class.F* %this, %class.B* %out) {
entry:
%call = tail call i32 @_ZNK1F5beginEv(%class.F* %this)
%call2 = tail call i32 @_ZNK1F3endEv(%class.F* %this)
%cmp.i22 = icmp eq i32 %call, %call2
br i1 %cmp.i22, label %while.end, label %while.body.preheader
while.body.preheader:
br label %while.body
while.body:
%frame_node.sroa.0.023 = phi i32 [ %inc.i, %_ZN10unique_ptrD2Ev.exit ], [ %call, %while.body.preheader ]
%call8 = tail call i8* @_Znwm(i64 8)
%inc.i = add nsw i32 %frame_node.sroa.0.023, 1
%cmp = icmp eq i32 %inc.i, %call2
br i1 %cmp, label %_ZN10unique_ptrD2Ev.exit, label %if.then
if.then:
tail call void @_ZN1B6appendEv(%class.B* %out)
br label %_ZN10unique_ptrD2Ev.exit
_ZN10unique_ptrD2Ev.exit:
%x1 = bitcast i8* %call8 to void (%class.A*)***
%vtable.i.i = load void (%class.A*)**, void (%class.A*)*** %x1, align 8
%x2 = bitcast void (%class.A*)** %vtable.i.i to i8*
%x3 = tail call i1 @llvm.type.test(i8* %x2, metadata !"foo")
; CHECK: call void @llvm.assume
; CHECK: call void @llvm.assume
tail call void @llvm.assume(i1 %x3) #5
br i1 %cmp, label %while.end.loopexit, label %while.body
while.end.loopexit:
br label %while.end
while.end:
ret void
}
declare void @llvm.lifetime.start(i64, i8* nocapture)
declare i32 @_ZNK1F5beginEv(%class.F*)
declare i32 @_ZNK1F3endEv(%class.F*)
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1)
declare noalias nonnull i8* @_Znwm(i64)
declare void @_ZN1B6appendEv(%class.B*)
declare void @llvm.lifetime.end(i64, i8* nocapture)
declare i1 @llvm.type.test(i8*, metadata)
declare void @llvm.assume(i1)
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"PIC Level", i32 2}
!1 = !{!"clang version 5.0.0 "}