1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2 2; RUN: opt -passes=instcombine -S < %s | FileCheck %s 3 4target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128" 5 6; Check that nonnull metadata is not propagated from dominating load. 7define void @combine_metadata_dominance1(ptr %p) { 8; CHECK-LABEL: define void @combine_metadata_dominance1 9; CHECK-SAME: (ptr [[P:%.*]]) { 10; CHECK-NEXT: entry: 11; CHECK-NEXT: br label [[BB1:%.*]] 12; CHECK: bb1: 13; CHECK-NEXT: [[A:%.*]] = load ptr, ptr [[P]], align 8 14; CHECK-NEXT: store i32 0, ptr [[A]], align 4 15; CHECK-NEXT: ret void 16; 17entry: 18 %a = load ptr, ptr %p, !nonnull !0 19 br label %bb1 20 21bb1: 22 %b = load ptr, ptr %p 23 store i32 0, ptr %a 24 store i32 0, ptr %b 25 ret void 26} 27 28declare i32 @use(ptr, i32) readonly 29 30; Check that nonnull from the dominated load does not get propagated. 31; There are some cases where it would be safe to keep it. 32define void @combine_metadata_dominance2(ptr %p, i1 %c1) { 33; CHECK-LABEL: define void @combine_metadata_dominance2 34; CHECK-SAME: (ptr [[P:%.*]], i1 [[C1:%.*]]) { 35; CHECK-NEXT: entry: 36; CHECK-NEXT: br i1 [[C1]], label [[BB1:%.*]], label [[BB2:%.*]] 37; CHECK: bb1: 38; CHECK-NEXT: [[A:%.*]] = load ptr, ptr [[P]], align 8 39; CHECK-NEXT: store i32 0, ptr [[A]], align 4 40; CHECK-NEXT: ret void 41; CHECK: bb2: 42; CHECK-NEXT: ret void 43; 44entry: 45 %a = load ptr, ptr %p 46 br i1 %c1, label %bb1, label %bb2 47 48bb1: 49 %b = load ptr, ptr %p, !nonnull !0 50 store i32 0, ptr %a 51 store i32 0, ptr %b 52 ret void 53 54bb2: 55 ret void 56} 57 58define void @combine_metadata_dominance3(ptr %p) { 59; CHECK-LABEL: define void @combine_metadata_dominance3 60; CHECK-SAME: (ptr [[P:%.*]]) { 61; CHECK-NEXT: entry: 62; CHECK-NEXT: br label [[BB1:%.*]] 63; CHECK: bb1: 64; CHECK-NEXT: [[A:%.*]] = load ptr, ptr [[P]], align 8, !nonnull !0, !noundef !0 65; CHECK-NEXT: store i32 0, ptr [[A]], align 4 66; CHECK-NEXT: ret void 67; 68entry: 69 %a = load ptr, ptr %p, !nonnull !0, !noundef !1 70 br label %bb1 71 72bb1: 73 %b = load ptr, ptr %p 74 store i32 0, ptr %a 75 store i32 0, ptr %b 76 ret void 77} 78 79define void @combine_metadata_dominance4(ptr %p) { 80; CHECK-LABEL: define void @combine_metadata_dominance4 81; CHECK-SAME: (ptr [[P:%.*]]) { 82; CHECK-NEXT: entry: 83; CHECK-NEXT: br label [[BB1:%.*]] 84; CHECK: bb1: 85; CHECK-NEXT: [[A:%.*]] = load ptr, ptr [[P]], align 8 86; CHECK-NEXT: store i32 0, ptr [[A]], align 4 87; CHECK-NEXT: ret void 88; 89entry: 90 %a = load ptr, ptr %p, !nonnull !0 91 br label %bb1 92 93bb1: 94 %b = load ptr, ptr %p, !noundef !1 95 store i32 0, ptr %a 96 store i32 0, ptr %b 97 ret void 98} 99 100define void @combine_metadata_dominance5(ptr %p) { 101; CHECK-LABEL: define void @combine_metadata_dominance5 102; CHECK-SAME: (ptr [[P:%.*]]) { 103; CHECK-NEXT: entry: 104; CHECK-NEXT: br label [[BB1:%.*]] 105; CHECK: bb1: 106; CHECK-NEXT: [[A:%.*]] = load ptr, ptr [[P]], align 8, !align !1 107; CHECK-NEXT: store i32 0, ptr [[A]], align 4 108; CHECK-NEXT: ret void 109; 110entry: 111 %a = load ptr, ptr %p, !align !2 112 br label %bb1 113 114bb1: 115 %b = load ptr, ptr %p, !align !3 116 store i32 0, ptr %a 117 store i32 0, ptr %b 118 ret void 119} 120 121define void @combine_metadata_dominance6(ptr %p) { 122; CHECK-LABEL: define void @combine_metadata_dominance6 123; CHECK-SAME: (ptr [[P:%.*]]) { 124; CHECK-NEXT: entry: 125; CHECK-NEXT: br label [[BB1:%.*]] 126; CHECK: bb1: 127; CHECK-NEXT: [[A:%.*]] = load ptr, ptr [[P]], align 8, !align !2, !noundef !0 128; CHECK-NEXT: store i32 0, ptr [[A]], align 4 129; CHECK-NEXT: ret void 130; 131entry: 132 %a = load ptr, ptr %p, !align !2, !noundef !1 133 br label %bb1 134 135bb1: 136 %b = load ptr, ptr %p, !align !3 137 store i32 0, ptr %a 138 store i32 0, ptr %b 139 ret void 140} 141 142!0 = !{} 143!1 = !{} 144!2 = !{i64 8} 145!3 = !{i64 4} 146;. 147; CHECK: attributes #[[ATTR0:[0-9]+]] = { memory(read) } 148;. 149; CHECK: [[META0:![0-9]+]] = !{} 150; CHECK: [[META1:![0-9]+]] = !{i64 4} 151; CHECK: [[META2:![0-9]+]] = !{i64 8} 152;. 153