From 1772c1f529b69f7f5789ae679fa2597dfdab62ec Mon Sep 17 00:00:00 2001 From: Andrew Adams Date: Fri, 5 Aug 2022 12:30:20 -0700 Subject: [PATCH] Minimal approach to making Deinterleave correct for Reinterpret --- src/Deinterleave.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Deinterleave.cpp b/src/Deinterleave.cpp index e368d851d615..f5840a0074b3 100644 --- a/src/Deinterleave.cpp +++ b/src/Deinterleave.cpp @@ -275,6 +275,16 @@ class Deinterleaver : public IRGraphMutator { return expr; } + Expr give_up_and_shuffle(const Expr &e) { + // Uh-oh, we don't know how to deinterleave this vector expression + // Make llvm do it + std::vector indices; + for (int i = 0; i < new_lanes; i++) { + indices.push_back(starting_lane + lane_stride * i); + } + return Shuffle::make({e}, indices); + } + Expr visit(const Variable *op) override { if (op->type.is_scalar()) { return op; @@ -302,13 +312,7 @@ class Deinterleaver : public IRGraphMutator { lane_stride == 3) { return Variable::make(t, op->name + ".lanes_2_of_3", op->image, op->param, op->reduction_domain); } else { - // Uh-oh, we don't know how to deinterleave this vector expression - // Make llvm do it - std::vector indices; - for (int i = 0; i < new_lanes; i++) { - indices.push_back(starting_lane + lane_stride * i); - } - return Shuffle::make({op}, indices); + return give_up_and_shuffle(op); } } } @@ -325,6 +329,8 @@ class Deinterleaver : public IRGraphMutator { Expr visit(const Reinterpret *op) override { if (op->type.is_scalar()) { return op; + } else if (op->type.bits() != op->value.type().bits()) { + return give_up_and_shuffle(op); } else { Type t = op->type.with_lanes(new_lanes); return Reinterpret::make(t, mutate(op->value));