[rtsan] Add fork/execve interceptors (#117198)
[llvm-project.git] / llvm / test / Transforms / GVNSink / sink-combine-metadata.ll
blobcce191f20511495f94540060d0335574fd6c7def
1 ; RUN: opt < %s -passes=gvn-sink -S | FileCheck %s
3 ; Check that nonnull metadata for non-dominating loads is not propagated.
4 ; CHECK-LABEL: @test1(
5 ; CHECK-LABEL: if.end:
6 ; CHECK:  %[[ptr:.*]] = phi ptr
7 ; CHECK: %[[load:.*]] = load ptr, ptr %[[ptr]]
8 ; CHECK-NOT: !nonnull
9 ; CHECK: ret ptr %[[load]]
10 define ptr @test1(i1 zeroext %flag, ptr %p) {
11 entry:
12   br i1 %flag, label %if.then, label %if.else
14 if.then:
15   %a = load ptr, ptr %p
16   %aa = load ptr, ptr %a, !nonnull !0
17   br label %if.end
19 if.else:
20   %b = load ptr, ptr %p
21   %bb= load ptr, ptr %b
22   br label %if.end
24 if.end:
25   %c = phi ptr [ %aa, %if.then ], [ %bb, %if.else ]
26   ret ptr %c
29 ; CHECK-LABEL: @test2(
30 ; CHECK-LABEL: if.end:
31 ; CHECK:  %[[ptr:.*]] = phi ptr
32 ; CHECK: %[[load:.*]] = load ptr, ptr %[[ptr]]
33 ; CHECK-NOT: !nonnull
34 ; CHECK: ret ptr %[[load]]
35 define ptr @test2(i1 zeroext %flag, ptr %p) {
36 entry:
37   br i1 %flag, label %if.then, label %if.else
39 if.then:
40   %a = load ptr, ptr %p
41   %aa = load ptr, ptr %a
42   br label %if.end
44 if.else:
45   %b = load ptr, ptr %p
46   %bb= load ptr, ptr %b, !nonnull !0
47   br label %if.end
49 if.end:
50   %c = phi ptr [ %aa, %if.then ], [ %bb, %if.else ]
51   ret ptr %c
54 ; Check that nontemporal markings are propagated if both original stores are
55 ; marked.
56 ; CHECK-LABEL: @nontemporal(
57 ; CHECK-LABEL: if.end:
58 ; CHECK: !nontemporal
59 ; CHECK: ret void
60 define void @nontemporal(i1 zeroext %flag, ptr %p) {
61 entry:
62   br i1 %flag, label %if.then, label %if.else
64 if.then:
65   %a = load ptr, ptr %p
66   store ptr %p, ptr %a, align 8, !nontemporal !1
67   br label %if.end
69 if.else:
70   %b = load ptr, ptr %p
71   store ptr %p, ptr %b, align 8, !nontemporal !1
72   br label %if.end
74 if.end:
75   ret void
78 ; CHECK-LABEL: @nontemporal_mismatch(
79 ; CHECK-NOT: !nontemporal
80 define void @nontemporal_mismatch(i1 zeroext %flag, ptr %p) {
81 entry:
82   br i1 %flag, label %if.then, label %if.else
84 if.then:
85   %a = load ptr, ptr %p
86   store ptr %p, ptr %a, align 8
87   br label %if.end
89 if.else:
90   %b = load ptr, ptr %p
91   store ptr %p, ptr %b, align 8, !nontemporal !1
92   br label %if.end
94 if.end:
95   ret void
98 !0 = !{}
99 !1 = !{i32 1}