Home | History | Annotate | Download | only in DataFlowSanitizer
      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