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