[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / NewGVN / invariant.start.ll
blob100b79fd3bff285a1d2d67e36428606e440fbc3d
1 ; Test to make sure llvm.invariant.start calls are not treated as clobbers.
2 ; RUN: opt < %s -passes=newgvn -S | FileCheck %s
5 declare ptr @llvm.invariant.start.p0(i64, ptr nocapture) nounwind readonly
6 declare void @llvm.invariant.end.p0(ptr, i64, ptr nocapture) nounwind
8 ; We forward store to the load across the invariant.start intrinsic
9 define i8 @forward_store() {
10 ; CHECK-LABEL: @forward_store
11 ; CHECK: call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
12 ; CHECK-NOT: load
13 ; CHECK: ret i8 0
14   %a = alloca i8
15   store i8 0, ptr %a
16   %i = call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
17   %r = load i8, ptr %a
18   ret i8 %r
21 declare i8 @dummy(ptr nocapture) nounwind readonly
23 ; We forward store to the load in the non-local analysis case,
24 ; i.e. invariant.start is in another basic block.
25 define i8 @forward_store_nonlocal(i1 %cond) {
26 ; CHECK-LABEL: forward_store_nonlocal
27 ; CHECK: call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
28 ; CHECK: ret i8 0
29 ; CHECK: ret i8 %val
30   %a = alloca i8
31   store i8 0, ptr %a
32   %i = call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
33   br i1 %cond, label %loadblock, label %exit
35 loadblock:
36   %r = load i8, ptr %a
37   ret i8 %r
39 exit:
40   %val = call i8 @dummy(ptr %a)
41   ret i8 %val
44 ; We should not value forward %foo to the invariant.end corresponding to %bar.
45 define i8 @forward_store1() {
46 ; CHECK-LABEL: forward_store1
47 ; CHECK: %foo = call ptr @llvm.invariant.start.p0
48 ; CHECK-NOT: load
49 ; CHECK: %bar = call ptr @llvm.invariant.start.p0
50 ; CHECK: call void @llvm.invariant.end.p0(ptr %bar, i64 1, ptr %a)
51 ; CHECK: ret i8 0
52   %a = alloca i8
53   store i8 0, ptr %a
54   %foo = call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
55   %r = load i8, ptr %a
56   %bar = call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
57   call void @llvm.invariant.end.p0(ptr %bar, i64 1, ptr %a)
58   ret i8 %r