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