diff options
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AMDGPU/indirect-addressing-si-noopt.ll | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/simd.ll | 32 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/extractelement-index.ll | 12 |
4 files changed, 18 insertions, 34 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 52a71b91d93..8ea7ce94da1 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5228,8 +5228,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT, "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \ element type of the vector."); - // EXTRACT_VECTOR_ELT of an UNDEF is an UNDEF. - if (N1.isUndef()) + // Extract from an undefined value or using an undefined index is undefined. + if (N1.isUndef() || N2.isUndef()) return getUNDEF(VT); // EXTRACT_VECTOR_ELT of out-of-bounds element is an UNDEF diff --git a/llvm/test/CodeGen/AMDGPU/indirect-addressing-si-noopt.ll b/llvm/test/CodeGen/AMDGPU/indirect-addressing-si-noopt.ll index 693d06ce68d..70964348e31 100644 --- a/llvm/test/CodeGen/AMDGPU/indirect-addressing-si-noopt.ll +++ b/llvm/test/CodeGen/AMDGPU/indirect-addressing-si-noopt.ll @@ -29,15 +29,11 @@ entry: ; CHECK: s_cbranch_scc1 [[BB4:BB[0-9]+_[0-9]+]] ; CHECK: buffer_load_dwordx4 -; CHECK: s_mov_b32 m0, -; CHECK: v_movrels_b32_e32 ; CHECK: s_branch [[ENDBB:BB[0-9]+_[0-9]+]] ; CHECK: [[BB4]]: ; CHECK: buffer_load_dwordx4 -; CHECK: s_mov_b32 m0, -; CHECK: v_movrels_b32_e32 ; CHECK: [[ENDBB]]: ; CHECK: buffer_store_dword diff --git a/llvm/test/CodeGen/WebAssembly/simd.ll b/llvm/test/CodeGen/WebAssembly/simd.ll index 35f77c0da55..e13646c2aa5 100644 --- a/llvm/test/CodeGen/WebAssembly/simd.ll +++ b/llvm/test/CodeGen/WebAssembly/simd.ll @@ -584,13 +584,13 @@ define i32 @extract_var_v4i32(<4 x i32> %v, i32 %i) { ret i32 %elem } -; CHECK-LABEL: extract_undef_v4i32: +; CHECK-LABEL: extract_zero_v4i32: ; NO-SIMD128-NOT: i32x4 -; SIMD128-NEXT: .functype extract_undef_v4i32 (v128) -> (i32){{$}} +; SIMD128-NEXT: .functype extract_zero_v4i32 (v128) -> (i32){{$}} ; SIMD128-NEXT: i32x4.extract_lane $push[[R:[0-9]+]]=, $0, 0{{$}} ; SIMD128-NEXT: return $pop[[R]]{{$}} -define i32 @extract_undef_v4i32(<4 x i32> %v) { - %elem = extractelement <4 x i32> %v, i32 undef +define i32 @extract_zero_v4i32(<4 x i32> %v) { + %elem = extractelement <4 x i32> %v, i32 0 ret i32 %elem } @@ -737,14 +737,14 @@ define i64 @extract_var_v2i64(<2 x i64> %v, i32 %i) { ret i64 %elem } -; CHECK-LABEL: extract_undef_v2i64: +; CHECK-LABEL: extract_zero_v2i64: ; NO-SIMD128-NOT: i64x2 ; SIMD128-VM-NOT: i64x2 -; SIMD128-NEXT: .functype extract_undef_v2i64 (v128) -> (i64){{$}} +; SIMD128-NEXT: .functype extract_zero_v2i64 (v128) -> (i64){{$}} ; SIMD128-NEXT: i64x2.extract_lane $push[[R:[0-9]+]]=, $0, 0{{$}} ; SIMD128-NEXT: return $pop[[R]]{{$}} -define i64 @extract_undef_v2i64(<2 x i64> %v) { - %elem = extractelement <2 x i64> %v, i64 undef +define i64 @extract_zero_v2i64(<2 x i64> %v) { + %elem = extractelement <2 x i64> %v, i64 0 ret i64 %elem } @@ -890,13 +890,13 @@ define float @extract_var_v4f32(<4 x float> %v, i32 %i) { ret float %elem } -; CHECK-LABEL: extract_undef_v4f32: +; CHECK-LABEL: extract_zero_v4f32: ; NO-SIMD128-NOT: f32x4 -; SIMD128-NEXT: .functype extract_undef_v4f32 (v128) -> (f32){{$}} +; SIMD128-NEXT: .functype extract_zero_v4f32 (v128) -> (f32){{$}} ; SIMD128-NEXT: f32x4.extract_lane $push[[R:[0-9]+]]=, $0, 0{{$}} ; SIMD128-NEXT: return $pop[[R]]{{$}} -define float @extract_undef_v4f32(<4 x float> %v) { - %elem = extractelement <4 x float> %v, i32 undef +define float @extract_zero_v4f32(<4 x float> %v) { + %elem = extractelement <4 x float> %v, i32 0 ret float %elem } @@ -1042,14 +1042,14 @@ define double @extract_var_v2f64(<2 x double> %v, i32 %i) { ret double %elem } -; CHECK-LABEL: extract_undef_v2f64: +; CHECK-LABEL: extract_zero_v2f64: ; NO-SIMD128-NOT: f64x2 ; SIMD128-VM-NOT: f64x2 -; SIMD128-NEXT: .functype extract_undef_v2f64 (v128) -> (f64){{$}} +; SIMD128-NEXT: .functype extract_zero_v2f64 (v128) -> (f64){{$}} ; SIMD128-NEXT: f64x2.extract_lane $push[[R:[0-9]+]]=, $0, 0{{$}} ; SIMD128-NEXT: return $pop[[R]]{{$}} -define double @extract_undef_v2f64(<2 x double> %v) { - %elem = extractelement <2 x double> %v, i32 undef +define double @extract_zero_v2f64(<2 x double> %v) { + %elem = extractelement <2 x double> %v, i32 0 ret double %elem } diff --git a/llvm/test/CodeGen/X86/extractelement-index.ll b/llvm/test/CodeGen/X86/extractelement-index.ll index c70949aa9d2..a95c4daf3b0 100644 --- a/llvm/test/CodeGen/X86/extractelement-index.ll +++ b/llvm/test/CodeGen/X86/extractelement-index.ll @@ -11,16 +11,10 @@ define i64 @extract_undef_index_from_zero_vec() nounwind { ; SSE-LABEL: extract_undef_index_from_zero_vec: ; SSE: # %bb.0: -; SSE-NEXT: xorps %xmm0, %xmm0 -; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT: movq -{{[0-9]+}}(%rsp), %rax ; SSE-NEXT: retq ; ; AVX-LABEL: extract_undef_index_from_zero_vec: ; AVX: # %bb.0: -; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) -; AVX-NEXT: movq -{{[0-9]+}}(%rsp), %rax ; AVX-NEXT: retq %E = extractelement <2 x i64> zeroinitializer, i64 undef ret i64 %E @@ -29,16 +23,10 @@ define i64 @extract_undef_index_from_zero_vec() nounwind { define i64 @extract_undef_index_from_nonzero_vec() nounwind { ; SSE-LABEL: extract_undef_index_from_nonzero_vec: ; SSE: # %bb.0: -; SSE-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT: movq -{{[0-9]+}}(%rsp), %rax ; SSE-NEXT: retq ; ; AVX-LABEL: extract_undef_index_from_nonzero_vec: ; AVX: # %bb.0: -; AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp) -; AVX-NEXT: movq -{{[0-9]+}}(%rsp), %rax ; AVX-NEXT: retq %E = extractelement <2 x i64> <i64 -1, i64 -1>, i64 undef ret i64 %E |

