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