13e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -dfsan-event-callbacks=true -S | FileCheck %s --check-prefixes=CHECK,EVENT_CALLBACKS 23e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -S | FileCheck %s --check-prefixes=CHECK,FAST 33e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_LOAD_PTR 43e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -dfsan-combine-pointer-labels-on-store=true -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR 53e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -dfsan-debug-nonzero-labels -S | FileCheck %s --check-prefixes=CHECK,DEBUG_NONZERO_LABELS 6ea981165SJianzhou Zhaotarget 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" 7ea981165SJianzhou Zhaotarget triple = "x86_64-unknown-linux-gnu" 8ea981165SJianzhou Zhao 946f52fb6SGeorge Balatsouras; CHECK: @__dfsan_arg_tls = external thread_local(initialexec) global [[TLS_ARR:\[100 x i64\]]] 1046f52fb6SGeorge Balatsouras; CHECK: @__dfsan_retval_tls = external thread_local(initialexec) global [[TLS_ARR]] 11ea981165SJianzhou Zhaodefine [4 x i8] @pass_array([4 x i8] %a) { 12c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR: @pass_array.dfsan 13*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: %1 = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]] 14*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: store [4 x i8] %1, ptr @__dfsan_retval_tls, align [[ALIGN]] 15ea981165SJianzhou Zhao 16c6b5a25eSGeorge Balatsouras ; DEBUG_NONZERO_LABELS: @pass_array.dfsan 17*ecb85b5cSFangrui Song ; DEBUG_NONZERO_LABELS: [[L:%.*]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]] 18*ecb85b5cSFangrui Song ; DEBUG_NONZERO_LABELS: [[L0:%.*]] = extractvalue [4 x i8] [[L]], 0 19*ecb85b5cSFangrui Song ; DEBUG_NONZERO_LABELS: [[L1:%.*]] = extractvalue [4 x i8] [[L]], 1 20*ecb85b5cSFangrui Song ; DEBUG_NONZERO_LABELS: [[L01:%.*]] = or i8 [[L0]], [[L1]] 21*ecb85b5cSFangrui Song ; DEBUG_NONZERO_LABELS: [[L2:%.*]] = extractvalue [4 x i8] [[L]], 2 22*ecb85b5cSFangrui Song ; DEBUG_NONZERO_LABELS: [[L012:%.*]] = or i8 [[L01]], [[L2]] 23*ecb85b5cSFangrui Song ; DEBUG_NONZERO_LABELS: [[L3:%.*]] = extractvalue [4 x i8] [[L]], 3 24*ecb85b5cSFangrui Song ; DEBUG_NONZERO_LABELS: [[L0123:%.*]] = or i8 [[L012]], [[L3]] 25*ecb85b5cSFangrui Song ; DEBUG_NONZERO_LABELS: {{.*}} = icmp ne i8 [[L0123]], 0 26ea981165SJianzhou Zhao ; DEBUG_NONZERO_LABELS: call void @__dfsan_nonzero_label() 27ea981165SJianzhou Zhao 28ea981165SJianzhou Zhao ret [4 x i8] %a 29ea981165SJianzhou Zhao} 30ea981165SJianzhou Zhao 3166c3444fSMatt Arsenault%ArrayOfStruct = type [4 x {ptr, i32}] 32ea981165SJianzhou Zhao 33ea981165SJianzhou Zhaodefine %ArrayOfStruct @pass_array_of_struct(%ArrayOfStruct %as) { 34c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR: @pass_array_of_struct.dfsan 35*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: %1 = load [4 x { i8, i8 }], ptr @__dfsan_arg_tls, align [[ALIGN:2]] 36*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: store [4 x { i8, i8 }] %1, ptr @__dfsan_retval_tls, align [[ALIGN]] 37ea981165SJianzhou Zhao 38ea981165SJianzhou Zhao ret %ArrayOfStruct %as 39ea981165SJianzhou Zhao} 40ea981165SJianzhou Zhao 4166c3444fSMatt Arsenaultdefine ptr @alloca_ret_array() { 42c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR: @alloca_ret_array.dfsan 43*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: store i8 0, ptr @__dfsan_retval_tls, align 2 44ea981165SJianzhou Zhao %p = alloca [4 x i1] 4566c3444fSMatt Arsenault ret ptr %p 46ea981165SJianzhou Zhao} 47ea981165SJianzhou Zhao 48ea981165SJianzhou Zhaodefine [4 x i1] @load_alloca_array() { 49c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR-LABEL: @load_alloca_array.dfsan 50*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R:]] = alloca i8, align 1 5146f52fb6SGeorge Balatsouras ; NO_COMBINE_LOAD_PTR-NEXT: %p = alloca [4 x i1] 52*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+1]] = load i8, ptr %[[#R]], align 1 53*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+2]] = insertvalue [4 x i8] undef, i8 %[[#R+1]], 0 54*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+3]] = insertvalue [4 x i8] %[[#R+2]], i8 %[[#R+1]], 1 55*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+4]] = insertvalue [4 x i8] %[[#R+3]], i8 %[[#R+1]], 2 56*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+5]] = insertvalue [4 x i8] %[[#R+4]], i8 %[[#R+1]], 3 5766c3444fSMatt Arsenault ; NO_COMBINE_LOAD_PTR-NEXT: %a = load [4 x i1], ptr %p 58*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-NEXT: store [4 x i8] %[[#R+5]], ptr @__dfsan_retval_tls, align 2 5946f52fb6SGeorge Balatsouras ; NO_COMBINE_LOAD_PTR-NEXT: ret [4 x i1] %a 6046f52fb6SGeorge Balatsouras 61ea981165SJianzhou Zhao %p = alloca [4 x i1] 6266c3444fSMatt Arsenault %a = load [4 x i1], ptr %p 63ea981165SJianzhou Zhao ret [4 x i1] %a 64ea981165SJianzhou Zhao} 65ea981165SJianzhou Zhao 6666c3444fSMatt Arsenaultdefine [0 x i1] @load_array0(ptr %p) { 67c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR: @load_array0.dfsan 68*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: store [0 x i8] zeroinitializer, ptr @__dfsan_retval_tls, align 2 6966c3444fSMatt Arsenault %a = load [0 x i1], ptr %p 70ea981165SJianzhou Zhao ret [0 x i1] %a 71ea981165SJianzhou Zhao} 72ea981165SJianzhou Zhao 7366c3444fSMatt Arsenaultdefine [1 x i1] @load_array1(ptr %p) { 74c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR: @load_array1.dfsan 75*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[L:%.*]] = load i8, 76*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[S:%.*]] = insertvalue [1 x i8] undef, i8 [[L]], 0 77*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: store [1 x i8] [[S]], ptr @__dfsan_retval_tls, align 2 78ea981165SJianzhou Zhao 79c6b5a25eSGeorge Balatsouras ; EVENT_CALLBACKS: @load_array1.dfsan 80*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: [[L:%.*]] = or i8 81*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[L]], ptr {{.*}}) 82ea981165SJianzhou Zhao 83c6b5a25eSGeorge Balatsouras ; FAST: @load_array1.dfsan 84*ecb85b5cSFangrui Song ; FAST: [[P:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]] 85*ecb85b5cSFangrui Song ; FAST: [[L:%.*]] = load i8, ptr {{.*}}, align 1 86*ecb85b5cSFangrui Song ; FAST: [[U:%.*]] = or i8 [[L]], [[P]] 87*ecb85b5cSFangrui Song ; FAST: [[S1:%.*]] = insertvalue [1 x i8] undef, i8 [[U]], 0 88*ecb85b5cSFangrui Song ; FAST: store [1 x i8] [[S1]], ptr @__dfsan_retval_tls, align [[ALIGN]] 89ea981165SJianzhou Zhao 9066c3444fSMatt Arsenault %a = load [1 x i1], ptr %p 91ea981165SJianzhou Zhao ret [1 x i1] %a 92ea981165SJianzhou Zhao} 93ea981165SJianzhou Zhao 9466c3444fSMatt Arsenaultdefine [2 x i1] @load_array2(ptr %p) { 95c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR: @load_array2.dfsan 96*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[P1:%.*]] = getelementptr i8, ptr [[P0:%.*]], i64 1 97*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-DAG: [[E1:%.*]] = load i8, ptr [[P1]], align 1 98*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-DAG: [[E0:%.*]] = load i8, ptr [[P0]], align 1 99*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[U:%.*]] = or i8 [[E0]], [[E1]] 100*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[S1:%.*]] = insertvalue [2 x i8] undef, i8 [[U]], 0 101*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[S2:%.*]] = insertvalue [2 x i8] [[S1]], i8 [[U]], 1 102*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: store [2 x i8] [[S2]], ptr @__dfsan_retval_tls, align [[ALIGN:2]] 103ea981165SJianzhou Zhao 104c6b5a25eSGeorge Balatsouras ; EVENT_CALLBACKS: @load_array2.dfsan 105*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: [[O1:%.*]] = or i8 106*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: [[O2:%.*]] = or i8 [[O1]] 107*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[O2]], ptr {{.*}}) 108ea981165SJianzhou Zhao 109c6b5a25eSGeorge Balatsouras ; FAST: @load_array2.dfsan 110*ecb85b5cSFangrui Song ; FAST: [[P:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]] 111*ecb85b5cSFangrui Song ; FAST: [[O:%.*]] = or i8 112*ecb85b5cSFangrui Song ; FAST: [[U:%.*]] = or i8 [[O]], [[P]] 113*ecb85b5cSFangrui Song ; FAST: [[S:%.*]] = insertvalue [2 x i8] undef, i8 [[U]], 0 114*ecb85b5cSFangrui Song ; FAST: [[S1:%.*]] = insertvalue [2 x i8] [[S]], i8 [[U]], 1 115*ecb85b5cSFangrui Song ; FAST: store [2 x i8] [[S1]], ptr @__dfsan_retval_tls, align [[ALIGN]] 11666c3444fSMatt Arsenault %a = load [2 x i1], ptr %p 117ea981165SJianzhou Zhao ret [2 x i1] %a 118ea981165SJianzhou Zhao} 119ea981165SJianzhou Zhao 12066c3444fSMatt Arsenaultdefine [4 x i1] @load_array4(ptr %p) { 121c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR: @load_array4.dfsan 122*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[T:%.*]] = trunc i32 {{.*}} to i8 123*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[S1:%.*]] = insertvalue [4 x i8] undef, i8 [[T]], 0 124*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[S2:%.*]] = insertvalue [4 x i8] [[S1]], i8 [[T]], 1 125*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[S3:%.*]] = insertvalue [4 x i8] [[S2]], i8 [[T]], 2 126*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[S4:%.*]] = insertvalue [4 x i8] [[S3]], i8 [[T]], 3 127*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: store [4 x i8] [[S4]], ptr @__dfsan_retval_tls, align 2 128ea981165SJianzhou Zhao 129c6b5a25eSGeorge Balatsouras ; EVENT_CALLBACKS: @load_array4.dfsan 130*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: [[O0:%.*]] = or i32 131*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: [[O1:%.*]] = or i32 [[O0]] 132*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: [[O2:%.*]] = trunc i32 [[O1]] to i8 133*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: [[O3:%.*]] = or i8 [[O2]] 134*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[O3]], ptr {{.*}}) 135ea981165SJianzhou Zhao 136c6b5a25eSGeorge Balatsouras ; FAST: @load_array4.dfsan 137*ecb85b5cSFangrui Song ; FAST: [[T:%.*]] = trunc i32 {{.*}} to i8 138*ecb85b5cSFangrui Song ; FAST: [[O:%.*]] = or i8 [[T]] 139*ecb85b5cSFangrui Song ; FAST: [[S1:%.*]] = insertvalue [4 x i8] undef, i8 [[O]], 0 140*ecb85b5cSFangrui Song ; FAST: [[S2:%.*]] = insertvalue [4 x i8] [[S1]], i8 [[O]], 1 141*ecb85b5cSFangrui Song ; FAST: [[S3:%.*]] = insertvalue [4 x i8] [[S2]], i8 [[O]], 2 142*ecb85b5cSFangrui Song ; FAST: [[S4:%.*]] = insertvalue [4 x i8] [[S3]], i8 [[O]], 3 143*ecb85b5cSFangrui Song ; FAST: store [4 x i8] [[S4]], ptr @__dfsan_retval_tls, align 2 144ea981165SJianzhou Zhao 14566c3444fSMatt Arsenault %a = load [4 x i1], ptr %p 146ea981165SJianzhou Zhao ret [4 x i1] %a 147ea981165SJianzhou Zhao} 148ea981165SJianzhou Zhao 149ea981165SJianzhou Zhaodefine i1 @extract_array([4 x i1] %a) { 150c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR: @extract_array.dfsan 151*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[AM:%.*]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]] 152*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[EM:%.*]] = extractvalue [4 x i8] [[AM]], 2 153*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: store i8 [[EM]], ptr @__dfsan_retval_tls, align 2 154ea981165SJianzhou Zhao %e2 = extractvalue [4 x i1] %a, 2 155ea981165SJianzhou Zhao ret i1 %e2 156ea981165SJianzhou Zhao} 157ea981165SJianzhou Zhao 158ea981165SJianzhou Zhaodefine [4 x i1] @insert_array([4 x i1] %a, i1 %e2) { 159c6b5a25eSGeorge Balatsouras ; NO_COMBINE_LOAD_PTR: @insert_array.dfsan 160*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[EM:%.*]] = load i8, ptr 161*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR-SAME: inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 4) to ptr), align [[ALIGN:2]] 162*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[AM:%.*]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN]] 163*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: [[AM1:%.*]] = insertvalue [4 x i8] [[AM]], i8 [[EM]], 0 164*ecb85b5cSFangrui Song ; NO_COMBINE_LOAD_PTR: store [4 x i8] [[AM1]], ptr @__dfsan_retval_tls, align [[ALIGN]] 165ea981165SJianzhou Zhao %a1 = insertvalue [4 x i1] %a, i1 %e2, 0 166ea981165SJianzhou Zhao ret [4 x i1] %a1 167ea981165SJianzhou Zhao} 168ea981165SJianzhou Zhao 169ea981165SJianzhou Zhaodefine void @store_alloca_array([4 x i1] %a) { 170c6b5a25eSGeorge Balatsouras ; FAST: @store_alloca_array.dfsan 171*ecb85b5cSFangrui Song ; FAST: [[S:%.*]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]] 172*ecb85b5cSFangrui Song ; FAST: [[SP:%.*]] = alloca i8, align 1 173*ecb85b5cSFangrui Song ; FAST: [[E0:%.*]] = extractvalue [4 x i8] [[S]], 0 174*ecb85b5cSFangrui Song ; FAST: [[E1:%.*]] = extractvalue [4 x i8] [[S]], 1 175*ecb85b5cSFangrui Song ; FAST: [[E01:%.*]] = or i8 [[E0]], [[E1]] 176*ecb85b5cSFangrui Song ; FAST: [[E2:%.*]] = extractvalue [4 x i8] [[S]], 2 177*ecb85b5cSFangrui Song ; FAST: [[E012:%.*]] = or i8 [[E01]], [[E2]] 178*ecb85b5cSFangrui Song ; FAST: [[E3:%.*]] = extractvalue [4 x i8] [[S]], 3 179*ecb85b5cSFangrui Song ; FAST: [[E0123:%.*]] = or i8 [[E012]], [[E3]] 180*ecb85b5cSFangrui Song ; FAST: store i8 [[E0123]], ptr [[SP]], align 1 181ea981165SJianzhou Zhao %p = alloca [4 x i1] 18266c3444fSMatt Arsenault store [4 x i1] %a, ptr %p 183ea981165SJianzhou Zhao ret void 184ea981165SJianzhou Zhao} 185ea981165SJianzhou Zhao 18666c3444fSMatt Arsenaultdefine void @store_zero_array(ptr %p) { 187c6b5a25eSGeorge Balatsouras ; FAST: @store_zero_array.dfsan 188*ecb85b5cSFangrui Song ; FAST: store i32 0, ptr {{.*}} 18966c3444fSMatt Arsenault store [4 x i1] zeroinitializer, ptr %p 190ea981165SJianzhou Zhao ret void 191ea981165SJianzhou Zhao} 192ea981165SJianzhou Zhao 19366c3444fSMatt Arsenaultdefine void @store_array2([2 x i1] %a, ptr %p) { 194c6b5a25eSGeorge Balatsouras ; EVENT_CALLBACKS: @store_array2.dfsan 195*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: [[E12:%.*]] = or i8 196*ecb85b5cSFangrui Song ; EVENT_CALLBACKS: call void @__dfsan_store_callback(i8 zeroext [[E12]], ptr %p) 197ea981165SJianzhou Zhao 198c6b5a25eSGeorge Balatsouras ; FAST: @store_array2.dfsan 199*ecb85b5cSFangrui Song ; FAST: [[S:%.*]] = load [2 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]] 200*ecb85b5cSFangrui Song ; FAST: [[E1:%.*]] = extractvalue [2 x i8] [[S]], 0 201*ecb85b5cSFangrui Song ; FAST: [[E2:%.*]] = extractvalue [2 x i8] [[S]], 1 202*ecb85b5cSFangrui Song ; FAST: [[E12:%.*]] = or i8 [[E1]], [[E2]] 203*ecb85b5cSFangrui Song ; FAST: [[SP0:%.*]] = getelementptr i8, ptr [[SP:%.*]], i32 0 204*ecb85b5cSFangrui Song ; FAST: store i8 [[E12]], ptr [[SP0]], align 1 205*ecb85b5cSFangrui Song ; FAST: [[SP1:%.*]] = getelementptr i8, ptr [[SP]], i32 1 206*ecb85b5cSFangrui Song ; FAST: store i8 [[E12]], ptr [[SP1]], align 1 207ea981165SJianzhou Zhao 208c6b5a25eSGeorge Balatsouras ; COMBINE_STORE_PTR: @store_array2.dfsan 209*ecb85b5cSFangrui Song ; COMBINE_STORE_PTR: [[O:%.*]] = or i8 210*ecb85b5cSFangrui Song ; COMBINE_STORE_PTR: [[U:%.*]] = or i8 [[O]] 211*ecb85b5cSFangrui Song ; COMBINE_STORE_PTR: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 0 212*ecb85b5cSFangrui Song ; COMBINE_STORE_PTR: store i8 [[U]], ptr [[P1]], align 1 213*ecb85b5cSFangrui Song ; COMBINE_STORE_PTR: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 1 214*ecb85b5cSFangrui Song ; COMBINE_STORE_PTR: store i8 [[U]], ptr [[P2]], align 1 215ea981165SJianzhou Zhao 21666c3444fSMatt Arsenault store [2 x i1] %a, ptr %p 217ea981165SJianzhou Zhao ret void 218ea981165SJianzhou Zhao} 219ea981165SJianzhou Zhao 22066c3444fSMatt Arsenaultdefine void @store_array17([17 x i1] %a, ptr %p) { 221c6b5a25eSGeorge Balatsouras ; FAST: @store_array17.dfsan 222*ecb85b5cSFangrui Song ; FAST: %[[#R:]] = load [17 x i8], ptr @__dfsan_arg_tls, align 2 223*ecb85b5cSFangrui Song ; FAST: %[[#R+1]] = extractvalue [17 x i8] %[[#R]], 0 224*ecb85b5cSFangrui Song ; FAST: %[[#R+2]] = extractvalue [17 x i8] %[[#R]], 1 225*ecb85b5cSFangrui Song ; FAST: %[[#R+3]] = or i8 %[[#R+1]], %[[#R+2]] 226*ecb85b5cSFangrui Song ; FAST: %[[#R+4]] = extractvalue [17 x i8] %[[#R]], 2 227*ecb85b5cSFangrui Song ; FAST: %[[#R+5]] = or i8 %[[#R+3]], %[[#R+4]] 228*ecb85b5cSFangrui Song ; FAST: %[[#R+6]] = extractvalue [17 x i8] %[[#R]], 3 229*ecb85b5cSFangrui Song ; FAST: %[[#R+7]] = or i8 %[[#R+5]], %[[#R+6]] 230*ecb85b5cSFangrui Song ; FAST: %[[#R+8]] = extractvalue [17 x i8] %[[#R]], 4 231*ecb85b5cSFangrui Song ; FAST: %[[#R+9]] = or i8 %[[#R+7]], %[[#R+8]] 232*ecb85b5cSFangrui Song ; FAST: %[[#R+10]] = extractvalue [17 x i8] %[[#R]], 5 233*ecb85b5cSFangrui Song ; FAST: %[[#R+11]] = or i8 %[[#R+9]], %[[#R+10]] 234*ecb85b5cSFangrui Song ; FAST: %[[#R+12]] = extractvalue [17 x i8] %[[#R]], 6 235*ecb85b5cSFangrui Song ; FAST: %[[#R+13]] = or i8 %[[#R+11]], %[[#R+12]] 236*ecb85b5cSFangrui Song ; FAST: %[[#R+14]] = extractvalue [17 x i8] %[[#R]], 7 237*ecb85b5cSFangrui Song ; FAST: %[[#R+15]] = or i8 %[[#R+13]], %[[#R+14]] 238*ecb85b5cSFangrui Song ; FAST: %[[#R+16]] = extractvalue [17 x i8] %[[#R]], 8 239*ecb85b5cSFangrui Song ; FAST: %[[#R+17]] = or i8 %[[#R+15]], %[[#R+16]] 240*ecb85b5cSFangrui Song ; FAST: %[[#R+18]] = extractvalue [17 x i8] %[[#R]], 9 241*ecb85b5cSFangrui Song ; FAST: %[[#R+19]] = or i8 %[[#R+17]], %[[#R+18]] 242*ecb85b5cSFangrui Song ; FAST: %[[#R+20]] = extractvalue [17 x i8] %[[#R]], 10 243*ecb85b5cSFangrui Song ; FAST: %[[#R+21]] = or i8 %[[#R+19]], %[[#R+20]] 244*ecb85b5cSFangrui Song ; FAST: %[[#R+22]] = extractvalue [17 x i8] %[[#R]], 11 245*ecb85b5cSFangrui Song ; FAST: %[[#R+23]] = or i8 %[[#R+21]], %[[#R+22]] 246*ecb85b5cSFangrui Song ; FAST: %[[#R+24]] = extractvalue [17 x i8] %[[#R]], 12 247*ecb85b5cSFangrui Song ; FAST: %[[#R+25]] = or i8 %[[#R+23]], %[[#R+24]] 248*ecb85b5cSFangrui Song ; FAST: %[[#R+26]] = extractvalue [17 x i8] %[[#R]], 13 249*ecb85b5cSFangrui Song ; FAST: %[[#R+27]] = or i8 %[[#R+25]], %[[#R+26]] 250*ecb85b5cSFangrui Song ; FAST: %[[#R+28]] = extractvalue [17 x i8] %[[#R]], 14 251*ecb85b5cSFangrui Song ; FAST: %[[#R+29]] = or i8 %[[#R+27]], %[[#R+28]] 252*ecb85b5cSFangrui Song ; FAST: %[[#R+30]] = extractvalue [17 x i8] %[[#R]], 15 253*ecb85b5cSFangrui Song ; FAST: %[[#R+31]] = or i8 %[[#R+29]], %[[#R+30]] 254*ecb85b5cSFangrui Song ; FAST: %[[#R+32]] = extractvalue [17 x i8] %[[#R]], 16 255*ecb85b5cSFangrui Song ; FAST: %[[#R+33]] = or i8 %[[#R+31]], %[[#R+32]] 256*ecb85b5cSFangrui Song ; FAST: %[[#VREG:]] = insertelement <8 x i8> poison, i8 %[[#R+33]], i32 0 257*ecb85b5cSFangrui Song ; FAST: %[[#VREG+1]] = insertelement <8 x i8> %[[#VREG]], i8 %[[#R+33]], i32 1 258*ecb85b5cSFangrui Song ; FAST: %[[#VREG+2]] = insertelement <8 x i8> %[[#VREG+1]], i8 %[[#R+33]], i32 2 259*ecb85b5cSFangrui Song ; FAST: %[[#VREG+3]] = insertelement <8 x i8> %[[#VREG+2]], i8 %[[#R+33]], i32 3 260*ecb85b5cSFangrui Song ; FAST: %[[#VREG+4]] = insertelement <8 x i8> %[[#VREG+3]], i8 %[[#R+33]], i32 4 261*ecb85b5cSFangrui Song ; FAST: %[[#VREG+5]] = insertelement <8 x i8> %[[#VREG+4]], i8 %[[#R+33]], i32 5 262*ecb85b5cSFangrui Song ; FAST: %[[#VREG+6]] = insertelement <8 x i8> %[[#VREG+5]], i8 %[[#R+33]], i32 6 263*ecb85b5cSFangrui Song ; FAST: %[[#VREG+7]] = insertelement <8 x i8> %[[#VREG+6]], i8 %[[#R+33]], i32 7 264*ecb85b5cSFangrui Song ; FAST: %[[#VREG+8]] = getelementptr <8 x i8>, ptr %[[P:.*]], i32 0 265*ecb85b5cSFangrui Song ; FAST: store <8 x i8> %[[#VREG+7]], ptr %[[#VREG+8]], align 1 266*ecb85b5cSFangrui Song ; FAST: %[[#VREG+9]] = getelementptr <8 x i8>, ptr %[[P]], i32 1 267*ecb85b5cSFangrui Song ; FAST: store <8 x i8> %[[#VREG+7]], ptr %[[#VREG+9]], align 1 268*ecb85b5cSFangrui Song ; FAST: %[[#VREG+10]] = getelementptr i8, ptr %[[P]], i32 16 269*ecb85b5cSFangrui Song ; FAST: store i8 %[[#R+33]], ptr %[[#VREG+10]], align 1 27066c3444fSMatt Arsenault store [17 x i1] %a, ptr %p 271ea981165SJianzhou Zhao ret void 272ea981165SJianzhou Zhao} 273ea981165SJianzhou Zhao 274ea981165SJianzhou Zhaodefine [2 x i32] @const_array() { 275c6b5a25eSGeorge Balatsouras ; FAST: @const_array.dfsan 276*ecb85b5cSFangrui Song ; FAST: store [2 x i8] zeroinitializer, ptr @__dfsan_retval_tls, align 2 277ea981165SJianzhou Zhao ret [2 x i32] [ i32 42, i32 11 ] 278ea981165SJianzhou Zhao} 279ea981165SJianzhou Zhao 280ea981165SJianzhou Zhaodefine [4 x i8] @call_array([4 x i8] %a) { 281c6b5a25eSGeorge Balatsouras ; FAST-LABEL: @call_array.dfsan 282*ecb85b5cSFangrui Song ; FAST: %[[#R:]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]] 283*ecb85b5cSFangrui Song ; FAST: store [4 x i8] %[[#R]], ptr @__dfsan_arg_tls, align [[ALIGN]] 284*ecb85b5cSFangrui Song ; FAST: %_dfsret = load [4 x i8], ptr @__dfsan_retval_tls, align [[ALIGN]] 285*ecb85b5cSFangrui Song ; FAST: store [4 x i8] %_dfsret, ptr @__dfsan_retval_tls, align [[ALIGN]] 286ea981165SJianzhou Zhao 287ea981165SJianzhou Zhao %r = call [4 x i8] @pass_array([4 x i8] %a) 288ea981165SJianzhou Zhao ret [4 x i8] %r 289ea981165SJianzhou Zhao} 290ea981165SJianzhou Zhao 291ea981165SJianzhou Zhao%LargeArr = type [1000 x i8] 292ea981165SJianzhou Zhao 293ea981165SJianzhou Zhaodefine i8 @fun_with_large_args(i1 %i, %LargeArr %a) { 294c6b5a25eSGeorge Balatsouras ; FAST: @fun_with_large_args.dfsan 295*ecb85b5cSFangrui Song ; FAST: store i8 0, ptr @__dfsan_retval_tls, align 2 296ea981165SJianzhou Zhao %r = extractvalue %LargeArr %a, 0 297ea981165SJianzhou Zhao ret i8 %r 298ea981165SJianzhou Zhao} 299ea981165SJianzhou Zhao 300ea981165SJianzhou Zhaodefine %LargeArr @fun_with_large_ret() { 301c6b5a25eSGeorge Balatsouras ; FAST: @fun_with_large_ret.dfsan 302d10f173fSGeorge Balatsouras ; FAST-NEXT: ret [1000 x i8] zeroinitializer 303ea981165SJianzhou Zhao ret %LargeArr zeroinitializer 304ea981165SJianzhou Zhao} 305ea981165SJianzhou Zhao 306ea981165SJianzhou Zhaodefine i8 @call_fun_with_large_ret() { 307c6b5a25eSGeorge Balatsouras ; FAST: @call_fun_with_large_ret.dfsan 308*ecb85b5cSFangrui Song ; FAST: store i8 0, ptr @__dfsan_retval_tls, align 2 309ea981165SJianzhou Zhao %r = call %LargeArr @fun_with_large_ret() 310ea981165SJianzhou Zhao %e = extractvalue %LargeArr %r, 0 311ea981165SJianzhou Zhao ret i8 %e 312ea981165SJianzhou Zhao} 313ea981165SJianzhou Zhao 314ea981165SJianzhou Zhaodefine i8 @call_fun_with_large_args(i1 %i, %LargeArr %a) { 315c6b5a25eSGeorge Balatsouras ; FAST: @call_fun_with_large_args.dfsan 316*ecb85b5cSFangrui Song ; FAST: [[I:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]] 317*ecb85b5cSFangrui Song ; FAST: store i8 [[I]], ptr @__dfsan_arg_tls, align [[ALIGN]] 318c6b5a25eSGeorge Balatsouras ; FAST: %r = call i8 @fun_with_large_args.dfsan(i1 %i, [1000 x i8] %a) 319ea981165SJianzhou Zhao 320ea981165SJianzhou Zhao %r = call i8 @fun_with_large_args(i1 %i, %LargeArr %a) 321ea981165SJianzhou Zhao ret i8 %r 322ea981165SJianzhou Zhao} 323