xref: /llvm-project/llvm/test/Transforms/InstSimplify/invariant.group-load.ll (revision 04b944e23050e4e0c6ee983cc9bc17740315ea4f)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
3
4@A = linkonce_odr hidden constant { i64, i64 } { i64 2, i64 3 }
5@B = linkonce_odr hidden global { i64, i64 } { i64 2, i64 3 }
6
7declare ptr @llvm.strip.invariant.group.p0(ptr %p)
8declare ptr @llvm.launder.invariant.group.p0(ptr %p)
9
10define i64 @f() {
11; CHECK-LABEL: @f(
12; CHECK-NEXT:    ret i64 3
13;
14  %a = call ptr @llvm.strip.invariant.group.p0(ptr @A)
15  %b = getelementptr i8, ptr %a, i32 8
16  %d = load i64, ptr %b
17  ret i64 %d
18}
19
20define i64 @g() {
21; CHECK-LABEL: @g(
22; CHECK-NEXT:    ret i64 3
23;
24  %a = call ptr @llvm.launder.invariant.group.p0(ptr @A)
25  %b = getelementptr i8, ptr %a, i32 8
26  %d = load i64, ptr %b
27  ret i64 %d
28}
29
30define i64 @notconstantglobal() {
31; CHECK-LABEL: @notconstantglobal(
32; CHECK-NEXT:    [[A:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr @B)
33; CHECK-NEXT:    [[B:%.*]] = getelementptr i8, ptr [[A]], i32 8
34; CHECK-NEXT:    [[D:%.*]] = load i64, ptr [[B]], align 4
35; CHECK-NEXT:    ret i64 [[D]]
36;
37  %a = call ptr @llvm.launder.invariant.group.p0(ptr @B)
38  %b = getelementptr i8, ptr %a, i32 8
39  %d = load i64, ptr %b
40  ret i64 %d
41}
42
43define i64 @notconstantgepindex(i32 %i) {
44; CHECK-LABEL: @notconstantgepindex(
45; CHECK-NEXT:    [[A:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr @A)
46; CHECK-NEXT:    [[B:%.*]] = getelementptr i8, ptr [[A]], i32 [[I:%.*]]
47; CHECK-NEXT:    [[D:%.*]] = load i64, ptr [[B]], align 4
48; CHECK-NEXT:    ret i64 [[D]]
49;
50  %a = call ptr @llvm.launder.invariant.group.p0(ptr @A)
51  %b = getelementptr i8, ptr %a, i32 %i
52  %d = load i64, ptr %b
53  ret i64 %d
54}
55
56define i64 @volatile() {
57; CHECK-LABEL: @volatile(
58; CHECK-NEXT:    [[A:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr @A)
59; CHECK-NEXT:    [[B:%.*]] = getelementptr i8, ptr [[A]], i32 8
60; CHECK-NEXT:    [[D:%.*]] = load volatile i64, ptr [[B]], align 4
61; CHECK-NEXT:    ret i64 [[D]]
62;
63  %a = call ptr @llvm.launder.invariant.group.p0(ptr @A)
64  %b = getelementptr i8, ptr %a, i32 8
65  %d = load volatile i64, ptr %b
66  ret i64 %d
67}
68