[dfsan] Correctly handle loads and stores of zero size.
[oota-llvm.git] / test / Instrumentation / DataFlowSanitizer / load.ll
1 ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL
2 ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=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
5 define {} @load0({}* %p) {
6   ; COMBINE_PTR_LABEL: @"dfs$load0"
7   ; COMBINE_PTR_LABEL: load
8   ; COMBINE_PTR_LABEL-NOT: load
9
10   ; NO_COMBINE_PTR_LABEL: @"dfs$load0"
11   ; NO_COMBINE_PTR_LABEL: load
12   ; NO_COMBINE_PTR_LABEL-NOT: load
13   %a = load {}* %p
14   ret {} %a
15 }
16
17 define i8 @load8(i8* %p) {
18   ; COMBINE_PTR_LABEL: @"dfs$load8"
19   ; COMBINE_PTR_LABEL: load i16*
20   ; COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} to i64
21   ; COMBINE_PTR_LABEL: and i64
22   ; COMBINE_PTR_LABEL: mul i64
23   ; COMBINE_PTR_LABEL: inttoptr i64
24   ; COMBINE_PTR_LABEL: load i16*
25   ; COMBINE_PTR_LABEL: icmp ne i16
26   ; COMBINE_PTR_LABEL: call zeroext i16 @__dfsan_union
27   ; COMBINE_PTR_LABEL: load i8*
28   ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
29   ; COMBINE_PTR_LABEL: ret i8
30
31   ; NO_COMBINE_PTR_LABEL: @"dfs$load8"
32   ; NO_COMBINE_PTR_LABEL: ptrtoint i8*
33   ; NO_COMBINE_PTR_LABEL: and i64
34   ; NO_COMBINE_PTR_LABEL: mul i64
35   ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} to i16*
36   ; NO_COMBINE_PTR_LABEL: load i16*
37   ; NO_COMBINE_PTR_LABEL: load i8*
38   ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
39   ; NO_COMBINE_PTR_LABEL: ret i8
40
41   %a = load i8* %p
42   ret i8 %a
43 }
44
45 define i16 @load16(i16* %p) {
46   ; COMBINE_PTR_LABEL: @"dfs$load16"
47   ; COMBINE_PTR_LABEL: ptrtoint i16*
48   ; COMBINE_PTR_LABEL: and i64
49   ; COMBINE_PTR_LABEL: mul i64
50   ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
51   ; COMBINE_PTR_LABEL: getelementptr i16
52   ; COMBINE_PTR_LABEL: load i16*
53   ; COMBINE_PTR_LABEL: load i16*
54   ; COMBINE_PTR_LABEL: icmp ne
55   ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
56   ; COMBINE_PTR_LABEL: icmp ne i16
57   ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
58   ; COMBINE_PTR_LABEL: load i16*
59   ; COMBINE_PTR_LABEL: store {{.*}} @__dfsan_retval_tls
60   ; COMBINE_PTR_LABEL: ret i16
61
62   ; NO_COMBINE_PTR_LABEL: @"dfs$load16"
63   ; NO_COMBINE_PTR_LABEL: ptrtoint i16*
64   ; NO_COMBINE_PTR_LABEL: and i64
65   ; NO_COMBINE_PTR_LABEL: mul i64
66   ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
67   ; NO_COMBINE_PTR_LABEL: getelementptr i16*
68   ; NO_COMBINE_PTR_LABEL: load i16*
69   ; NO_COMBINE_PTR_LABEL: load i16*
70   ; NO_COMBINE_PTR_LABEL: icmp ne i16
71   ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
72   ; NO_COMBINE_PTR_LABEL: load i16*
73   ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
74   ; NO_COMBINE_PTR_LABEL: ret i16
75
76   %a = load i16* %p
77   ret i16 %a
78 }
79
80 define i32 @load32(i32* %p) {
81   ; COMBINE_PTR_LABEL: @"dfs$load32"
82   ; COMBINE_PTR_LABEL: ptrtoint i32*
83   ; COMBINE_PTR_LABEL: and i64
84   ; COMBINE_PTR_LABEL: mul i64
85   ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
86   ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
87   ; COMBINE_PTR_LABEL: load i64*
88   ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
89   ; COMBINE_PTR_LABEL: shl i64
90   ; COMBINE_PTR_LABEL: lshr i64
91   ; COMBINE_PTR_LABEL: or i64
92   ; COMBINE_PTR_LABEL: icmp eq i64
93   ; COMBINE_PTR_LABEL: icmp ne i16
94   ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
95   ; COMBINE_PTR_LABEL: load i32*
96   ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
97   ; COMBINE_PTR_LABEL: ret i32
98   ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
99
100   ; NO_COMBINE_PTR_LABEL: @"dfs$load32"
101   ; NO_COMBINE_PTR_LABEL: ptrtoint i32*
102   ; NO_COMBINE_PTR_LABEL: and i64
103   ; NO_COMBINE_PTR_LABEL: mul i64
104   ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
105   ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
106   ; NO_COMBINE_PTR_LABEL: load i64*
107   ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
108   ; NO_COMBINE_PTR_LABEL: shl i64
109   ; NO_COMBINE_PTR_LABEL: lshr i64
110   ; NO_COMBINE_PTR_LABEL: or i64
111   ; NO_COMBINE_PTR_LABEL: icmp eq i64
112   ; NO_COMBINE_PTR_LABEL: load i32*
113   ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
114   ; NO_COMBINE_PTR_LABEL: ret i32
115   ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
116   
117
118   %a = load i32* %p
119   ret i32 %a
120 }
121
122 define i64 @load64(i64* %p) {
123   ; COMBINE_PTR_LABEL: @"dfs$load64"
124   ; COMBINE_PTR_LABEL: ptrtoint i64*
125   ; COMBINE_PTR_LABEL: and i64
126   ; COMBINE_PTR_LABEL: mul i64
127   ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
128   ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
129   ; COMBINE_PTR_LABEL: load i64*
130   ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
131   ; COMBINE_PTR_LABEL: shl i64
132   ; COMBINE_PTR_LABEL: lshr i64
133   ; COMBINE_PTR_LABEL: or i64
134   ; COMBINE_PTR_LABEL: icmp eq i64
135   ; COMBINE_PTR_LABEL: icmp ne i16
136   ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
137   ; COMBINE_PTR_LABEL: load i64*
138   ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
139   ; COMBINE_PTR_LABEL: ret i64
140   ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
141   ; COMBINE_PTR_LABEL: getelementptr i64* {{.*}} i64
142   ; COMBINE_PTR_LABEL: load i64*
143   ; COMBINE_PTR_LABEL: icmp eq i64
144
145   ; NO_COMBINE_PTR_LABEL: @"dfs$load64"
146   ; NO_COMBINE_PTR_LABEL: ptrtoint i64*
147   ; NO_COMBINE_PTR_LABEL: and i64
148   ; NO_COMBINE_PTR_LABEL: mul i64
149   ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
150   ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
151   ; NO_COMBINE_PTR_LABEL: load i64*
152   ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
153   ; NO_COMBINE_PTR_LABEL: shl i64
154   ; NO_COMBINE_PTR_LABEL: lshr i64
155   ; NO_COMBINE_PTR_LABEL: or i64
156   ; NO_COMBINE_PTR_LABEL: icmp eq i64
157   ; NO_COMBINE_PTR_LABEL: load i64*
158   ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
159   ; NO_COMBINE_PTR_LABEL: ret i64
160   ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
161   ; NO_COMBINE_PTR_LABEL: getelementptr i64* {{.*}} i64
162   ; NO_COMBINE_PTR_LABEL: load i64*
163   ; NO_COMBINE_PTR_LABEL: icmp eq i64
164
165   %a = load i64* %p
166   ret i64 %a
167 }