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