[PATCH] D57059: [SLP] Initial support for the vectorization of the non-power-of-2 vectors.

Alexey Bataev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 22 05:43:44 PDT 2020


ABataev marked 2 inline comments as done.
ABataev added inline comments.


================
Comment at: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp:2625
+  }
+  auto InstructionsOnly = make_filter_range(VL, Instruction::classof);
 
----------------
dtemirbulatov wrote:
> what do you think about defining InstructionsOnly in InstructionsState?
I don't think it is really required. `InstructrionsOnly` is just a range, not a container


================
Comment at: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp:4813
         Type *VL0Ty = VL0->getOperand(j)->getType();
         Type *Ty = llvm::all_of(
                        VL, [VL0Ty](Value *V) { return VL0Ty == V->getType(); })
----------------
dtemirbulatov wrote:
> dtemirbulatov wrote:
> > hmm, it might be unsafe to try to obtain type here since any element of VL could be Undef?
> target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
> target triple = "x86_64-unknown-linux-gnu"
> 
> @e = dso_local local_unnamed_addr global i32 0, align 4
> @f = dso_local local_unnamed_addr global i32 0, align 4
> 
> ; Function Attrs: nofree norecurse nounwind uwtable
> define dso_local i32 @g() local_unnamed_addr #0 {
> entry:
>   %0 = load i32, i32* @e, align 4
>   %tobool.not19 = icmp eq i32 %0, 0
>   br i1 %tobool.not19, label %while.end, label %while.body
> 
> while.body:                                       ; preds = %entry, %while.body.backedge
>   %c.022 = phi i32* [ %c.022.be, %while.body.backedge ], [ undef, %entry ]
>   %b.021 = phi i32* [ %b.021.be, %while.body.backedge ], [ undef, %entry ]
>   %a.020 = phi i32* [ %a.020.be, %while.body.backedge ], [ undef, %entry ]
>   %incdec.ptr = getelementptr inbounds i32, i32* %c.022, i64 1
>   %1 = ptrtoint i32* %c.022 to i64
>   %2 = trunc i64 %1 to i32
>   %incdec.ptr1 = getelementptr inbounds i32, i32* %a.020, i64 1
>   %incdec.ptr2 = getelementptr inbounds i32, i32* %b.021, i64 1
>   switch i32 %2, label %while.body.backedge [
>     i32 2, label %sw.bb
>     i32 4, label %sw.bb6
>   ]
> 
> sw.bb:                                            ; preds = %while.body
>   %incdec.ptr3 = getelementptr inbounds i32, i32* %b.021, i64 2
>   %3 = ptrtoint i32* %incdec.ptr2 to i64
>   %4 = trunc i64 %3 to i32
>   %incdec.ptr4 = getelementptr inbounds i32, i32* %a.020, i64 2
>   store i32 %4, i32* %incdec.ptr1, align 4
>   %incdec.ptr5 = getelementptr inbounds i32, i32* %c.022, i64 2
>   br label %while.body.backedge
> 
> sw.bb6:                                           ; preds = %while.body
>   %incdec.ptr7 = getelementptr inbounds i32, i32* %a.020, i64 2
>   %incdec.ptr8 = getelementptr inbounds i32, i32* %c.022, i64 2
>   %5 = ptrtoint i32* %incdec.ptr to i64
>   %6 = trunc i64 %5 to i32
>   %incdec.ptr9 = getelementptr inbounds i32, i32* %b.021, i64 2
>   store i32 %6, i32* %incdec.ptr2, align 4
>   br label %while.body.backedge
> 
> while.body.backedge:                              ; preds = %sw.bb6, %while.body, %sw.bb
>   %c.022.be = phi i32* [ %incdec.ptr, %while.body ], [ %incdec.ptr8, %sw.bb6 ], [ %incdec.ptr5, %sw.bb ]
>   %b.021.be = phi i32* [ %incdec.ptr2, %while.body ], [ %incdec.ptr9, %sw.bb6 ], [ %incdec.ptr3, %sw.bb ]
>   %a.020.be = phi i32* [ %incdec.ptr1, %while.body ], [ %incdec.ptr7, %sw.bb6 ], [ %incdec.ptr4, %sw.bb ]
>   br label %while.body
> 
> while.end:                                        ; preds = %entry
>   ret i32 undef
> }
> 
> attributes #0 = { nofree norecurse nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+avx,+avx2,+cx8,+fxsr,+mmx,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave" "unsafe-fp-math"="false" "use-soft-float"="false" }
UndefValue also has an associated type, so it should be fine. Your reproducer crashes because of different reasons.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D57059/new/

https://reviews.llvm.org/D57059





More information about the llvm-commits mailing list