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