1; RUN: opt < %s -passes=dfsan -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefixes=CHECK,COMBINE_PTR_LABEL 2; RUN: opt < %s -passes=dfsan -dfsan-combine-pointer-labels-on-store=0 -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_PTR_LABEL 3target 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" 4target triple = "x86_64-unknown-linux-gnu" 5 6define void @store0({} %v, ptr %p) { 7 ; CHECK-LABEL: @store0.dfsan 8 ; CHECK: store {} %v, ptr %p 9 ; CHECK-NOT: store 10 ; CHECK: ret void 11 12 store {} %v, ptr %p 13 ret void 14} 15 16define void @store8(i8 %v, ptr %p) { 17 ; CHECK-LABEL: @store8.dfsan 18 ; NO_COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls 19 ; COMBINE_PTR_LABEL: load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 2) to ptr), align 2 20 21 ; COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls 22 ; COMBINE_PTR_LABEL: or i8 23 ; CHECK: ptrtoint ptr {{.*}} i64 24 ; CHECK-NEXT: xor i64 25 ; CHECK-NEXT: inttoptr i64 {{.*}} ptr 26 ; CHECK-NEXT: getelementptr i8, ptr 27 ; CHECK-NEXT: store i8 28 ; CHECK-NEXT: store i8 %v, ptr %p 29 ; CHECK-NEXT: ret void 30 31 store i8 %v, ptr %p 32 ret void 33} 34 35define void @store16(i16 %v, ptr %p) { 36 ; CHECK-LABEL: @store16.dfsan 37 ; NO_COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls 38 ; COMBINE_PTR_LABEL: load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 2) to ptr), align 2 39 ; COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls 40 ; COMBINE_PTR_LABEL: or i8 41 ; CHECK: ptrtoint ptr {{.*}} i64 42 ; CHECK-NEXT: xor i64 43 ; CHECK-NEXT: inttoptr i64 {{.*}} ptr 44 ; CHECK-NEXT: getelementptr i8, ptr 45 ; CHECK-NEXT: store i8 46 ; CHECK-NEXT: getelementptr i8, ptr 47 ; CHECK-NEXT: store i8 48 ; CHECK-NEXT: store i16 %v, ptr %p 49 ; CHECK-NEXT: ret void 50 51 store i16 %v, ptr %p 52 ret void 53} 54 55define void @store32(i32 %v, ptr %p) { 56 ; CHECK-LABEL: @store32.dfsan 57 ; NO_COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls 58 ; COMBINE_PTR_LABEL: load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 2) to ptr), align 2 59 ; COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls 60 ; COMBINE_PTR_LABEL: or i8 61 ; CHECK: ptrtoint ptr {{.*}} i64 62 ; CHECK-NEXT: xor i64 63 ; CHECK-NEXT: inttoptr i64 {{.*}} ptr 64 ; CHECK-NEXT: getelementptr i8, ptr 65 ; CHECK-NEXT: store i8 66 ; CHECK-NEXT: getelementptr i8, ptr 67 ; CHECK-NEXT: store i8 68 ; CHECK-NEXT: getelementptr i8, ptr 69 ; CHECK-NEXT: store i8 70 ; CHECK-NEXT: getelementptr i8, ptr 71 ; CHECK-NEXT: store i8 72 ; CHECK-NEXT: store i32 %v, ptr %p 73 ; CHECK-NEXT: ret void 74 75 store i32 %v, ptr %p 76 ret void 77} 78 79define void @store64(i64 %v, ptr %p) { 80 ; CHECK-LABEL: @store64.dfsan 81 ; NO_COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls 82 ; COMBINE_PTR_LABEL: load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 2) to ptr), align 2 83 ; COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls 84 ; COMBINE_PTR_LABEL: or i8 85 ; CHECK: ptrtoint ptr {{.*}} i64 86 ; CHECK-NEXT: xor i64 87 ; CHECK-NEXT: inttoptr i64 {{.*}} ptr 88 ; CHECK-COUNT-8: insertelement {{.*}} i8 89 ; CHECK-NEXT: getelementptr <8 x i8> 90 ; CHECK-NEXT: store <8 x i8> 91 ; CHECK-NEXT: store i64 %v, ptr %p 92 ; CHECK-NEXT: ret void 93 94 store i64 %v, ptr %p 95 ret void 96} 97 98define void @store_zero(ptr %p) { 99 ; CHECK-LABEL: @store_zero.dfsan 100 ; NO_COMBINE_PTR_LABEL: store i32 0, ptr {{.*}} 101 store i32 0, ptr %p 102 ret void 103} 104