Repository: incubator-impala
Updated Branches:
  refs/heads/master a60ba6d27 -> 20ef3b016


IMPALA-4058: ByteSwap256 assumed memory was 16-byte aligned.

This changes the code to use the lddqu and movdqu instructions (via
Intel intrinsics) to allow unaligned memory access.

Change-Id: I39b2b47bb717d5ac9727512a24fcf8a8a6a8dcc6
Reviewed-on: http://gerrit.cloudera.org:8080/4205
Reviewed-by: Tim Armstrong <[email protected]>
Reviewed-by: Dan Hecht <[email protected]>
Tested-by: Internal Jenkins


Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/20ef3b01
Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/20ef3b01
Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/20ef3b01

Branch: refs/heads/master
Commit: 20ef3b016e69db3d508b4dd615ee07b41b2cf336
Parents: a60ba6d
Author: Jim Apple <[email protected]>
Authored: Thu Sep 1 05:53:42 2016 -0700
Committer: Internal Jenkins <[email protected]>
Committed: Fri Sep 2 01:47:08 2016 +0000

----------------------------------------------------------------------
 be/src/exprs/expr-test.cc                       | 12 ++++++++-
 be/src/util/bit-util-test.cc                    | 26 +++++++++++++-------
 be/src/util/bit-util.cc                         |  8 +++---
 .../queries/QueryTest/exprs.test                | 12 +++++++++
 4 files changed, 44 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/20ef3b01/be/src/exprs/expr-test.cc
----------------------------------------------------------------------
diff --git a/be/src/exprs/expr-test.cc b/be/src/exprs/expr-test.cc
index c293ff4..67bbe0a 100644
--- a/be/src/exprs/expr-test.cc
+++ b/be/src/exprs/expr-test.cc
@@ -270,7 +270,7 @@ class ExprTest : public testing::Test {
     return results;
   }
 
-  void TestNextDayFunction(){
+  void TestNextDayFunction() {
     // Sequential test cases
     TestTimestampValue("next_day('2016-05-01','Sunday')",
       TimestampValue("2016-05-08 00:00:00", 19));
@@ -2231,6 +2231,16 @@ TEST_F(ExprTest, StringFunctions) {
   }
 }
 
+TEST_F(ExprTest, LongReverse) {
+  static const int MAX_LEN = 2048;
+  string to_reverse(MAX_LEN, ' '), reversed(MAX_LEN, ' ');
+  for (int i = 0; i < MAX_LEN; ++i) {
+    to_reverse[i] = reversed[MAX_LEN - 1 - i] = 'a' + (rand() % 26);
+    TestStringValue("reverse('" + to_reverse.substr(0, i + 1) + "')",
+        reversed.substr(MAX_LEN - 1 - i));
+  }
+}
+
 TEST_F(ExprTest, StringRegexpFunctions) {
   // Single group.
   TestStringValue("regexp_extract('abxcy1234a', 'a.x', 0)", "abx");

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/20ef3b01/be/src/util/bit-util-test.cc
----------------------------------------------------------------------
diff --git a/be/src/util/bit-util-test.cc b/be/src/util/bit-util-test.cc
index 9bfd494..a7a1b85 100644
--- a/be/src/util/bit-util-test.cc
+++ b/be/src/util/bit-util-test.cc
@@ -113,15 +113,23 @@ void TestByteSwapSimd_Unit(const int64_t CpuFlag) {
   }
 
   DCHECK(bswap_fptr != NULL);
-  uint8_t src_buf[buf_size];
-  uint8_t dst_buf[buf_size];
-  std::iota(src_buf, src_buf + buf_size, 0);
-  bswap_fptr(src_buf, dst_buf);
-
-  // Validate the swap results.
-  for (int j = 0; j < buf_size; ++j) {
-    EXPECT_EQ(dst_buf[j], buf_size - j - 1);
-    EXPECT_EQ(dst_buf[j], src_buf[buf_size - j - 1]);
+  // IMPALA-4058: test that bswap_fptr works when it reads to o writes from 
memory with
+  // any alignment.
+  static const size_t MAX_ALIGNMENT = 64;
+  uint8_t src_buf[buf_size + MAX_ALIGNMENT];
+  uint8_t dst_buf[buf_size + MAX_ALIGNMENT];
+  std::iota(src_buf, src_buf + buf_size + MAX_ALIGNMENT, 1);
+  for (size_t i = 0; i < MAX_ALIGNMENT; ++i) {
+    for (size_t j = 0; j < MAX_ALIGNMENT; ++j) {
+      std::fill(dst_buf, dst_buf + buf_size + MAX_ALIGNMENT, 0);
+      bswap_fptr(src_buf + i, dst_buf + j);
+
+      // Validate the swap results.
+      for (int k = 0; k < buf_size; ++k) {
+        EXPECT_EQ(dst_buf[k + j], 1 + i + buf_size - k - 1);
+        EXPECT_EQ(dst_buf[k + j], src_buf[i + buf_size - k - 1]);
+      }
+    }
   }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/20ef3b01/be/src/util/bit-util.cc
----------------------------------------------------------------------
diff --git a/be/src/util/bit-util.cc b/be/src/util/bit-util.cc
index 76224c8..c8a7318 100644
--- a/be/src/util/bit-util.cc
+++ b/be/src/util/bit-util.cc
@@ -155,10 +155,10 @@ inline void SimdByteSwap::ByteSwap256(const uint8_t* src, 
uint8_t* dst) {
     11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
   _mm256_storeu_si256(reinterpret_cast<__m256i*>(dst), _mm256_shuffle_epi8(
       _mm256_loadu_si256(reinterpret_cast<const __m256i*>(src)), mask256i));
-  __m128i part1 = *reinterpret_cast<__m128i*>(dst);
-  __m128i part2 = *reinterpret_cast<__m128i*>(dst + 16);
-  *reinterpret_cast<__m128i*>(dst) = part2;
-  *reinterpret_cast<__m128i*>(dst + 16) = part1;
+  const __m128i part1 = _mm_loadu_si128(reinterpret_cast<__m128i*>(dst));
+  const __m128i part2 = _mm_loadu_si128(reinterpret_cast<__m128i*>(dst + 16));
+  _mm_storeu_si128(reinterpret_cast<__m128i*>(dst), part2);
+  _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + 16), part1);
   _mm256_zeroupper();
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/20ef3b01/testdata/workloads/functional-query/queries/QueryTest/exprs.test
----------------------------------------------------------------------
diff --git a/testdata/workloads/functional-query/queries/QueryTest/exprs.test 
b/testdata/workloads/functional-query/queries/QueryTest/exprs.test
index 1061247..5cf4c43 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/exprs.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/exprs.test
@@ -2482,3 +2482,15 @@ select cast('1.23' as double), cast('.1.23' as float), 
cast('123.456.' as double
 ---- TYPES
 double,float,double,double,float,double
 ====
+---- QUERY
+# IMPALA-4058: reverse assumed memory was 16-byte aligned; reverse 16, 17, 32, 
33, and 64
+# byte strings
+select reverse('123456789abcdef0'), reverse('123456789abcdef01'),
+    reverse('123456789abcdef0!@#$%^&*(ABCDEF)'),
+    reverse('123456789abcdef0!@#$%^&*(ABCDEF)`'),
+    reverse('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ345678901234')
+---- RESULTS
+'0fedcba987654321','10fedcba987654321',')FEDCBA(*&^%$#@!0fedcba987654321','`)FEDCBA(*&^%$#@!0fedcba987654321','432109876543ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba'
+---- TYPES
+STRING,STRING,STRING,STRING,STRING
+====

Reply via email to