diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2013-09-21 20:36:04 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2013-09-21 20:36:04 +0000 |
commit | 1ce1525ed453aea78d17f28ec3c353d0cde5341f (patch) | |
tree | 1d6f090c1c7026a055b54d349b8c3e14fe70e724 /test/Transforms | |
parent | 189c6235e7d783928c94cbfe4bccb39e4bd0b84f (diff) | |
download | external_llvm-1ce1525ed453aea78d17f28ec3c353d0cde5341f.zip external_llvm-1ce1525ed453aea78d17f28ec3c353d0cde5341f.tar.gz external_llvm-1ce1525ed453aea78d17f28ec3c353d0cde5341f.tar.bz2 |
SROA: Handle casts involving vectors of pointers and integer scalars.
SROA wants to convert any types of equivalent widths but it's not possible to
convert vectors of pointers to an integer scalar with a single cast. As a
workaround we add a bitcast to the corresponding int ptr type first. This type
of cast used to be an edge case but has become common with SLP vectorization.
Fixes PR17271.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191143 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms')
-rw-r--r-- | test/Transforms/SROA/vector-conversion.ll | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/test/Transforms/SROA/vector-conversion.ll b/test/Transforms/SROA/vector-conversion.ll new file mode 100644 index 0000000..08d7960 --- /dev/null +++ b/test/Transforms/SROA/vector-conversion.ll @@ -0,0 +1,53 @@ +; RUN: opt < %s -sroa -S | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n8:16:32:64" + +define <4 x i64> @vector_ptrtoint({<2 x i32*>, <2 x i32*>} %x) { +; CHECK-LABEL: @vector_ptrtoint + %a = alloca {<2 x i32*>, <2 x i32*>} +; CHECK-NOT: alloca + + store {<2 x i32*>, <2 x i32*>} %x, {<2 x i32*>, <2 x i32*>}* %a +; CHECK-NOT: store + + %cast = bitcast {<2 x i32*>, <2 x i32*>}* %a to <4 x i64>* + %vec = load <4 x i64>* %cast +; CHECK-NOT: load +; CHECK: ptrtoint + + ret <4 x i64> %vec +} + +define <4 x i32*> @vector_inttoptr({<2 x i64>, <2 x i64>} %x) { +; CHECK-LABEL: @vector_inttoptr + %a = alloca {<2 x i64>, <2 x i64>} +; CHECK-NOT: alloca + + store {<2 x i64>, <2 x i64>} %x, {<2 x i64>, <2 x i64>}* %a +; CHECK-NOT: store + + %cast = bitcast {<2 x i64>, <2 x i64>}* %a to <4 x i32*>* + %vec = load <4 x i32*>* %cast +; CHECK-NOT: load +; CHECK: inttoptr + + ret <4 x i32*> %vec +} + +define <2 x i64> @vector_ptrtointbitcast({<1 x i32*>, <1 x i32*>} %x) { +; CHECK-LABEL: @vector_ptrtointbitcast + %a = alloca {<1 x i32*>, <1 x i32*>} +; CHECK-NOT: alloca + + store {<1 x i32*>, <1 x i32*>} %x, {<1 x i32*>, <1 x i32*>}* %a +; CHECK-NOT: store + + %cast = bitcast {<1 x i32*>, <1 x i32*>}* %a to <2 x i64>* + %vec = load <2 x i64>* %cast +; CHECK-NOT: load +; CHECK: ptrtoint +; CHECK: bitcast +; CHECK: ptrtoint +; CHECK: bitcast + + ret <2 x i64> %vec +} |