xref: /llvm-project/llvm/test/Transforms/InstSimplify/invariant.group-load.ll (revision 04b944e23050e4e0c6ee983cc9bc17740315ea4f)
13aa94307SArthur Eubanks; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
23aa94307SArthur Eubanks; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
33aa94307SArthur Eubanks
43aa94307SArthur Eubanks@A = linkonce_odr hidden constant { i64, i64 } { i64 2, i64 3 }
53aa94307SArthur Eubanks@B = linkonce_odr hidden global { i64, i64 } { i64 2, i64 3 }
63aa94307SArthur Eubanks
7*04b944e2SNikita Popovdeclare ptr @llvm.strip.invariant.group.p0(ptr %p)
8*04b944e2SNikita Popovdeclare ptr @llvm.launder.invariant.group.p0(ptr %p)
93aa94307SArthur Eubanks
103aa94307SArthur Eubanksdefine i64 @f() {
113aa94307SArthur Eubanks; CHECK-LABEL: @f(
129aa14281SArthur Eubanks; CHECK-NEXT:    ret i64 3
133aa94307SArthur Eubanks;
14*04b944e2SNikita Popov  %a = call ptr @llvm.strip.invariant.group.p0(ptr @A)
15*04b944e2SNikita Popov  %b = getelementptr i8, ptr %a, i32 8
16*04b944e2SNikita Popov  %d = load i64, ptr %b
173aa94307SArthur Eubanks  ret i64 %d
183aa94307SArthur Eubanks}
193aa94307SArthur Eubanks
203aa94307SArthur Eubanksdefine i64 @g() {
213aa94307SArthur Eubanks; CHECK-LABEL: @g(
229aa14281SArthur Eubanks; CHECK-NEXT:    ret i64 3
233aa94307SArthur Eubanks;
24*04b944e2SNikita Popov  %a = call ptr @llvm.launder.invariant.group.p0(ptr @A)
25*04b944e2SNikita Popov  %b = getelementptr i8, ptr %a, i32 8
26*04b944e2SNikita Popov  %d = load i64, ptr %b
273aa94307SArthur Eubanks  ret i64 %d
283aa94307SArthur Eubanks}
293aa94307SArthur Eubanks
303aa94307SArthur Eubanksdefine i64 @notconstantglobal() {
313aa94307SArthur Eubanks; CHECK-LABEL: @notconstantglobal(
32*04b944e2SNikita Popov; CHECK-NEXT:    [[A:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr @B)
33*04b944e2SNikita Popov; CHECK-NEXT:    [[B:%.*]] = getelementptr i8, ptr [[A]], i32 8
34*04b944e2SNikita Popov; CHECK-NEXT:    [[D:%.*]] = load i64, ptr [[B]], align 4
353aa94307SArthur Eubanks; CHECK-NEXT:    ret i64 [[D]]
363aa94307SArthur Eubanks;
37*04b944e2SNikita Popov  %a = call ptr @llvm.launder.invariant.group.p0(ptr @B)
38*04b944e2SNikita Popov  %b = getelementptr i8, ptr %a, i32 8
39*04b944e2SNikita Popov  %d = load i64, ptr %b
403aa94307SArthur Eubanks  ret i64 %d
413aa94307SArthur Eubanks}
423aa94307SArthur Eubanks
433aa94307SArthur Eubanksdefine i64 @notconstantgepindex(i32 %i) {
443aa94307SArthur Eubanks; CHECK-LABEL: @notconstantgepindex(
45*04b944e2SNikita Popov; CHECK-NEXT:    [[A:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr @A)
46*04b944e2SNikita Popov; CHECK-NEXT:    [[B:%.*]] = getelementptr i8, ptr [[A]], i32 [[I:%.*]]
47*04b944e2SNikita Popov; CHECK-NEXT:    [[D:%.*]] = load i64, ptr [[B]], align 4
483aa94307SArthur Eubanks; CHECK-NEXT:    ret i64 [[D]]
493aa94307SArthur Eubanks;
50*04b944e2SNikita Popov  %a = call ptr @llvm.launder.invariant.group.p0(ptr @A)
51*04b944e2SNikita Popov  %b = getelementptr i8, ptr %a, i32 %i
52*04b944e2SNikita Popov  %d = load i64, ptr %b
533aa94307SArthur Eubanks  ret i64 %d
543aa94307SArthur Eubanks}
553aa94307SArthur Eubanks
563aa94307SArthur Eubanksdefine i64 @volatile() {
573aa94307SArthur Eubanks; CHECK-LABEL: @volatile(
58*04b944e2SNikita Popov; CHECK-NEXT:    [[A:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr @A)
59*04b944e2SNikita Popov; CHECK-NEXT:    [[B:%.*]] = getelementptr i8, ptr [[A]], i32 8
60*04b944e2SNikita Popov; CHECK-NEXT:    [[D:%.*]] = load volatile i64, ptr [[B]], align 4
613aa94307SArthur Eubanks; CHECK-NEXT:    ret i64 [[D]]
623aa94307SArthur Eubanks;
63*04b944e2SNikita Popov  %a = call ptr @llvm.launder.invariant.group.p0(ptr @A)
64*04b944e2SNikita Popov  %b = getelementptr i8, ptr %a, i32 8
65*04b944e2SNikita Popov  %d = load volatile i64, ptr %b
663aa94307SArthur Eubanks  ret i64 %d
673aa94307SArthur Eubanks}
68