; RUN: opt < %s -passes=gvn-sink -S | FileCheck %s ; Check that nonnull metadata for non-dominating loads is not propagated. ; CHECK-LABEL: @test1( ; CHECK-LABEL: if.end: ; CHECK: %[[ptr:.*]] = phi ptr ; CHECK: %[[load:.*]] = load ptr, ptr %[[ptr]] ; CHECK-NOT: !nonnull ; CHECK: ret ptr %[[load]] define ptr @test1(i1 zeroext %flag, ptr %p) { entry: br i1 %flag, label %if.then, label %if.else if.then: %a = load ptr, ptr %p %aa = load ptr, ptr %a, !nonnull !0 br label %if.end if.else: %b = load ptr, ptr %p %bb= load ptr, ptr %b br label %if.end if.end: %c = phi ptr [ %aa, %if.then ], [ %bb, %if.else ] ret ptr %c } ; CHECK-LABEL: @test2( ; CHECK-LABEL: if.end: ; CHECK: %[[ptr:.*]] = phi ptr ; CHECK: %[[load:.*]] = load ptr, ptr %[[ptr]] ; CHECK-NOT: !nonnull ; CHECK: ret ptr %[[load]] define ptr @test2(i1 zeroext %flag, ptr %p) { entry: br i1 %flag, label %if.then, label %if.else if.then: %a = load ptr, ptr %p %aa = load ptr, ptr %a br label %if.end if.else: %b = load ptr, ptr %p %bb= load ptr, ptr %b, !nonnull !0 br label %if.end if.end: %c = phi ptr [ %aa, %if.then ], [ %bb, %if.else ] ret ptr %c } ; Check that nontemporal markings are propagated if both original stores are ; marked. ; CHECK-LABEL: @nontemporal( ; CHECK-LABEL: if.end: ; CHECK: !nontemporal ; CHECK: ret void define void @nontemporal(i1 zeroext %flag, ptr %p) { entry: br i1 %flag, label %if.then, label %if.else if.then: %a = load ptr, ptr %p store ptr %p, ptr %a, align 8, !nontemporal !1 br label %if.end if.else: %b = load ptr, ptr %p store ptr %p, ptr %b, align 8, !nontemporal !1 br label %if.end if.end: ret void } ; CHECK-LABEL: @nontemporal_mismatch( ; CHECK-NOT: !nontemporal define void @nontemporal_mismatch(i1 zeroext %flag, ptr %p) { entry: br i1 %flag, label %if.then, label %if.else if.then: %a = load ptr, ptr %p store ptr %p, ptr %a, align 8 br label %if.end if.else: %b = load ptr, ptr %p store ptr %p, ptr %b, align 8, !nontemporal !1 br label %if.end if.end: ret void } !0 = !{} !1 = !{i32 1}