1 ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL 2 ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=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 void @store8(i8 %v, i8* %p) { 6 ; NO_COMBINE_PTR_LABEL: @"dfs$store8" 7 ; NO_COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 8 ; NO_COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} i64 9 ; NO_COMBINE_PTR_LABEL: and i64 10 ; NO_COMBINE_PTR_LABEL: mul i64 11 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 12 ; NO_COMBINE_PTR_LABEL: getelementptr i16* 13 ; NO_COMBINE_PTR_LABEL: store i16 14 ; NO_COMBINE_PTR_LABEL: store i8 15 16 ; COMBINE_PTR_LABEL: @"dfs$store8" 17 ; COMBINE_PTR_LABEL: load i16* 18 ; COMBINE_PTR_LABEL: load i16* 19 ; COMBINE_PTR_LABEL: icmp ne i16 20 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union 21 ; COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} i64 22 ; COMBINE_PTR_LABEL: and i64 23 ; COMBINE_PTR_LABEL: mul i64 24 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 25 ; COMBINE_PTR_LABEL: getelementptr i16* 26 ; COMBINE_PTR_LABEL: store i16 27 ; COMBINE_PTR_LABEL: store i8 28 29 store i8 %v, i8* %p 30 ret void 31 } 32 33 define void @store16(i16 %v, i16* %p) { 34 ; NO_COMBINE_PTR_LABEL: @"dfs$store16" 35 ; NO_COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 36 ; NO_COMBINE_PTR_LABEL: ptrtoint i16* {{.*}} i64 37 ; NO_COMBINE_PTR_LABEL: and i64 38 ; NO_COMBINE_PTR_LABEL: mul i64 39 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 40 ; NO_COMBINE_PTR_LABEL: getelementptr i16* 41 ; NO_COMBINE_PTR_LABEL: store i16 42 ; NO_COMBINE_PTR_LABEL: getelementptr i16* 43 ; NO_COMBINE_PTR_LABEL: store i16 44 ; NO_COMBINE_PTR_LABEL: store i16 45 46 ; COMBINE_PTR_LABEL: @"dfs$store16" 47 ; COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 48 ; COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 49 ; COMBINE_PTR_LABEL: icmp ne i16 50 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union 51 ; COMBINE_PTR_LABEL: ptrtoint i16* {{.*}} i64 52 ; COMBINE_PTR_LABEL: and i64 53 ; COMBINE_PTR_LABEL: mul i64 54 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 55 ; COMBINE_PTR_LABEL: getelementptr i16* 56 ; COMBINE_PTR_LABEL: store i16 57 ; COMBINE_PTR_LABEL: getelementptr i16* 58 ; COMBINE_PTR_LABEL: store i16 59 ; COMBINE_PTR_LABEL: store i16 60 61 store i16 %v, i16* %p 62 ret void 63 } 64 65 define void @store32(i32 %v, i32* %p) { 66 ; NO_COMBINE_PTR_LABEL: @"dfs$store32" 67 ; NO_COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 68 ; NO_COMBINE_PTR_LABEL: ptrtoint i32* {{.*}} i64 69 ; NO_COMBINE_PTR_LABEL: and i64 70 ; NO_COMBINE_PTR_LABEL: mul i64 71 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 72 ; NO_COMBINE_PTR_LABEL: getelementptr i16* 73 ; NO_COMBINE_PTR_LABEL: store i16 74 ; NO_COMBINE_PTR_LABEL: getelementptr i16* 75 ; NO_COMBINE_PTR_LABEL: store i16 76 ; NO_COMBINE_PTR_LABEL: getelementptr i16* 77 ; NO_COMBINE_PTR_LABEL: store i16 78 ; NO_COMBINE_PTR_LABEL: getelementptr i16* 79 ; NO_COMBINE_PTR_LABEL: store i16 80 ; NO_COMBINE_PTR_LABEL: store i32 81 82 ; COMBINE_PTR_LABEL: @"dfs$store32" 83 ; COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 84 ; COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 85 ; COMBINE_PTR_LABEL: icmp ne i16 86 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union 87 ; COMBINE_PTR_LABEL: ptrtoint i32* {{.*}} i64 88 ; COMBINE_PTR_LABEL: and i64 89 ; COMBINE_PTR_LABEL: mul i64 90 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 91 ; COMBINE_PTR_LABEL: getelementptr i16* 92 ; COMBINE_PTR_LABEL: store i16 93 ; COMBINE_PTR_LABEL: getelementptr i16* 94 ; COMBINE_PTR_LABEL: store i16 95 ; COMBINE_PTR_LABEL: getelementptr i16* 96 ; COMBINE_PTR_LABEL: store i16 97 ; COMBINE_PTR_LABEL: getelementptr i16* 98 ; COMBINE_PTR_LABEL: store i16 99 ; COMBINE_PTR_LABEL: store i32 100 101 store i32 %v, i32* %p 102 ret void 103 } 104 105 define void @store64(i64 %v, i64* %p) { 106 ; NO_COMBINE_PTR_LABEL: @"dfs$store64" 107 ; NO_COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 108 ; NO_COMBINE_PTR_LABEL: ptrtoint i64* {{.*}} i64 109 ; NO_COMBINE_PTR_LABEL: and i64 110 ; NO_COMBINE_PTR_LABEL: mul i64 111 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 112 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16 113 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16 114 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16 115 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16 116 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16 117 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16 118 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16 119 ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16 120 ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} <8 x i16>* 121 ; NO_COMBINE_PTR_LABEL: store i64 122 123 ; COMBINE_PTR_LABEL: @"dfs$store64" 124 ; COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 125 ; COMBINE_PTR_LABEL: load i16* {{.*}} @__dfsan_arg_tls 126 ; COMBINE_PTR_LABEL: icmp ne i16 127 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union 128 ; COMBINE_PTR_LABEL: ptrtoint i64* {{.*}} i64 129 ; COMBINE_PTR_LABEL: and i64 130 ; COMBINE_PTR_LABEL: mul i64 131 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 132 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16 133 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16 134 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16 135 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16 136 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16 137 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16 138 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16 139 ; COMBINE_PTR_LABEL: insertelement {{.*}} i16 140 ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} <8 x i16>* 141 ; COMBINE_PTR_LABEL: store <8 x i16> 142 ; COMBINE_PTR_LABEL: store i64 143 144 store i64 %v, i64* %p 145 ret void 146 } 147