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 
      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 }