Home | History | Annotate | Download | only in parse_errs
      1 ; Tests malformed insertelement and extractelement vector instructions.
      2 
      3 ; RUN: %if --need=allow_dump --command \
      4 ; RUN:   %p2i --expect-fail -i %s --allow-pnacl-reader-error-recovery \
      5 ; RUN:   --filetype=obj -o /dev/null --args -notranslate \
      6 ; RUN:   | %if --need=allow_dump --command FileCheck %s
      7 
      8 ; RUN: %if --need=no_dump --command \
      9 ; RUN:   %p2i --expect-fail -i %s --allow-pnacl-reader-error-recovery \
     10 ; RUN:   --filetype=obj -o /dev/null --args -notranslate \
     11 ; RUN:   | %if --need=no_dump --command FileCheck %s --check-prefix=MIN
     12 
     13 define void @ExtractV4xi1(<4 x i1> %v, i32 %i) {
     14   %e0 = extractelement <4 x i1> %v, i32 %i
     15 ; CHECK: Error{{.*}} not {{.*}} constant
     16 ; MIN: Error{{.*}} Invalid function record: <6 4 3>
     17   %e1 = extractelement <4 x i1> %v, i32 4
     18 ; CHECK: Error{{.*}} not in range
     19 ; MIN: Error{{.*}} Invalid function record: <6 5 3>
     20   %e2 = extractelement <4 x i1> %v, i32 9
     21 ; CHECK: Error{{.*}} not in range
     22 ; MIN: Error{{.*}} Invalid function record:  <6 6 3>
     23   ret void
     24 }
     25 
     26 define void @ExtractV8xi1(<8 x i1> %v, i32 %i) {
     27   %e0 = extractelement <8 x i1> %v, i32 %i
     28 ; CHECK: Error{{.*}} not {{.*}} constant
     29 ; MIN: Error{{.*}} Invalid function record: <6 4 3>
     30   %e1 = extractelement <8 x i1> %v, i32 8;
     31 ; CHECK: Error{{.*}} not in range
     32 ; MIN: Error{{.*}} Invalid function record: <6 5 3>
     33   %e2 = extractelement <8 x i1> %v, i32 9;
     34 ; CHECK: Error{{.*}} not in range
     35 ; MIN: Error{{.*}} Invalid function record: <6 6 3>
     36   ret void
     37 }
     38 
     39 define void @ExtractV16xi1(<16 x i1> %v, i32 %i) {
     40   %e0 = extractelement <16 x i1> %v, i32 %i
     41 ; CHECK: Error{{.*}} not {{.*}} constant
     42 ; MIN: Error{{.*}} Invalid function record: <6 4 3>
     43   %e1 = extractelement <16 x i1> %v, i32 16
     44 ; CHECK: Error{{.*}} not in range
     45 ; MIN: Error{{.*}} Invalid function record: <6 5 3>
     46   %e2 = extractelement <16 x i1> %v, i32 24
     47 ; CHECK: Error{{.*}} not in range
     48 ; MIN: Error{{.*}} Invalid function record: <6 6 3>
     49   ret void
     50 }
     51 
     52 define void @ExtractV16xi8(<16 x i8> %v, i32 %i) {
     53   %e0 = extractelement <16 x i8> %v, i32 %i
     54 ; CHECK: Error{{.*}} not {{.*}} constant
     55 ; MIN: Error{{.*}} Invalid function record: <6 4 3>
     56   %e1 = extractelement <16 x i8> %v, i32 16
     57 ; CHECK: Error{{.*}} not in range
     58 ; MIN: Error{{.*}} Invalid function record: <6 5 3>
     59   %e2 = extractelement <16 x i8> %v, i32 71
     60 ; CHECK: Error{{.*}} not in range
     61 ; MIN: Error{{.*}} Invalid function record: <6 6 3>
     62   ret void
     63 }
     64 
     65 define void @ExtractV8xi16(<8 x i16> %v, i32 %i) {
     66   %e0 = extractelement <8 x i16> %v, i32 %i
     67 ; CHECK: Error{{.*}} not {{.*}} constant
     68 ; MIN: Error{{.*}} Invalid function record: <6 4 3>
     69   %e1 = extractelement <8 x i16> %v, i32 8
     70 ; CHECK: Error{{.*}} not in range
     71 ; MIN: Error{{.*}} Invalid function record: <6 5 3>
     72   %e2 = extractelement <8 x i16> %v, i32 15
     73 ; CHECK: Error{{.*}} not in range
     74 ; MIN: Error{{.*}} Invalid function record: <6 6 3>
     75   ret void
     76 }
     77 
     78 define i32 @ExtractV4xi32(<4 x i32> %v, i32 %i) {
     79   %e0 = extractelement <4 x i32> %v, i32 %i
     80 ; CHECK: Error{{.*}} not {{.*}} constant
     81 ; MIN: Error{{.*}} Invalid function record: <6 4 3>
     82   %e1 = extractelement <4 x i32> %v, i32 4
     83 ; CHECK: Error{{.*}} not in range
     84 ; MIN: Error{{.*}} Invalid function record: <6 5 3>
     85   %e2 = extractelement <4 x i32> %v, i32 17
     86 ; CHECK: Error{{.*}} not in range
     87 ; MIN: Error{{.*}} Invalid function record: <6 6 3>
     88   ret i32 %e0
     89 }
     90 
     91 define float @ExtractV4xfloat(<4 x float> %v, i32 %i) {
     92   %e0 = extractelement <4 x float> %v, i32 %i
     93 ; CHECK: Error{{.*}} not {{.*}} constant
     94 ; MIN: Error{{.*}} Invalid function record: <6 3 2>
     95   %e1 = extractelement <4 x float> %v, i32 4
     96 ; CHECK: Error{{.*}} not in range
     97 ; MIN: Error{{.*}} Invalid function record: <6 4 2>
     98   %e2 = extractelement <4 x float> %v, i32 4
     99 ; CHECK: Error{{.*}} not in range
    100 ; MIN: Error{{.*}} Invalid function record: <6 5 3>
    101   ret float %e2
    102 }
    103 
    104 define <4 x i1> @InsertV4xi1(<4 x i1> %v, i32 %i) {
    105   %r0 = insertelement <4 x i1> %v, i1 1, i32 %i
    106 ; CHECK: Error{{.*}} not {{.*}} constant
    107 ; MIN: Error{{.*}} Invalid function record: <7 5 1 4>
    108   %r1 = insertelement <4 x i1> %v, i1 1, i32 4
    109 ; CHECK: Error{{.*}} not in range
    110 ; MIN: Error{{.*}} Invalid function record: <7 6 2 4>
    111   %r2 = insertelement <4 x i1> %v, i1 1, i32 7
    112 ; CHECK: Error{{.*}} not in range
    113 ; MIN: Error{{.*}} Invalid function record: <7 7 3 4>
    114   ret <4 x i1> %r2
    115 }
    116 
    117 define <8 x i1> @InsertV8xi1(<8 x i1> %v, i32 %i) {
    118   %r0 = insertelement <8 x i1> %v, i1 0, i32 %i
    119 ; CHECK: Error{{.*}} not {{.*}} constant
    120 ; MIN: Error{{.*}} Invalid function record: <7 5 1 4>
    121   %r1 = insertelement <8 x i1> %v, i1 0, i32 8
    122 ; CHECK: Error{{.*}} not in range
    123 ; MIN: Error{{.*}} Invalid function record: <7 6 2 4>
    124   %r2 = insertelement <8 x i1> %v, i1 0, i32 88
    125 ; CHECK: Error{{.*}} not in range
    126 ; MIN: Error{{.*}} Invalid function record: <7 7 3 4>
    127   ret <8 x i1> %r2
    128 }
    129 
    130 define <16 x i1> @InsertV16xi1(<16 x i1> %v, i32 %i) {
    131   %r = insertelement <16 x i1> %v, i1 1, i32 %i
    132 ; CHECK: Error{{.*}} not {{.*}} constant
    133 ; MIN: Error{{.*}} Invalid function record: <7 5 1 4>
    134   ret <16 x i1> %r
    135   %r1 = insertelement <16 x i1> %v, i1 1, i32 16
    136 ; CHECK: Error{{.*}} not in range
    137 ; MIN: Error{{.*}} Invalid function record: <7 6 2 4>
    138   %r2 = insertelement <16 x i1> %v, i1 1, i32 31
    139 ; CHECK: Error{{.*}} not in range
    140 ; MIN: Error{{.*}} Invalid function record: <7 7 3 4>
    141   ret <16 x i1> %r2
    142 }
    143 
    144 define <16 x i8> @InsertV16xi8(<16 x i8> %v, i32 %i) {
    145   %r0 = insertelement <16 x i8> %v, i8 34, i32 %i
    146 ; CHECK: Error{{.*}} not {{.*}} constant
    147 ; MIN: Error{{.*}} Invalid function record: <7 5 1 4>
    148   %r1 = insertelement <16 x i8> %v, i8 34, i32 16
    149 ; CHECK: Error{{.*}} not in range
    150 ; MIN: Error{{.*}} Invalid function record: <7 6 2 4>
    151   %r2 = insertelement <16 x i8> %v, i8 34, i32 19
    152 ; CHECK: Error{{.*}} not in range
    153 ; MIN: Error{{.*}} Invalid function record: <7 7 3 4>
    154   ret <16 x i8> %r0
    155 }
    156 
    157 define <8 x i16> @InsertV8xi16(<8 x i16> %v, i32 %i) {
    158   %r0 = insertelement <8 x i16> %v, i16 289, i32 %i
    159 ; CHECK: Error{{.*}} not {{.*}} constant
    160 ; MIN: Error{{.*}} Invalid function record: <7 5 1 4>
    161   %r1 = insertelement <8 x i16> %v, i16 289, i32 8
    162 ; CHECK: Error{{.*}} not in range
    163 ; MIN: Error{{.*}} Invalid function record: <7 6 2 4>
    164   %r2 = insertelement <8 x i16> %v, i16 289, i32 19
    165 ; CHECK: Error{{.*}} not in range
    166 ; MIN: Error{{.*}} Invalid function record: <7 7 3 4>
    167   ret <8 x i16> %r1
    168 }
    169 
    170 define <4 x i32> @InsertV4xi32(<4 x i32> %v, i32 %i) {
    171   %r0 = insertelement <4 x i32> %v, i32 54545454, i32 %i
    172 ; CHECK: Error{{.*}} not {{.*}} constant
    173 ; MIN: Error{{.*}} Invalid function record: <7 5 3 4>
    174   %r1 = insertelement <4 x i32> %v, i32 54545454, i32 4
    175 ; CHECK: Error{{.*}} not in range
    176 ; MIN: Error{{.*}} Invalid function record: <7 6 4 3>
    177   %r2 = insertelement <4 x i32> %v, i32 54545454, i32 9
    178 ; CHECK: Error{{.*}} not in range
    179 ; MIN: Error{{.*}} Invalid function record: <7 7 5 3>
    180   ret <4 x i32> %r2
    181 }
    182 
    183 define <4 x float> @InsertV4xfloat(<4 x float> %v, i32 %i) {
    184   %r0 = insertelement <4 x float> %v, float 3.0, i32 %i
    185 ; CHECK: Error{{.*}} not {{.*}} constant
    186 ; MIN: Error{{.*}} Invalid function record: <7 5 1 4>
    187   %r1 = insertelement <4 x float> %v, float 3.0, i32 4
    188 ; CHECK: Error{{.*}} not in range
    189 ; MIN: Error{{.*}} Invalid function record: <7 6 2 4>
    190   %r2 = insertelement <4 x float> %v, float 3.0, i32 44
    191 ; CHECK: Error{{.*}} not in range
    192 ; MIN: Error{{.*}} Invalid function record: <7 7 3 4>
    193   ret <4 x float> %r2
    194 }
    195