Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
SUSE:SLE-12-SP1:Update
llvm.7809
backport-llvm-r236529
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File backport-llvm-r236529 of Package llvm.7809
------------------------------------------------------------------------ r236529 | uweigand | 2015-05-05 21:33:37 +0200 (Tue, 05 May 2015) | 12 lines [DAGCombiner] Fix ReplaceExtractVectorEltOfLoadWithNarrowedLoad for BE For little-endian, the function would convert (extract_vector_elt (load X), Y) to X + Y*sizeof(elt). For big-endian it would instead use X + sizeof(vec) - Y*sizeof(elt). The big-endian case wasn't right since vector index order always follows memory/array order, even for big-endian. (Note that the current handling has to be wrong for Y==0 since it would access beyond the end of the vector.) Original patch by Richard Sandiford. ------------------------------------------------------------------------ Index: test/CodeGen/SystemZ/vec-extract-01.ll =================================================================== --- /dev/null +++ test/CodeGen/SystemZ/vec-extract-01.ll @@ -0,0 +1,13 @@ +; Verify ReplaceExtractVectorEltOfLoadWithNarrowedLoad fixes +; +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s + +; Test a memory copy of a v2i32 (via the constant pool). +define void @f1(<2 x i32> *%dest) { +; CHECK-LABEL: f1: +; CHECK: lgrl [[REG:%r[0-5]]], {{[._A-Za-z0-9]}} +; CHECK: stg [[REG]], 0(%r2) +; CHECK: br %r14 + store <2 x i32> <i32 1000000, i32 99999>, <2 x i32> *%dest + ret void +} Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp.orig +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -9328,18 +9328,12 @@ SDValue DAGCombiner::ReplaceExtractVecto if (ConstantSDNode *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo)) { int Elt = ConstEltNo->getZExtValue(); unsigned PtrOff = VecEltVT.getSizeInBits() * Elt / 8; - if (TLI.isBigEndian()) - PtrOff = InVecVT.getSizeInBits() / 8 - PtrOff; Offset = DAG.getConstant(PtrOff, PtrType); MPI = OriginalLoad->getPointerInfo().getWithOffset(PtrOff); } else { Offset = DAG.getNode( ISD::MUL, SDLoc(EVE), EltNo.getValueType(), EltNo, DAG.getConstant(VecEltVT.getStoreSize(), EltNo.getValueType())); - if (TLI.isBigEndian()) - Offset = DAG.getNode( - ISD::SUB, SDLoc(EVE), EltNo.getValueType(), - DAG.getConstant(InVecVT.getStoreSize(), EltNo.getValueType()), Offset); MPI = OriginalLoad->getPointerInfo(); } NewPtr = DAG.getNode(ISD::ADD, SDLoc(EVE), PtrType, NewPtr, Offset);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor