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