1 ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL
2 ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=0 -S | FileCheck %s --check-prefix=NO_COMBINE_PTR_LABEL
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
4 target triple = "x86_64-unknown-linux-gnu"
6 define void @store0({} %v, {}* %p) {
7 ; COMBINE_PTR_LABEL: @"dfs$store0"
8 ; COMBINE_PTR_LABEL: store
9 ; COMBINE_PTR_LABEL-NOT: store
11 ; NO_COMBINE_PTR_LABEL: @"dfs$store0"
12 ; NO_COMBINE_PTR_LABEL: store
13 ; NO_COMBINE_PTR_LABEL-NOT: store
19 define void @store8(i8 %v, i8* %p) {
20 ; NO_COMBINE_PTR_LABEL: @"dfs$store8"
21 ; NO_COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
22 ; NO_COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} i64
23 ; NO_COMBINE_PTR_LABEL: and i64
24 ; NO_COMBINE_PTR_LABEL: mul i64
25 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
26 ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
27 ; NO_COMBINE_PTR_LABEL: store i16
28 ; NO_COMBINE_PTR_LABEL: store i8
30 ; COMBINE_PTR_LABEL: @"dfs$store8"
31 ; COMBINE_PTR_LABEL: load i16, i16*
32 ; COMBINE_PTR_LABEL: load i16, i16*
33 ; COMBINE_PTR_LABEL: icmp ne i16
34 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
35 ; COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} i64
36 ; COMBINE_PTR_LABEL: and i64
37 ; COMBINE_PTR_LABEL: mul i64
38 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
39 ; COMBINE_PTR_LABEL: getelementptr i16, i16*
40 ; COMBINE_PTR_LABEL: store i16
41 ; COMBINE_PTR_LABEL: store i8
47 define void @store16(i16 %v, i16* %p) {
48 ; NO_COMBINE_PTR_LABEL: @"dfs$store16"
49 ; NO_COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
50 ; NO_COMBINE_PTR_LABEL: ptrtoint i16* {{.*}} i64
51 ; NO_COMBINE_PTR_LABEL: and i64
52 ; NO_COMBINE_PTR_LABEL: mul i64
53 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
54 ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
55 ; NO_COMBINE_PTR_LABEL: store i16
56 ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
57 ; NO_COMBINE_PTR_LABEL: store i16
58 ; NO_COMBINE_PTR_LABEL: store i16
60 ; COMBINE_PTR_LABEL: @"dfs$store16"
61 ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
62 ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
63 ; COMBINE_PTR_LABEL: icmp ne i16
64 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
65 ; COMBINE_PTR_LABEL: ptrtoint i16* {{.*}} i64
66 ; COMBINE_PTR_LABEL: and i64
67 ; COMBINE_PTR_LABEL: mul i64
68 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
69 ; COMBINE_PTR_LABEL: getelementptr i16, i16*
70 ; COMBINE_PTR_LABEL: store i16
71 ; COMBINE_PTR_LABEL: getelementptr i16, i16*
72 ; COMBINE_PTR_LABEL: store i16
73 ; COMBINE_PTR_LABEL: store i16
79 define void @store32(i32 %v, i32* %p) {
80 ; NO_COMBINE_PTR_LABEL: @"dfs$store32"
81 ; NO_COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
82 ; NO_COMBINE_PTR_LABEL: ptrtoint i32* {{.*}} i64
83 ; NO_COMBINE_PTR_LABEL: and i64
84 ; NO_COMBINE_PTR_LABEL: mul i64
85 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
86 ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
87 ; NO_COMBINE_PTR_LABEL: store i16
88 ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
89 ; NO_COMBINE_PTR_LABEL: store i16
90 ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
91 ; NO_COMBINE_PTR_LABEL: store i16
92 ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
93 ; NO_COMBINE_PTR_LABEL: store i16
94 ; NO_COMBINE_PTR_LABEL: store i32
96 ; COMBINE_PTR_LABEL: @"dfs$store32"
97 ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
98 ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
99 ; COMBINE_PTR_LABEL: icmp ne i16
100 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
101 ; COMBINE_PTR_LABEL: ptrtoint i32* {{.*}} i64
102 ; COMBINE_PTR_LABEL: and i64
103 ; COMBINE_PTR_LABEL: mul i64
104 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
105 ; COMBINE_PTR_LABEL: getelementptr i16, i16*
106 ; COMBINE_PTR_LABEL: store i16
107 ; COMBINE_PTR_LABEL: getelementptr i16, i16*
108 ; COMBINE_PTR_LABEL: store i16
109 ; COMBINE_PTR_LABEL: getelementptr i16, i16*
110 ; COMBINE_PTR_LABEL: store i16
111 ; COMBINE_PTR_LABEL: getelementptr i16, i16*
112 ; COMBINE_PTR_LABEL: store i16
113 ; COMBINE_PTR_LABEL: store i32
115 store i32 %v, i32* %p
119 define void @store64(i64 %v, i64* %p) {
120 ; NO_COMBINE_PTR_LABEL: @"dfs$store64"
121 ; NO_COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
122 ; NO_COMBINE_PTR_LABEL: ptrtoint i64* {{.*}} i64
123 ; NO_COMBINE_PTR_LABEL: and i64
124 ; NO_COMBINE_PTR_LABEL: mul i64
125 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
126 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
127 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
128 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
129 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
130 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
131 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
132 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
133 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
134 ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} <8 x i16>*
135 ; NO_COMBINE_PTR_LABEL: store i64
137 ; COMBINE_PTR_LABEL: @"dfs$store64"
138 ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
139 ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
140 ; COMBINE_PTR_LABEL: icmp ne i16
141 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
142 ; COMBINE_PTR_LABEL: ptrtoint i64* {{.*}} i64
143 ; COMBINE_PTR_LABEL: and i64
144 ; COMBINE_PTR_LABEL: mul i64
145 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
146 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
147 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
148 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
149 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
150 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
151 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
152 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
153 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
154 ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} <8 x i16>*
155 ; COMBINE_PTR_LABEL: store <8 x i16>
156 ; COMBINE_PTR_LABEL: store i64
158 store i64 %v, i64* %p