153 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 22; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 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_dominance19; 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 814; CHECK-NEXT: store i32 0, ptr [[A]], align 415; CHECK-NEXT: ret void16;17entry:18 %a = load ptr, ptr %p, !nonnull !019 br label %bb120 21bb1:22 %b = load ptr, ptr %p23 store i32 0, ptr %a24 store i32 0, ptr %b25 ret void26}27 28declare i32 @use(ptr, i32) readonly29 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_dominance234; 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 839; CHECK-NEXT: store i32 0, ptr [[A]], align 440; CHECK-NEXT: ret void41; CHECK: bb2:42; CHECK-NEXT: ret void43;44entry:45 %a = load ptr, ptr %p46 br i1 %c1, label %bb1, label %bb247 48bb1:49 %b = load ptr, ptr %p, !nonnull !050 store i32 0, ptr %a51 store i32 0, ptr %b52 ret void53 54bb2:55 ret void56}57 58define void @combine_metadata_dominance3(ptr %p) {59; CHECK-LABEL: define void @combine_metadata_dominance360; 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 !065; CHECK-NEXT: store i32 0, ptr [[A]], align 466; CHECK-NEXT: ret void67;68entry:69 %a = load ptr, ptr %p, !nonnull !0, !noundef !170 br label %bb171 72bb1:73 %b = load ptr, ptr %p74 store i32 0, ptr %a75 store i32 0, ptr %b76 ret void77}78 79define void @combine_metadata_dominance4(ptr %p) {80; CHECK-LABEL: define void @combine_metadata_dominance481; 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 886; CHECK-NEXT: store i32 0, ptr [[A]], align 487; CHECK-NEXT: ret void88;89entry:90 %a = load ptr, ptr %p, !nonnull !091 br label %bb192 93bb1:94 %b = load ptr, ptr %p, !noundef !195 store i32 0, ptr %a96 store i32 0, ptr %b97 ret void98}99 100define void @combine_metadata_dominance5(ptr %p) {101; CHECK-LABEL: define void @combine_metadata_dominance5102; 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 !1107; CHECK-NEXT: store i32 0, ptr [[A]], align 4108; CHECK-NEXT: ret void109;110entry:111 %a = load ptr, ptr %p, !align !2112 br label %bb1113 114bb1:115 %b = load ptr, ptr %p, !align !3116 store i32 0, ptr %a117 store i32 0, ptr %b118 ret void119}120 121define void @combine_metadata_dominance6(ptr %p) {122; CHECK-LABEL: define void @combine_metadata_dominance6123; 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 !0128; CHECK-NEXT: store i32 0, ptr [[A]], align 4129; CHECK-NEXT: ret void130;131entry:132 %a = load ptr, ptr %p, !align !2, !noundef !1133 br label %bb1134 135bb1:136 %b = load ptr, ptr %p, !align !3137 store i32 0, ptr %a138 store i32 0, ptr %b139 ret void140}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