1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=mergefunc -S < %s | FileCheck %s 3 4; This test makes sure that the mergefunc pass does not merge functions 5; that have different nonnull assertions. 6 7%1 = type ptr 8 9define void @f1(ptr %0, ptr %1) { 10; CHECK-LABEL: @f1( 11; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP1:%.*]], align 8, !nonnull !0 12; CHECK-NEXT: store ptr [[TMP3]], ptr [[TMP0:%.*]], align 8 13; CHECK-NEXT: ret void 14; 15 %3 = load ptr, ptr %1, align 8, !nonnull !0 16 store ptr %3, ptr %0, align 8 17 ret void 18} 19 20define void @f2(ptr %0, ptr %1) { 21; CHECK-LABEL: @f2( 22; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP1:%.*]], align 8 23; CHECK-NEXT: store ptr [[TMP3]], ptr [[TMP0:%.*]], align 8 24; CHECK-NEXT: ret void 25; 26 %3 = load ptr, ptr %1, align 8 27 store ptr %3, ptr %0, align 8 28 ret void 29} 30 31define void @noundef(ptr %0, ptr %1) { 32; CHECK-LABEL: @noundef( 33; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP1:%.*]], align 8, !noundef !0 34; CHECK-NEXT: store ptr [[TMP3]], ptr [[TMP0:%.*]], align 8 35; CHECK-NEXT: ret void 36; 37 %3 = load ptr, ptr %1, align 8, !noundef !0 38 store ptr %3, ptr %0, align 8 39 ret void 40} 41 42define void @noalias_1(ptr %0, ptr %1) { 43; CHECK-LABEL: @noalias_1( 44; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP1:%.*]], align 8, !noalias !1 45; CHECK-NEXT: store ptr [[TMP3]], ptr [[TMP0:%.*]], align 8, !alias.scope !1 46; CHECK-NEXT: ret void 47; 48 %3 = load ptr, ptr %1, align 8, !noalias !4 49 store ptr %3, ptr %0, align 8, !alias.scope !4 50 ret void 51} 52 53define void @noundef_dbg(ptr %0, ptr %1) { 54; CHECK-LABEL: @noundef_dbg( 55; CHECK-NEXT: tail call void @noundef(ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) 56; CHECK-NEXT: ret void 57; 58 %3 = load ptr, ptr %1, align 8, !noundef !0, !dbg !1 59 store ptr %3, ptr %0, align 8 60 ret void 61} 62 63; FIXME: This is merged despite different noalias metadata. 64define void @noalias_2(ptr %0, ptr %1) { 65; CHECK-LABEL: @noalias_2( 66; CHECK-NEXT: tail call void @noalias_1(ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) 67; CHECK-NEXT: ret void 68; 69 %3 = load ptr, ptr %1, align 8, !noalias !7 70 store ptr %3, ptr %0, align 8, !alias.scope !7 71 ret void 72} 73 74!0 = !{} 75!1 = !{} 76!2 = !{!2} 77!3 = !{!3, !2} 78!4 = !{!3} 79!5 = !{!5} 80!6 = !{!6, !5} 81!7 = !{!6} 82