Home | History | Annotate | Download | only in vect
      1 ; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s
      2 
      3 ; Check that store is post-incremented.
      4 ; CHECK: r{{[0-9]+:[0-9]+}} = vasrw(r{{[0-9]+:[0-9]+}}, r{{[0-9]+}})
      5 ; CHECK: r{{[0-9]+:[0-9]+}} = vaslw(r{{[0-9]+:[0-9]+}}, r{{[0-9]+}})
      6 target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32"
      7 target triple = "hexagon"
      8 
      9 define void @foo(i32* nocapture %buf, i32* nocapture %dest, i32 %offset, i32 %oddBlock, i32 %gb) #0 {
     10 entry:
     11   %0 = load i32, i32* %buf, align 4, !tbaa !0
     12   %shr = ashr i32 %0, %gb
     13   store i32 %shr, i32* %buf, align 4, !tbaa !0
     14   %not.tobool = icmp eq i32 %oddBlock, 0
     15   %1 = sub i32 %offset, %oddBlock
     16   %2 = zext i1 %not.tobool to i32
     17   %3 = and i32 %1, 7
     18   %4 = add i32 %2, %3
     19   %5 = add i32 %4, 8
     20   %p_sub8 = sub nsw i32 31, %gb
     21   %6 = insertelement <2 x i32> undef, i32 %p_sub8, i32 0
     22   %7 = insertelement <2 x i32> %6, i32 %p_sub8, i32 1
     23   %8 = bitcast <2 x i32> %7 to i64
     24   %9 = tail call i64 @llvm.hexagon.S2.asl.i.vw(i64 %8, i32 1)
     25   %10 = bitcast i64 %9 to <2 x i32>
     26   %11 = tail call i64 @llvm.hexagon.A2.combinew(i32 -1, i32 -1)
     27   %12 = bitcast i64 %11 to <2 x i32>
     28   %sub12p_vec = add <2 x i32> %10, %12
     29   %p_22 = add i32 %4, 64
     30   %p_d.018 = getelementptr i32, i32* %dest, i32 %4
     31   %p_d.01823 = getelementptr i32, i32* %dest, i32 %p_22
     32   %p_25 = add i32 %4, 72
     33   %p_arrayidx14 = getelementptr i32, i32* %dest, i32 %5
     34   %p_arrayidx1426 = getelementptr i32, i32* %dest, i32 %p_25
     35   %_p_scalar_ = load i32, i32* %p_d.018, align 4
     36   %_p_vec_ = insertelement <2 x i32> undef, i32 %_p_scalar_, i32 0
     37   %_p_scalar_27 = load i32, i32* %p_d.01823, align 4
     38   %_p_vec_28 = insertelement <2 x i32> %_p_vec_, i32 %_p_scalar_27, i32 1
     39   %13 = bitcast <2 x i32> %_p_vec_28 to i64
     40   %14 = tail call i64 @llvm.hexagon.S2.asr.i.vw(i64 %13, i32 31)
     41   %15 = bitcast i64 %14 to <2 x i32>
     42   %shr9p_vec = ashr <2 x i32> %_p_vec_28, %7
     43   %xorp_vec = xor <2 x i32> %15, %sub12p_vec
     44   %16 = bitcast <2 x i32> %shr9p_vec to i64
     45   %17 = tail call i32 @llvm.hexagon.A2.vcmpweq(i64 %14, i64 %16)
     46   %18 = bitcast <2 x i32> %xorp_vec to i64
     47   %19 = tail call i64 @llvm.hexagon.C2.vmux(i32 %17, i64 %13, i64 %18)
     48   %20 = tail call i64 @llvm.hexagon.S2.asl.r.vw(i64 %19, i32 %gb)
     49   %21 = bitcast i64 %20 to <2 x i32>
     50   %22 = extractelement <2 x i32> %21, i32 0
     51   store i32 %22, i32* %p_arrayidx14, align 4
     52   %23 = extractelement <2 x i32> %21, i32 1
     53   store i32 %23, i32* %p_arrayidx1426, align 4
     54   store i32 %22, i32* %p_d.018, align 4
     55   store i32 %23, i32* %p_d.01823, align 4
     56   %p_21.1 = add i32 %4, 128
     57   %p_22.1 = add i32 %4, 192
     58   %p_d.018.1 = getelementptr i32, i32* %dest, i32 %p_21.1
     59   %p_d.01823.1 = getelementptr i32, i32* %dest, i32 %p_22.1
     60   %p_24.1 = add i32 %4, 136
     61   %p_25.1 = add i32 %4, 200
     62   %p_arrayidx14.1 = getelementptr i32, i32* %dest, i32 %p_24.1
     63   %p_arrayidx1426.1 = getelementptr i32, i32* %dest, i32 %p_25.1
     64   %_p_scalar_.1 = load i32, i32* %p_d.018.1, align 4
     65   %_p_vec_.1 = insertelement <2 x i32> undef, i32 %_p_scalar_.1, i32 0
     66   %_p_scalar_27.1 = load i32, i32* %p_d.01823.1, align 4
     67   %_p_vec_28.1 = insertelement <2 x i32> %_p_vec_.1, i32 %_p_scalar_27.1, i32 1
     68   %24 = bitcast <2 x i32> %_p_vec_28.1 to i64
     69   %25 = tail call i64 @llvm.hexagon.S2.asr.i.vw(i64 %24, i32 31)
     70   %26 = bitcast i64 %25 to <2 x i32>
     71   %shr9p_vec.1 = ashr <2 x i32> %_p_vec_28.1, %7
     72   %xorp_vec.1 = xor <2 x i32> %26, %sub12p_vec
     73   %27 = bitcast <2 x i32> %shr9p_vec.1 to i64
     74   %28 = tail call i32 @llvm.hexagon.A2.vcmpweq(i64 %25, i64 %27)
     75   %29 = bitcast <2 x i32> %xorp_vec.1 to i64
     76   %30 = tail call i64 @llvm.hexagon.C2.vmux(i32 %28, i64 %24, i64 %29)
     77   %31 = tail call i64 @llvm.hexagon.S2.asl.r.vw(i64 %30, i32 %gb)
     78   %32 = bitcast i64 %31 to <2 x i32>
     79   %33 = extractelement <2 x i32> %32, i32 0
     80   store i32 %33, i32* %p_arrayidx14.1, align 4
     81   %34 = extractelement <2 x i32> %32, i32 1
     82   store i32 %34, i32* %p_arrayidx1426.1, align 4
     83   store i32 %33, i32* %p_d.018.1, align 4
     84   store i32 %34, i32* %p_d.01823.1, align 4
     85   %p_21.2 = add i32 %4, 256
     86   %p_22.2 = add i32 %4, 320
     87   %p_d.018.2 = getelementptr i32, i32* %dest, i32 %p_21.2
     88   %p_d.01823.2 = getelementptr i32, i32* %dest, i32 %p_22.2
     89   %p_24.2 = add i32 %4, 264
     90   %p_25.2 = add i32 %4, 328
     91   %p_arrayidx14.2 = getelementptr i32, i32* %dest, i32 %p_24.2
     92   %p_arrayidx1426.2 = getelementptr i32, i32* %dest, i32 %p_25.2
     93   %_p_scalar_.2 = load i32, i32* %p_d.018.2, align 4
     94   %_p_vec_.2 = insertelement <2 x i32> undef, i32 %_p_scalar_.2, i32 0
     95   %_p_scalar_27.2 = load i32, i32* %p_d.01823.2, align 4
     96   %_p_vec_28.2 = insertelement <2 x i32> %_p_vec_.2, i32 %_p_scalar_27.2, i32 1
     97   %35 = bitcast <2 x i32> %_p_vec_28.2 to i64
     98   %36 = tail call i64 @llvm.hexagon.S2.asr.i.vw(i64 %35, i32 31)
     99   %37 = bitcast i64 %36 to <2 x i32>
    100   %shr9p_vec.2 = ashr <2 x i32> %_p_vec_28.2, %7
    101   %xorp_vec.2 = xor <2 x i32> %37, %sub12p_vec
    102   %38 = bitcast <2 x i32> %shr9p_vec.2 to i64
    103   %39 = tail call i32 @llvm.hexagon.A2.vcmpweq(i64 %36, i64 %38)
    104   %40 = bitcast <2 x i32> %xorp_vec.2 to i64
    105   %41 = tail call i64 @llvm.hexagon.C2.vmux(i32 %39, i64 %35, i64 %40)
    106   %42 = tail call i64 @llvm.hexagon.S2.asl.r.vw(i64 %41, i32 %gb)
    107   %43 = bitcast i64 %42 to <2 x i32>
    108   %44 = extractelement <2 x i32> %43, i32 0
    109   store i32 %44, i32* %p_arrayidx14.2, align 4
    110   %45 = extractelement <2 x i32> %43, i32 1
    111   store i32 %45, i32* %p_arrayidx1426.2, align 4
    112   store i32 %44, i32* %p_d.018.2, align 4
    113   store i32 %45, i32* %p_d.01823.2, align 4
    114   %p_21.3 = add i32 %4, 384
    115   %p_22.3 = add i32 %4, 448
    116   %p_d.018.3 = getelementptr i32, i32* %dest, i32 %p_21.3
    117   %p_d.01823.3 = getelementptr i32, i32* %dest, i32 %p_22.3
    118   %p_24.3 = add i32 %4, 392
    119   %p_25.3 = add i32 %4, 456
    120   %p_arrayidx14.3 = getelementptr i32, i32* %dest, i32 %p_24.3
    121   %p_arrayidx1426.3 = getelementptr i32, i32* %dest, i32 %p_25.3
    122   %_p_scalar_.3 = load i32, i32* %p_d.018.3, align 4
    123   %_p_vec_.3 = insertelement <2 x i32> undef, i32 %_p_scalar_.3, i32 0
    124   %_p_scalar_27.3 = load i32, i32* %p_d.01823.3, align 4
    125   %_p_vec_28.3 = insertelement <2 x i32> %_p_vec_.3, i32 %_p_scalar_27.3, i32 1
    126   %46 = bitcast <2 x i32> %_p_vec_28.3 to i64
    127   %47 = tail call i64 @llvm.hexagon.S2.asr.i.vw(i64 %46, i32 31)
    128   %48 = bitcast i64 %47 to <2 x i32>
    129   %shr9p_vec.3 = ashr <2 x i32> %_p_vec_28.3, %7
    130   %xorp_vec.3 = xor <2 x i32> %48, %sub12p_vec
    131   %49 = bitcast <2 x i32> %shr9p_vec.3 to i64
    132   %50 = tail call i32 @llvm.hexagon.A2.vcmpweq(i64 %47, i64 %49)
    133   %51 = bitcast <2 x i32> %xorp_vec.3 to i64
    134   %52 = tail call i64 @llvm.hexagon.C2.vmux(i32 %50, i64 %46, i64 %51)
    135   %53 = tail call i64 @llvm.hexagon.S2.asl.r.vw(i64 %52, i32 %gb)
    136   %54 = bitcast i64 %53 to <2 x i32>
    137   %55 = extractelement <2 x i32> %54, i32 0
    138   store i32 %55, i32* %p_arrayidx14.3, align 4
    139   %56 = extractelement <2 x i32> %54, i32 1
    140   store i32 %56, i32* %p_arrayidx1426.3, align 4
    141   store i32 %55, i32* %p_d.018.3, align 4
    142   store i32 %56, i32* %p_d.01823.3, align 4
    143   %p_21.4 = add i32 %4, 512
    144   %p_22.4 = add i32 %4, 576
    145   %p_d.018.4 = getelementptr i32, i32* %dest, i32 %p_21.4
    146   %p_d.01823.4 = getelementptr i32, i32* %dest, i32 %p_22.4
    147   %p_24.4 = add i32 %4, 520
    148   %p_25.4 = add i32 %4, 584
    149   %p_arrayidx14.4 = getelementptr i32, i32* %dest, i32 %p_24.4
    150   %p_arrayidx1426.4 = getelementptr i32, i32* %dest, i32 %p_25.4
    151   %_p_scalar_.4 = load i32, i32* %p_d.018.4, align 4
    152   %_p_vec_.4 = insertelement <2 x i32> undef, i32 %_p_scalar_.4, i32 0
    153   %_p_scalar_27.4 = load i32, i32* %p_d.01823.4, align 4
    154   %_p_vec_28.4 = insertelement <2 x i32> %_p_vec_.4, i32 %_p_scalar_27.4, i32 1
    155   %57 = bitcast <2 x i32> %_p_vec_28.4 to i64
    156   %58 = tail call i64 @llvm.hexagon.S2.asr.i.vw(i64 %57, i32 31)
    157   %59 = bitcast i64 %58 to <2 x i32>
    158   %shr9p_vec.4 = ashr <2 x i32> %_p_vec_28.4, %7
    159   %xorp_vec.4 = xor <2 x i32> %59, %sub12p_vec
    160   %60 = bitcast <2 x i32> %shr9p_vec.4 to i64
    161   %61 = tail call i32 @llvm.hexagon.A2.vcmpweq(i64 %58, i64 %60)
    162   %62 = bitcast <2 x i32> %xorp_vec.4 to i64
    163   %63 = tail call i64 @llvm.hexagon.C2.vmux(i32 %61, i64 %57, i64 %62)
    164   %64 = tail call i64 @llvm.hexagon.S2.asl.r.vw(i64 %63, i32 %gb)
    165   %65 = bitcast i64 %64 to <2 x i32>
    166   %66 = extractelement <2 x i32> %65, i32 0
    167   store i32 %66, i32* %p_arrayidx14.4, align 4
    168   %67 = extractelement <2 x i32> %65, i32 1
    169   store i32 %67, i32* %p_arrayidx1426.4, align 4
    170   store i32 %66, i32* %p_d.018.4, align 4
    171   store i32 %67, i32* %p_d.01823.4, align 4
    172   %p_21.5 = add i32 %4, 640
    173   %p_22.5 = add i32 %4, 704
    174   %p_d.018.5 = getelementptr i32, i32* %dest, i32 %p_21.5
    175   %p_d.01823.5 = getelementptr i32, i32* %dest, i32 %p_22.5
    176   %p_24.5 = add i32 %4, 648
    177   %p_25.5 = add i32 %4, 712
    178   %p_arrayidx14.5 = getelementptr i32, i32* %dest, i32 %p_24.5
    179   %p_arrayidx1426.5 = getelementptr i32, i32* %dest, i32 %p_25.5
    180   %_p_scalar_.5 = load i32, i32* %p_d.018.5, align 4
    181   %_p_vec_.5 = insertelement <2 x i32> undef, i32 %_p_scalar_.5, i32 0
    182   %_p_scalar_27.5 = load i32, i32* %p_d.01823.5, align 4
    183   %_p_vec_28.5 = insertelement <2 x i32> %_p_vec_.5, i32 %_p_scalar_27.5, i32 1
    184   %68 = bitcast <2 x i32> %_p_vec_28.5 to i64
    185   %69 = tail call i64 @llvm.hexagon.S2.asr.i.vw(i64 %68, i32 31)
    186   %70 = bitcast i64 %69 to <2 x i32>
    187   %shr9p_vec.5 = ashr <2 x i32> %_p_vec_28.5, %7
    188   %xorp_vec.5 = xor <2 x i32> %70, %sub12p_vec
    189   %71 = bitcast <2 x i32> %shr9p_vec.5 to i64
    190   %72 = tail call i32 @llvm.hexagon.A2.vcmpweq(i64 %69, i64 %71)
    191   %73 = bitcast <2 x i32> %xorp_vec.5 to i64
    192   %74 = tail call i64 @llvm.hexagon.C2.vmux(i32 %72, i64 %68, i64 %73)
    193   %75 = tail call i64 @llvm.hexagon.S2.asl.r.vw(i64 %74, i32 %gb)
    194   %76 = bitcast i64 %75 to <2 x i32>
    195   %77 = extractelement <2 x i32> %76, i32 0
    196   store i32 %77, i32* %p_arrayidx14.5, align 4
    197   %78 = extractelement <2 x i32> %76, i32 1
    198   store i32 %78, i32* %p_arrayidx1426.5, align 4
    199   store i32 %77, i32* %p_d.018.5, align 4
    200   store i32 %78, i32* %p_d.01823.5, align 4
    201   %p_21.6 = add i32 %4, 768
    202   %p_22.6 = add i32 %4, 832
    203   %p_d.018.6 = getelementptr i32, i32* %dest, i32 %p_21.6
    204   %p_d.01823.6 = getelementptr i32, i32* %dest, i32 %p_22.6
    205   %p_24.6 = add i32 %4, 776
    206   %p_25.6 = add i32 %4, 840
    207   %p_arrayidx14.6 = getelementptr i32, i32* %dest, i32 %p_24.6
    208   %p_arrayidx1426.6 = getelementptr i32, i32* %dest, i32 %p_25.6
    209   %_p_scalar_.6 = load i32, i32* %p_d.018.6, align 4
    210   %_p_vec_.6 = insertelement <2 x i32> undef, i32 %_p_scalar_.6, i32 0
    211   %_p_scalar_27.6 = load i32, i32* %p_d.01823.6, align 4
    212   %_p_vec_28.6 = insertelement <2 x i32> %_p_vec_.6, i32 %_p_scalar_27.6, i32 1
    213   %79 = bitcast <2 x i32> %_p_vec_28.6 to i64
    214   %80 = tail call i64 @llvm.hexagon.S2.asr.i.vw(i64 %79, i32 31)
    215   %81 = bitcast i64 %80 to <2 x i32>
    216   %shr9p_vec.6 = ashr <2 x i32> %_p_vec_28.6, %7
    217   %xorp_vec.6 = xor <2 x i32> %81, %sub12p_vec
    218   %82 = bitcast <2 x i32> %shr9p_vec.6 to i64
    219   %83 = tail call i32 @llvm.hexagon.A2.vcmpweq(i64 %80, i64 %82)
    220   %84 = bitcast <2 x i32> %xorp_vec.6 to i64
    221   %85 = tail call i64 @llvm.hexagon.C2.vmux(i32 %83, i64 %79, i64 %84)
    222   %86 = tail call i64 @llvm.hexagon.S2.asl.r.vw(i64 %85, i32 %gb)
    223   %87 = bitcast i64 %86 to <2 x i32>
    224   %88 = extractelement <2 x i32> %87, i32 0
    225   store i32 %88, i32* %p_arrayidx14.6, align 4
    226   %89 = extractelement <2 x i32> %87, i32 1
    227   store i32 %89, i32* %p_arrayidx1426.6, align 4
    228   store i32 %88, i32* %p_d.018.6, align 4
    229   store i32 %89, i32* %p_d.01823.6, align 4
    230   %p_21.7 = add i32 %4, 896
    231   %p_22.7 = add i32 %4, 960
    232   %p_d.018.7 = getelementptr i32, i32* %dest, i32 %p_21.7
    233   %p_d.01823.7 = getelementptr i32, i32* %dest, i32 %p_22.7
    234   %p_24.7 = add i32 %4, 904
    235   %p_25.7 = add i32 %4, 968
    236   %p_arrayidx14.7 = getelementptr i32, i32* %dest, i32 %p_24.7
    237   %p_arrayidx1426.7 = getelementptr i32, i32* %dest, i32 %p_25.7
    238   %_p_scalar_.7 = load i32, i32* %p_d.018.7, align 4
    239   %_p_vec_.7 = insertelement <2 x i32> undef, i32 %_p_scalar_.7, i32 0
    240   %_p_scalar_27.7 = load i32, i32* %p_d.01823.7, align 4
    241   %_p_vec_28.7 = insertelement <2 x i32> %_p_vec_.7, i32 %_p_scalar_27.7, i32 1
    242   %90 = bitcast <2 x i32> %_p_vec_28.7 to i64
    243   %91 = tail call i64 @llvm.hexagon.S2.asr.i.vw(i64 %90, i32 31)
    244   %92 = bitcast i64 %91 to <2 x i32>
    245   %shr9p_vec.7 = ashr <2 x i32> %_p_vec_28.7, %7
    246   %xorp_vec.7 = xor <2 x i32> %92, %sub12p_vec
    247   %93 = bitcast <2 x i32> %shr9p_vec.7 to i64
    248   %94 = tail call i32 @llvm.hexagon.A2.vcmpweq(i64 %91, i64 %93)
    249   %95 = bitcast <2 x i32> %xorp_vec.7 to i64
    250   %96 = tail call i64 @llvm.hexagon.C2.vmux(i32 %94, i64 %90, i64 %95)
    251   %97 = tail call i64 @llvm.hexagon.S2.asl.r.vw(i64 %96, i32 %gb)
    252   %98 = bitcast i64 %97 to <2 x i32>
    253   %99 = extractelement <2 x i32> %98, i32 0
    254   store i32 %99, i32* %p_arrayidx14.7, align 4
    255   %100 = extractelement <2 x i32> %98, i32 1
    256   store i32 %100, i32* %p_arrayidx1426.7, align 4
    257   store i32 %99, i32* %p_d.018.7, align 4
    258   store i32 %100, i32* %p_d.01823.7, align 4
    259   ret void
    260 }
    261 
    262 declare i64 @llvm.hexagon.S2.asr.i.vw(i64, i32) #1
    263 
    264 declare i64 @llvm.hexagon.S2.asl.i.vw(i64, i32) #1
    265 
    266 declare i64 @llvm.hexagon.A2.combinew(i32, i32) #1
    267 
    268 declare i32 @llvm.hexagon.A2.vcmpweq(i64, i64) #1
    269 
    270 declare i64 @llvm.hexagon.C2.vmux(i32, i64, i64) #1
    271 
    272 declare i64 @llvm.hexagon.S2.asl.r.vw(i64, i32) #1
    273 
    274 attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
    275 attributes #1 = { nounwind readnone }
    276 
    277 !0 = !{!"int", !1}
    278 !1 = !{!"omnipotent char", !2}
    279 !2 = !{!"Simple C/C++ TBAA"}
    280