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