diff options
author | Vincent Lejeune <vljn@ovi.com> | 2013-07-09 15:03:25 +0000 |
---|---|---|
committer | Vincent Lejeune <vljn@ovi.com> | 2013-07-09 15:03:25 +0000 |
commit | f4bdec2ebeb1306a77e9377583c5799199775f88 (patch) | |
tree | 6eb7841861e9ae79c17404ad48b2584d2c402d2c /lib/Target/R600/R600ISelLowering.cpp | |
parent | 07bb3f1d0a6638dd96566eeca1b38f315576216c (diff) | |
download | llvm-f4bdec2ebeb1306a77e9377583c5799199775f88.tar.gz llvm-f4bdec2ebeb1306a77e9377583c5799199775f88.tar.bz2 llvm-f4bdec2ebeb1306a77e9377583c5799199775f88.tar.xz |
R600: Fix a rare bug where swizzle optimization returns wrong values
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185942 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/R600/R600ISelLowering.cpp')
-rw-r--r-- | lib/Target/R600/R600ISelLowering.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/Target/R600/R600ISelLowering.cpp b/lib/Target/R600/R600ISelLowering.cpp index 4413734b40..ad4fd87b79 100644 --- a/lib/Target/R600/R600ISelLowering.cpp +++ b/lib/Target/R600/R600ISelLowering.cpp @@ -1296,6 +1296,8 @@ static SDValue ReorganizeVector(SelectionDAG &DAG, SDValue VectorEntry, VectorEntry.getOperand(3) }; bool isUnmovable[4] = { false, false, false, false }; + for (unsigned i = 0; i < 4; i++) + RemapSwizzle[i] = i; for (unsigned i = 0; i < 4; i++) { if (NewBldVec[i].getOpcode() == ISD::EXTRACT_VECTOR_ELT) { @@ -1304,8 +1306,7 @@ static SDValue ReorganizeVector(SelectionDAG &DAG, SDValue VectorEntry, if (!isUnmovable[Idx]) { // Swap i and Idx std::swap(NewBldVec[Idx], NewBldVec[i]); - RemapSwizzle[Idx] = i; - RemapSwizzle[i] = Idx; + std::swap(RemapSwizzle[RemapSwizzle[Idx]], RemapSwizzle[RemapSwizzle[i]]); } isUnmovable[Idx] = true; } |