[PATCH] D124326: [AArch64][SVE] Fix assertions when vectorizing Freeze Instructions

lizhijin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Apr 23 02:24:23 PDT 2022


lizhijin created this revision.
lizhijin added reviewers: mkuper, sdesmalen.
Herald added subscribers: psnobl, hiraditya, kristof.beyls, tschuett.
Herald added a reviewer: efriedma.
Herald added a project: All.
lizhijin requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

https://reviews.llvm.org/D124326

Files:
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  llvm/test/Transforms/LoopVectorize/AArch64/vector-freeze-sve.ll


Index: llvm/test/Transforms/LoopVectorize/AArch64/vector-freeze-sve.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/LoopVectorize/AArch64/vector-freeze-sve.ll
@@ -0,0 +1,43 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -loop-vectorize -mattr=+sve  -mtriple aarch64-linux-gnu -S < %s | FileCheck %s
+
+target triple = "aarch64-unknown-linux-gnu"
+
+; Function Attrs: argmemonly nofree nosync nounwind willreturn
+declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #0
+
+; Function Attrs: argmemonly nofree nosync nounwind willreturn
+declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #0
+
+define void @_Z14PDF_NameEncodeRK14CFX_ByteString() #1 personality i8* undef {
+; CHECK-LABEL: @_Z14PDF_NameEncodeRK14CFX_ByteString(
+; CHECK:    ret void
+;
+for.body.preheader:
+  br label %for.body
+
+for.body:                                         ; preds = %if.end, %for.body.preheader
+  %indvars.iv132 = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next133, %if.end ]
+  %arrayidx = getelementptr inbounds [1 x i8], [1 x i8]* undef, i64 0, i64 %indvars.iv132
+  %0 = load i8, i8* %arrayidx, align 1
+  br i1 false, label %if.end, label %lor.lhs.false
+
+lor.lhs.false:                                    ; preds = %for.body
+  %.fr122 = freeze i8 %0
+  %cmp9 = icmp eq i8 %.fr122, 0
+  br i1 %cmp9, label %if.end, label %switch.early.test
+
+switch.early.test:                                ; preds = %lor.lhs.false
+  br label %if.end
+
+if.end:                                           ; preds = %switch.early.test, %lor.lhs.false, %for.body
+  %indvars.iv.next133 = add nuw nsw i64 %indvars.iv132, 1
+  %exitcond136.not = icmp eq i64 %indvars.iv.next133, 0
+  br i1 %exitcond136.not, label %for.end.loopexit, label %for.body
+
+for.end.loopexit:                                 ; preds = %if.end
+  ret void
+}
+
+attributes #0 = { argmemonly nofree nosync nounwind willreturn }
+attributes #1 = { "target-features"="+aes,+crypto,+neon,+sha2,+v8a" }
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -10527,8 +10527,9 @@
   // instruction is uniform inwhich case generate only the first lane for each
   // of the UF parts.
   unsigned EndLane = IsUniform ? 1 : State.VF.getKnownMinValue();
-  assert((!State.VF.isScalable() || IsUniform) &&
-         "Can't scalarize a scalable vector");
+  assert((!State.VF.isScalable() || IsUniform) ||
+         getUnderlyingInstr()->getOpcode() == Instruction::Freeze &&
+             "Can't scalarize a scalable vector");
   for (unsigned Part = 0; Part < State.UF; ++Part)
     for (unsigned Lane = 0; Lane < EndLane; ++Lane)
       State.ILV->scalarizeInstruction(getUnderlyingInstr(), this,
@@ -10841,7 +10842,9 @@
     set(Def, VectorValue, Part);
   } else {
     // Initialize packing with insertelements to start from undef.
-    assert(!VF.isScalable() && "VF is assumed to be non scalable.");
+    assert(!VF.isScalable() ||
+           (LastInst && LastInst->getOpcode() == Instruction::Freeze) &&
+               "VF is assumed to be non scalable.");
     Value *Undef = PoisonValue::get(VectorType::get(LastInst->getType(), VF));
     set(Def, Undef, Part);
     for (unsigned Lane = 0; Lane < VF.getKnownMinValue(); ++Lane)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124326.424707.patch
Type: text/x-patch
Size: 3502 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220423/30dd532c/attachment.bin>


More information about the llvm-commits mailing list