1 ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL 2 ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=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 target triple = "x86_64-unknown-linux-gnu" 5 6 define {} @load0({}* %p) { 7 ; COMBINE_PTR_LABEL: @"dfs$load0" 8 ; COMBINE_PTR_LABEL: load 9 ; COMBINE_PTR_LABEL-NOT: load 10 11 ; NO_COMBINE_PTR_LABEL: @"dfs$load0" 12 ; NO_COMBINE_PTR_LABEL: load 13 ; NO_COMBINE_PTR_LABEL-NOT: load 14 %a = load {}, {}* %p 15 ret {} %a 16 } 17 18 define i8 @load8(i8* %p) { 19 ; COMBINE_PTR_LABEL: @"dfs$load8" 20 ; COMBINE_PTR_LABEL: load i16, i16* 21 ; COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} to i64 22 ; COMBINE_PTR_LABEL: and i64 23 ; COMBINE_PTR_LABEL: mul i64 24 ; COMBINE_PTR_LABEL: inttoptr i64 25 ; COMBINE_PTR_LABEL: load i16, i16* 26 ; COMBINE_PTR_LABEL: icmp ne i16 27 ; COMBINE_PTR_LABEL: call zeroext i16 @__dfsan_union 28 ; COMBINE_PTR_LABEL: load i8, i8* 29 ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls 30 ; COMBINE_PTR_LABEL: ret i8 31 32 ; NO_COMBINE_PTR_LABEL: @"dfs$load8" 33 ; NO_COMBINE_PTR_LABEL: ptrtoint i8* 34 ; NO_COMBINE_PTR_LABEL: and i64 35 ; NO_COMBINE_PTR_LABEL: mul i64 36 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} to i16* 37 ; NO_COMBINE_PTR_LABEL: load i16, i16* 38 ; NO_COMBINE_PTR_LABEL: load i8, i8* 39 ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls 40 ; NO_COMBINE_PTR_LABEL: ret i8 41 42 %a = load i8, i8* %p 43 ret i8 %a 44 } 45 46 define i16 @load16(i16* %p) { 47 ; COMBINE_PTR_LABEL: @"dfs$load16" 48 ; COMBINE_PTR_LABEL: ptrtoint i16* 49 ; COMBINE_PTR_LABEL: and i64 50 ; COMBINE_PTR_LABEL: mul i64 51 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 52 ; COMBINE_PTR_LABEL: getelementptr i16 53 ; COMBINE_PTR_LABEL: load i16, i16* 54 ; COMBINE_PTR_LABEL: load i16, i16* 55 ; COMBINE_PTR_LABEL: icmp ne 56 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union 57 ; COMBINE_PTR_LABEL: icmp ne i16 58 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union 59 ; COMBINE_PTR_LABEL: load i16, i16* 60 ; COMBINE_PTR_LABEL: store {{.*}} @__dfsan_retval_tls 61 ; COMBINE_PTR_LABEL: ret i16 62 63 ; NO_COMBINE_PTR_LABEL: @"dfs$load16" 64 ; NO_COMBINE_PTR_LABEL: ptrtoint i16* 65 ; NO_COMBINE_PTR_LABEL: and i64 66 ; NO_COMBINE_PTR_LABEL: mul i64 67 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 68 ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16* 69 ; NO_COMBINE_PTR_LABEL: load i16, i16* 70 ; NO_COMBINE_PTR_LABEL: load i16, i16* 71 ; NO_COMBINE_PTR_LABEL: icmp ne i16 72 ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union 73 ; NO_COMBINE_PTR_LABEL: load i16, i16* 74 ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls 75 ; NO_COMBINE_PTR_LABEL: ret i16 76 77 %a = load i16, i16* %p 78 ret i16 %a 79 } 80 81 define i32 @load32(i32* %p) { 82 ; COMBINE_PTR_LABEL: @"dfs$load32" 83 ; COMBINE_PTR_LABEL: ptrtoint i32* 84 ; COMBINE_PTR_LABEL: and i64 85 ; COMBINE_PTR_LABEL: mul i64 86 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 87 ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64* 88 ; COMBINE_PTR_LABEL: load i64, i64* 89 ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16 90 ; COMBINE_PTR_LABEL: shl i64 91 ; COMBINE_PTR_LABEL: lshr i64 92 ; COMBINE_PTR_LABEL: or i64 93 ; COMBINE_PTR_LABEL: icmp eq i64 94 ; COMBINE_PTR_LABEL: icmp ne i16 95 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union 96 ; COMBINE_PTR_LABEL: load i32, i32* 97 ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls 98 ; COMBINE_PTR_LABEL: ret i32 99 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load 100 101 ; NO_COMBINE_PTR_LABEL: @"dfs$load32" 102 ; NO_COMBINE_PTR_LABEL: ptrtoint i32* 103 ; NO_COMBINE_PTR_LABEL: and i64 104 ; NO_COMBINE_PTR_LABEL: mul i64 105 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 106 ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64* 107 ; NO_COMBINE_PTR_LABEL: load i64, i64* 108 ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16 109 ; NO_COMBINE_PTR_LABEL: shl i64 110 ; NO_COMBINE_PTR_LABEL: lshr i64 111 ; NO_COMBINE_PTR_LABEL: or i64 112 ; NO_COMBINE_PTR_LABEL: icmp eq i64 113 ; NO_COMBINE_PTR_LABEL: load i32, i32* 114 ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls 115 ; NO_COMBINE_PTR_LABEL: ret i32 116 ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load 117 118 119 %a = load i32, i32* %p 120 ret i32 %a 121 } 122 123 define i64 @load64(i64* %p) { 124 ; COMBINE_PTR_LABEL: @"dfs$load64" 125 ; COMBINE_PTR_LABEL: ptrtoint i64* 126 ; COMBINE_PTR_LABEL: and i64 127 ; COMBINE_PTR_LABEL: mul i64 128 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 129 ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64* 130 ; COMBINE_PTR_LABEL: load i64, i64* 131 ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16 132 ; COMBINE_PTR_LABEL: shl i64 133 ; COMBINE_PTR_LABEL: lshr i64 134 ; COMBINE_PTR_LABEL: or i64 135 ; COMBINE_PTR_LABEL: icmp eq i64 136 ; COMBINE_PTR_LABEL: icmp ne i16 137 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union 138 ; COMBINE_PTR_LABEL: load i64, i64* 139 ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls 140 ; COMBINE_PTR_LABEL: ret i64 141 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load 142 ; COMBINE_PTR_LABEL: getelementptr i64, i64* {{.*}} i64 143 ; COMBINE_PTR_LABEL: load i64, i64* 144 ; COMBINE_PTR_LABEL: icmp eq i64 145 146 ; NO_COMBINE_PTR_LABEL: @"dfs$load64" 147 ; NO_COMBINE_PTR_LABEL: ptrtoint i64* 148 ; NO_COMBINE_PTR_LABEL: and i64 149 ; NO_COMBINE_PTR_LABEL: mul i64 150 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16* 151 ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64* 152 ; NO_COMBINE_PTR_LABEL: load i64, i64* 153 ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16 154 ; NO_COMBINE_PTR_LABEL: shl i64 155 ; NO_COMBINE_PTR_LABEL: lshr i64 156 ; NO_COMBINE_PTR_LABEL: or i64 157 ; NO_COMBINE_PTR_LABEL: icmp eq i64 158 ; NO_COMBINE_PTR_LABEL: load i64, i64* 159 ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls 160 ; NO_COMBINE_PTR_LABEL: ret i64 161 ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load 162 ; NO_COMBINE_PTR_LABEL: getelementptr i64, i64* {{.*}} i64 163 ; NO_COMBINE_PTR_LABEL: load i64, i64* 164 ; NO_COMBINE_PTR_LABEL: icmp eq i64 165 166 %a = load i64, i64* %p 167 ret i64 %a 168 } 169