[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / X86 / critedge-assume.ll
blob58ca8df8ff6d6e77fbe75ee514ec4f6a01603cca
1 ; RUN: opt -o %t %s -passes=instcombine,simplifycfg -simplifycfg-require-and-preserve-domtree=1 -thinlto-bc -verify-assumption-cache
2 ; RUN: llvm-dis -o - %t | FileCheck %s
4 ; Test that the simplifycfg pass correctly updates the assumption cache
5 ; when it clones the llvm.assume call as part of creating a critical
6 ; edge. To do that, we set up a pass pipeline such that (1) an assumption
7 ; cache is created for foo before simplifycfg updates it, and (2) foo's
8 ; assumption cache is verified after simplifycfg has run. To satisfy 1, we
9 ; run the instcombine pass first in our pipeline. To satisfy 2, we use the
10 ; ThinLTOBitcodeWriter pass to write bitcode (that pass uses the assumption
11 ; cache). That ensures that the pass manager does not call releaseMemory()
12 ; on the AssumptionCacheTracker before the end of the pipeline, which would
13 ; wipe out the bad assumption cache before it is verified.
15 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
16 target triple = "x86_64-unknown-linux-gnu"
18 %class.F = type { i8 }
19 %class.B = type { i8 }
20 %class.A = type { %class.C }
21 %class.C = type { ptr }
23 define void @foo(ptr %this, ptr %out) {
24 entry:
25   %call = tail call i32 @_ZNK1F5beginEv(ptr %this)
26   %call2 = tail call i32 @_ZNK1F3endEv(ptr %this)
27   %cmp.i22 = icmp eq i32 %call, %call2
28   br i1 %cmp.i22, label %while.end, label %while.body.preheader
30 while.body.preheader:
31   br label %while.body
33 while.body:
34   %frame_node.sroa.0.023 = phi i32 [ %inc.i, %_ZN10unique_ptrD2Ev.exit ], [ %call, %while.body.preheader ]
35   %call8 = tail call ptr @_Znwm(i64 8)
36   %inc.i = add nsw i32 %frame_node.sroa.0.023, 1
37   %cmp = icmp eq i32 %inc.i, %call2
38   br i1 %cmp, label %_ZN10unique_ptrD2Ev.exit, label %if.then
40 if.then:
41   tail call void @_ZN1B6appendEv(ptr %out)
42   br label %_ZN10unique_ptrD2Ev.exit
44 _ZN10unique_ptrD2Ev.exit:
45   %vtable.i.i = load ptr, ptr %call8, align 8
46   %x3 = tail call i1 @llvm.type.test(ptr %vtable.i.i, metadata !"foo")
47   ; CHECK: call void @llvm.assume
48   ; CHECK: call void @llvm.assume
49   tail call void @llvm.assume(i1 %x3) #5
50   br i1 %cmp, label %while.end.loopexit, label %while.body
52 while.end.loopexit:
53   br label %while.end
55 while.end:
56   ret void
59 declare void @llvm.lifetime.start.p0(i64, ptr nocapture)
61 declare i32 @_ZNK1F5beginEv(ptr)
63 declare i32 @_ZNK1F3endEv(ptr)
65 declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1)
67 declare noalias nonnull ptr @_Znwm(i64)
69 declare void @_ZN1B6appendEv(ptr)
71 declare void @llvm.lifetime.end.p0(i64, ptr nocapture)
73 declare i1 @llvm.type.test(ptr, metadata)
75 declare void @llvm.assume(i1)
77 !llvm.module.flags = !{!0}
78 !llvm.ident = !{!1}
80 !0 = !{i32 1, !"PIC Level", i32 2}
81 !1 = !{!"clang version 5.0.0 "}