1; RUN: opt < %s -dfsan -S | FileCheck %s
2target 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"
3target triple = "x86_64-unknown-linux-gnu"
4
5; CHECK: @__dfsan_shadow_width_bits = weak_odr constant i32 [[#SBITS:]]
6; CHECK: @__dfsan_shadow_width_bytes = weak_odr constant i32 [[#SBYTES:]]
7
8define i8 @add(i8 %a, i8 %b) {
9  ; CHECK: @add.dfsan
10  ; CHECK-DAG: %[[#ALABEL:]] = load i[[#SBITS]], ptr @__dfsan_arg_tls, align [[ALIGN:2]]
11  ; CHECK-DAG: %[[#BLABEL:]] = load i[[#SBITS]], ptr inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 2) to ptr), align [[ALIGN]]
12  ; CHECK: %[[#UNION:]] = or i[[#SBITS]] %[[#ALABEL]], %[[#BLABEL]]
13  ; CHECK: %c = add i8 %a, %b
14  ; CHECK: store i[[#SBITS]] %[[#UNION]], ptr @__dfsan_retval_tls, align [[ALIGN]]
15  ; CHECK: ret i8 %c
16  %c = add i8 %a, %b
17  ret i8 %c
18}
19
20define i8 @sub(i8 %a, i8 %b) {
21  ; CHECK: @sub.dfsan
22  ; CHECK: load{{.*}}__dfsan_arg_tls
23  ; CHECK: load{{.*}}__dfsan_arg_tls
24  ; CHECK: or i[[#SBITS]]
25  ; CHECK: %c = sub i8 %a, %b
26  ; CHECK: store{{.*}}__dfsan_retval_tls
27  ; CHECK: ret i8 %c
28  %c = sub i8 %a, %b
29  ret i8 %c
30}
31
32define i8 @mul(i8 %a, i8 %b) {
33  ; CHECK: @mul.dfsan
34  ; CHECK: load{{.*}}__dfsan_arg_tls
35  ; CHECK: load{{.*}}__dfsan_arg_tls
36  ; CHECK: or i[[#SBITS]]
37  ; CHECK: %c = mul i8 %a, %b
38  ; CHECK: store{{.*}}__dfsan_retval_tls
39  ; CHECK: ret i8 %c
40  %c = mul i8 %a, %b
41  ret i8 %c
42}
43
44define i8 @sdiv(i8 %a, i8 %b) {
45  ; CHECK: @sdiv.dfsan
46  ; CHECK: load{{.*}}__dfsan_arg_tls
47  ; CHECK: load{{.*}}__dfsan_arg_tls
48  ; CHECK: or i[[#SBITS]]
49  ; CHECK: %c = sdiv i8 %a, %b
50  ; CHECK: store{{.*}}__dfsan_retval_tls
51  ; CHECK: ret i8 %c
52  %c = sdiv i8 %a, %b
53  ret i8 %c
54}
55
56define i8 @udiv(i8 %a, i8 %b) {
57  ; CHECK: @udiv.dfsan
58  ; CHECK: load{{.*}}__dfsan_arg_tls
59  ; CHECK: load{{.*}}__dfsan_arg_tls
60  ; CHECK: or i[[#SBITS]]
61  ; CHECK: %c = udiv i8 %a, %b
62  ; CHECK: store{{.*}}__dfsan_retval_tls
63  ; CHECK: ret i8 %c
64  %c = udiv i8 %a, %b
65  ret i8 %c
66}
67
68define double @fneg(double %a) {
69  ; CHECK: @fneg.dfsan
70  ; CHECK: load{{.*}}__dfsan_arg_tls
71  ; CHECK: %c = fneg double %a
72  ; CHECK: store{{.*}}__dfsan_retval_tls
73  ; CHECK: ret double %c
74  %c = fneg double %a
75  ret double %c
76}
77