--- /dev/null
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
+; RUN: opt < %s -passes='require<globals-aa>,gvn' -S | FileCheck %s
+
+; Ensure we do not hoist the load over the call.
+; FIXME: Currently broken until D141190 or similar lands.
+
+@G1 = internal global i32 1
+@G2 = internal global i32 1
+
+define i32 @direct_intrinsic(i1 %c) {
+; CHECK-LABEL: define {{[^@]+}}@direct_intrinsic
+; CHECK-SAME: (i1 [[C:%.*]]) {
+; CHECK-NEXT: br i1 [[C]], label [[INIT:%.*]], label [[CHECK:%.*]]
+; CHECK: init:
+; CHECK-NEXT: store i32 0, ptr @G1, align 4
+; CHECK-NEXT: br label [[CHECK]]
+; CHECK: check:
+; CHECK-NEXT: call void @llvm.unknown()
+; CHECK-NEXT: [[V:%.*]] = load i32, ptr @G1, align 4
+; CHECK-NEXT: ret i32 [[V]]
+;
+ br i1 %c, label %init, label %check
+init:
+ store i32 0, ptr @G1
+ br label %check
+check:
+ call void @llvm.unknown()
+ %v = load i32, ptr @G1
+ ret i32 %v
+}
+
+define i32 @indirect_intrinsic(i1 %c) {
+; CHECK-LABEL: define {{[^@]+}}@indirect_intrinsic
+; CHECK-SAME: (i1 [[C:%.*]]) {
+; CHECK-NEXT: br i1 [[C]], label [[INIT:%.*]], label [[DOTCHECK_CRIT_EDGE:%.*]]
+; CHECK: .check_crit_edge:
+; CHECK-NEXT: [[V_PRE:%.*]] = load i32, ptr @G2, align 4
+; CHECK-NEXT: br label [[CHECK:%.*]]
+; CHECK: init:
+; CHECK-NEXT: store i32 0, ptr @G2, align 4
+; CHECK-NEXT: br label [[CHECK]]
+; CHECK: check:
+; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[V_PRE]], [[DOTCHECK_CRIT_EDGE]] ], [ 0, [[INIT]] ]
+; CHECK-NEXT: call void @intrinsic_caller()
+; CHECK-NEXT: ret i32 [[V]]
+;
+ br i1 %c, label %init, label %check
+init:
+ store i32 0, ptr @G2
+ br label %check
+check:
+ call void @intrinsic_caller()
+ %v = load i32, ptr @G2
+ ret i32 %v
+}
+
+define fastcc void @intrinsic_caller() {
+; CHECK-LABEL: define {{[^@]+}}@intrinsic_caller() {
+; CHECK-NEXT: call void @llvm.unknown()
+; CHECK-NEXT: ret void
+;
+ call void @llvm.unknown()
+ ret void
+}
+
+declare void @llvm.unknown()
+