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