xref: /llvm-project/llvm/test/Transforms/GVN/intrinsics_in_cg.ll (revision 10410534696e1922cbed56b229d123b2db4acd8e)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
2; RUN: opt < %s -passes='require<globals-aa>,gvn' -S | FileCheck %s
3
4; Ensure we do not hoist the load over the call.
5
6@G1 = internal global i32 1
7@G2 = internal global i32 1
8
9define i32 @direct_intrinsic(i1 %c) {
10; CHECK-LABEL: define {{[^@]+}}@direct_intrinsic
11; CHECK-SAME: (i1 [[C:%.*]]) {
12; CHECK-NEXT:    br i1 [[C]], label [[INIT:%.*]], label [[CHECK:%.*]]
13; CHECK:       init:
14; CHECK-NEXT:    store i32 0, ptr @G1, align 4
15; CHECK-NEXT:    br label [[CHECK]]
16; CHECK:       check:
17; CHECK-NEXT:    call void @llvm.unknown()
18; CHECK-NEXT:    [[V:%.*]] = load i32, ptr @G1, align 4
19; CHECK-NEXT:    ret i32 [[V]]
20;
21  br i1 %c, label %init, label %check
22init:
23  store i32 0, ptr @G1
24  br label %check
25check:
26  call void @llvm.unknown()
27  %v = load i32, ptr @G1
28  ret i32 %v
29}
30
31define i32 @indirect_intrinsic(i1 %c) {
32; CHECK-LABEL: define {{[^@]+}}@indirect_intrinsic
33; CHECK-SAME: (i1 [[C:%.*]]) {
34; CHECK-NEXT:    br i1 [[C]], label [[INIT:%.*]], label [[CHECK:%.*]]
35; CHECK:       init:
36; CHECK-NEXT:    store i32 0, ptr @G2, align 4
37; CHECK-NEXT:    br label [[CHECK]]
38; CHECK:       check:
39; CHECK-NEXT:    call void @intrinsic_caller()
40; CHECK-NEXT:    [[V:%.*]] = load i32, ptr @G2, align 4
41; CHECK-NEXT:    ret i32 [[V]]
42;
43  br i1 %c, label %init, label %check
44init:
45  store i32 0, ptr @G2
46  br label %check
47check:
48  call void @intrinsic_caller()
49  %v = load i32, ptr @G2
50  ret i32 %v
51}
52
53define fastcc void @intrinsic_caller() {
54; CHECK-LABEL: define {{[^@]+}}@intrinsic_caller() {
55; CHECK-NEXT:    call void @llvm.unknown()
56; CHECK-NEXT:    ret void
57;
58  call void @llvm.unknown()
59  ret void
60}
61
62declare void @llvm.unknown()
63
64