Home | History | Annotate | Download | only in InstCombine
      1 ; RUN: opt < %s -instcombine -mtriple=x86_64-apple-macosx -mcpu=core-avx2 -S | FileCheck %s
      2 
      3 define <2 x double> @constant_blendvpd(<2 x double> %xy, <2 x double> %ab) {
      4 ; CHECK-LABEL: @constant_blendvpd
      5 ; CHECK-NEXT: %1 = select <2 x i1> <i1 true, i1 false>, <2 x double> %ab, <2 x double> %xy
      6 ; CHECK-NEXT: ret <2 x double> %1
      7   %1 = tail call <2 x double> @llvm.x86.sse41.blendvpd(<2 x double> %xy, <2 x double> %ab, <2 x double> <double 0xFFFFFFFFE0000000, double 0.000000e+00>)
      8   ret <2 x double> %1
      9 }
     10 
     11 define <2 x double> @constant_blendvpd_zero(<2 x double> %xy, <2 x double> %ab) {
     12 ; CHECK-LABEL: @constant_blendvpd_zero
     13 ; CHECK-NEXT: ret <2 x double> %xy
     14   %1 = tail call <2 x double> @llvm.x86.sse41.blendvpd(<2 x double> %xy, <2 x double> %ab, <2 x double> zeroinitializer)
     15   ret <2 x double> %1
     16 }
     17 
     18 define <2 x double> @constant_blendvpd_dup(<2 x double> %xy, <2 x double> %sel) {
     19 ; CHECK-LABEL: @constant_blendvpd_dup
     20 ; CHECK-NEXT: ret <2 x double> %xy
     21   %1 = tail call <2 x double> @llvm.x86.sse41.blendvpd(<2 x double> %xy, <2 x double> %xy, <2 x double> %sel)
     22   ret <2 x double> %1
     23 }
     24 
     25 define <4 x float> @constant_blendvps(<4 x float> %xyzw, <4 x float> %abcd) {
     26 ; CHECK-LABEL: @constant_blendvps
     27 ; CHECK-NEXT: %1 = select <4 x i1> <i1 false, i1 false, i1 false, i1 true>, <4 x float> %abcd, <4 x float> %xyzw
     28 ; CHECK-NEXT: ret <4 x float> %1
     29   %1 = tail call <4 x float> @llvm.x86.sse41.blendvps(<4 x float> %xyzw, <4 x float> %abcd, <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0xFFFFFFFFE0000000>)
     30   ret <4 x float> %1
     31 }
     32 
     33 define <4 x float> @constant_blendvps_zero(<4 x float> %xyzw, <4 x float> %abcd) {
     34 ; CHECK-LABEL: @constant_blendvps_zero
     35 ; CHECK-NEXT: ret <4 x float> %xyzw
     36   %1 = tail call <4 x float> @llvm.x86.sse41.blendvps(<4 x float> %xyzw, <4 x float> %abcd, <4 x float> zeroinitializer)
     37   ret <4 x float> %1
     38 }
     39 
     40 define <4 x float> @constant_blendvps_dup(<4 x float> %xyzw, <4 x float> %sel) {
     41 ; CHECK-LABEL: @constant_blendvps_dup
     42 ; CHECK-NEXT: ret <4 x float> %xyzw
     43   %1 = tail call <4 x float> @llvm.x86.sse41.blendvps(<4 x float> %xyzw, <4 x float> %xyzw, <4 x float> %sel)
     44   ret <4 x float> %1
     45 }
     46 
     47 define <16 x i8> @constant_pblendvb(<16 x i8> %xyzw, <16 x i8> %abcd) {
     48 ; CHECK-LABEL: @constant_pblendvb
     49 ; CHECK-NEXT: %1 = select <16 x i1> <i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false>, <16 x i8> %abcd, <16 x i8> %xyzw
     50 ; CHECK-NEXT: ret <16 x i8> %1
     51   %1 = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %xyzw, <16 x i8> %abcd, <16 x i8> <i8 0, i8 0, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0>)
     52   ret <16 x i8> %1
     53 }
     54 
     55 define <16 x i8> @constant_pblendvb_zero(<16 x i8> %xyzw, <16 x i8> %abcd) {
     56 ; CHECK-LABEL: @constant_pblendvb_zero
     57 ; CHECK-NEXT: ret <16 x i8> %xyzw
     58   %1 = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %xyzw, <16 x i8> %abcd, <16 x i8> zeroinitializer)
     59   ret <16 x i8> %1
     60 }
     61 
     62 define <16 x i8> @constant_pblendvb_dup(<16 x i8> %xyzw, <16 x i8> %sel) {
     63 ; CHECK-LABEL: @constant_pblendvb_dup
     64 ; CHECK-NEXT: ret <16 x i8> %xyzw
     65   %1 = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %xyzw, <16 x i8> %xyzw, <16 x i8> %sel)
     66   ret <16 x i8> %1
     67 }
     68 
     69 define <4 x double> @constant_blendvpd_avx(<4 x double> %xy, <4 x double> %ab) {
     70 ; CHECK-LABEL: @constant_blendvpd_avx
     71 ; CHECK-NEXT: %1 = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x double> %ab, <4 x double> %xy
     72 ; CHECK-NEXT: ret <4 x double> %1
     73   %1 = tail call <4 x double> @llvm.x86.avx.blendv.pd.256(<4 x double> %xy, <4 x double> %ab, <4 x double> <double 0xFFFFFFFFE0000000, double 0.000000e+00, double 0xFFFFFFFFE0000000, double 0.000000e+00>)
     74   ret <4 x double> %1
     75 }
     76 
     77 define <4 x double> @constant_blendvpd_avx_zero(<4 x double> %xy, <4 x double> %ab) {
     78 ; CHECK-LABEL: @constant_blendvpd_avx_zero
     79 ; CHECK-NEXT: ret <4 x double> %xy
     80   %1 = tail call <4 x double> @llvm.x86.avx.blendv.pd.256(<4 x double> %xy, <4 x double> %ab, <4 x double> zeroinitializer)
     81   ret <4 x double> %1
     82 }
     83 
     84 define <4 x double> @constant_blendvpd_avx_dup(<4 x double> %xy, <4 x double> %sel) {
     85 ; CHECK-LABEL: @constant_blendvpd_avx_dup
     86 ; CHECK-NEXT: ret <4 x double> %xy
     87   %1 = tail call <4 x double> @llvm.x86.avx.blendv.pd.256(<4 x double> %xy, <4 x double> %xy, <4 x double> %sel)
     88   ret <4 x double> %1
     89 }
     90 
     91 define <8 x float> @constant_blendvps_avx(<8 x float> %xyzw, <8 x float> %abcd) {
     92 ; CHECK-LABEL: @constant_blendvps_avx
     93 ; CHECK-NEXT: %1 = select <8 x i1> <i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true>, <8 x float> %abcd, <8 x float> %xyzw
     94 ; CHECK-NEXT: ret <8 x float> %1
     95   %1 = tail call <8 x float> @llvm.x86.avx.blendv.ps.256(<8 x float> %xyzw, <8 x float> %abcd, <8 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0xFFFFFFFFE0000000, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0xFFFFFFFFE0000000>)
     96   ret <8 x float> %1
     97 }
     98 
     99 define <8 x float> @constant_blendvps_avx_zero(<8 x float> %xyzw, <8 x float> %abcd) {
    100 ; CHECK-LABEL: @constant_blendvps_avx_zero
    101 ; CHECK-NEXT: ret <8 x float> %xyzw
    102   %1 = tail call <8 x float> @llvm.x86.avx.blendv.ps.256(<8 x float> %xyzw, <8 x float> %abcd, <8 x float> zeroinitializer)
    103   ret <8 x float> %1
    104 }
    105 
    106 define <8 x float> @constant_blendvps_avx_dup(<8 x float> %xyzw, <8 x float> %sel) {
    107 ; CHECK-LABEL: @constant_blendvps_avx_dup
    108 ; CHECK-NEXT: ret <8 x float> %xyzw
    109   %1 = tail call <8 x float> @llvm.x86.avx.blendv.ps.256(<8 x float> %xyzw, <8 x float> %xyzw, <8 x float> %sel)
    110   ret <8 x float> %1
    111 }
    112 
    113 define <32 x i8> @constant_pblendvb_avx2(<32 x i8> %xyzw, <32 x i8> %abcd) {
    114 ; CHECK-LABEL: @constant_pblendvb_avx2
    115 ; CHECK-NEXT: %1 = select <32 x i1> <i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false>, <32 x i8> %abcd, <32 x i8> %xyzw
    116 ; CHECK-NEXT: ret <32 x i8> %1
    117   %1 = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %xyzw, <32 x i8> %abcd,
    118         <32 x i8> <i8 0, i8 0, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0,
    119                    i8 0, i8 0, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0,
    120                    i8 0, i8 0, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0,
    121                    i8 0, i8 0, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0>)
    122   ret <32 x i8> %1
    123 }
    124 
    125 define <32 x i8> @constant_pblendvb_avx2_zero(<32 x i8> %xyzw, <32 x i8> %abcd) {
    126 ; CHECK-LABEL: @constant_pblendvb_avx2_zero
    127 ; CHECK-NEXT: ret <32 x i8> %xyzw
    128   %1 = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %xyzw, <32 x i8> %abcd, <32 x i8> zeroinitializer)
    129   ret <32 x i8> %1
    130 }
    131 
    132 define <32 x i8> @constant_pblendvb_avx2_dup(<32 x i8> %xyzw, <32 x i8> %sel) {
    133 ; CHECK-LABEL: @constant_pblendvb_avx2_dup
    134 ; CHECK-NEXT: ret <32 x i8> %xyzw
    135   %1 = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %xyzw, <32 x i8> %xyzw, <32 x i8> %sel)
    136   ret <32 x i8> %1
    137 }
    138 
    139 declare <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8>, <16 x i8>, <16 x i8>)
    140 declare <4 x float> @llvm.x86.sse41.blendvps(<4 x float>, <4 x float>, <4 x float>)
    141 declare <2 x double> @llvm.x86.sse41.blendvpd(<2 x double>, <2 x double>, <2 x double>)
    142 
    143 declare <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8>, <32 x i8>, <32 x i8>)
    144 declare <8 x float> @llvm.x86.avx.blendv.ps.256(<8 x float>, <8 x float>, <8 x float>)
    145 declare <4 x double> @llvm.x86.avx.blendv.pd.256(<4 x double>, <4 x double>, <4 x double>)
    146