--- /dev/null
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -passes=mergefunc -S < %s | FileCheck %s
+
+; This test makes sure that the mergefunc pass does not merge functions
+; that have different nonnull assertions.
+
+%1 = type ptr
+
+define void @f1(ptr %0, ptr %1) {
+; CHECK-LABEL: @f1(
+; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP1:%.*]], align 8, !nonnull !0
+; CHECK-NEXT: store ptr [[TMP3]], ptr [[TMP0:%.*]], align 8
+; CHECK-NEXT: ret void
+;
+ %3 = load ptr, ptr %1, align 8, !nonnull !0
+ store ptr %3, ptr %0, align 8
+ ret void
+}
+
+define void @f2(ptr %0, ptr %1) {
+; CHECK-LABEL: @f2(
+; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP1:%.*]], align 8
+; CHECK-NEXT: store ptr [[TMP3]], ptr [[TMP0:%.*]], align 8
+; CHECK-NEXT: ret void
+;
+ %3 = load ptr, ptr %1, align 8
+ store ptr %3, ptr %0, align 8
+ ret void
+}
+
+define void @f3(ptr %0, ptr %1) {
+; CHECK-LABEL: @f3(
+; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP1:%.*]], align 8, !noundef !0
+; CHECK-NEXT: store ptr [[TMP3]], ptr [[TMP0:%.*]], align 8
+; CHECK-NEXT: ret void
+;
+ %3 = load ptr, ptr %1, align 8, !noundef !0
+ store ptr %3, ptr %0, align 8
+ ret void
+}
+
+define void @f4(ptr %0, ptr %1) {
+; CHECK-LABEL: @f4(
+; CHECK-NEXT: tail call void @f3(ptr [[TMP0:%.*]], ptr [[TMP1:%.*]])
+; CHECK-NEXT: ret void
+;
+ %3 = load ptr, ptr %1, align 8, !noundef !0, !dbg !1
+ store ptr %3, ptr %0, align 8
+ ret void
+}
+
+!0 = !{}
+!1 = !{}