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