[llvm] Revert "[SLP]Support revectorization of the previously vectorized scalars" (PR #134604)

Alexander Kornienko via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 7 06:23:54 PDT 2025


alexfh wrote:

Another crash:
```
0.      Program arguments: ./clang-bad --target=aarch64-unknown-linux-gnu -c -o /dev/null -O2 reduced.ll
1.      Optimizer
2.      Running pass "function<eager-inv>(float2int,lower-constant-intrinsics,loop(loop-rotate<header-duplication;no-prepare-for-lto>,loop-deletion),loop-distribute,inject-tli-mappings,loop-vectorize<no-interleave-forced-only;no-vectorize-forced-only;>,infer-alignment,loop-load-elim,instcombine<max-iterations=1;no-verify-fixpoint>,simplifycfg<bonus-inst-threshold=1;forward-switch-cond;switch-range-to-icmp;switch-to-lookup;no-keep-loops;hoist-common-insts;no-hoist-loads-stores-with-cond-faulting;sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,slp-vectorizer,vector-combine,instcombine<max-iterations=1;no-verify-fixpoint>,loop-unroll<O2>,transform-warning,sroa<preserve-cfg>,infer-alignment,instcombine<max-iterations=1;no-verify-fixpoint>,loop-mssa(licm<allowspeculation>),alignment-from-assumptions,loop-sink,instsimplify,div-rem-pairs,tailcallelim,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;hoist-loads-stores-with-cond-faulting;no-sink-common-insts;speculate-blocks;simplify-cond-branch;speculate-unpredictables>)" on module "reduced.ll"
3.      Running pass "slp-vectorizer" on function "f"
```

Test:
```
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
target triple = "aarch64-unknown-linux-gnu"

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.objectsize.i64.p0(ptr, i1 immarg, i1 immarg, i1 immarg) #0

define void @f(ptr %0, i32 %1, i32 %.240, i8 %.2, i64 %2, i1 %.not59, i1 %.not60, ptr %3, ptr %4, i8 %5) {
  %7 = alloca [3 x i32], align 4
  br label %8

8:                                                ; preds = %9, %6
  br label %9

9:                                                ; preds = %47, %34, %23, %8
  %.2402 = phi i32 [ %.240, %8 ], [ 0, %47 ], [ 0, %34 ], [ 0, %23 ]
  %10 = icmp slt i32 %.2402, %1
  br i1 %10, label %11, label %8

11:                                               ; preds = %20, %9
  %.041 = phi i32 [ %21, %20 ], [ 0, %9 ]
  %.24 = phi i8 [ %.3, %20 ], [ 0, %9 ]
  %12 = icmp slt i32 %.041, 4
  br i1 %12, label %13, label %22

13:                                               ; preds = %11
  br i1 %.not59, label %20, label %14

14:                                               ; preds = %13
  %15 = zext i8 %5 to i32
  %16 = zext i8 %.2 to i32
  %17 = trunc i32 %.041 to i8
  store i32 %16, ptr %7, align 4
  %18 = getelementptr i8, ptr %7, i64 4
  store i32 %16, ptr %18, align 4
  %19 = getelementptr i8, ptr %7, i64 8
  store i32 %15, ptr %19, align 4
  br label %20

20:                                               ; preds = %14, %13
  %.3 = phi i8 [ %17, %14 ], [ %.2, %13 ]
  %21 = add i32 %.041, 1
  br label %11

22:                                               ; preds = %11
  switch i8 %.24, label %56 [
    i8 0, label %23
    i8 2, label %34
    i8 3, label %44
  ]

23:                                               ; preds = %25, %22
  %.042 = phi i32 [ %33, %25 ], [ 0, %22 ]
  %24 = icmp slt i32 %.042, 3
  br i1 %24, label %25, label %9

25:                                               ; preds = %23
  %26 = sext i32 %.042 to i64
  %27 = getelementptr [3 x i32], ptr %7, i64 0, i64 %26
  %28 = call i64 @llvm.objectsize.i64.p0(ptr %27, i1 false, i1 false, i1 false)
  %29 = icmp ne i64 %28, 0
  call void @llvm.assume(i1 %29)
  %30 = load i32, ptr %27, align 4
  %31 = mul i32 %30, 3
  %32 = getelementptr [3 x i32], ptr %3, i64 0, i64 %26
  store i32 %31, ptr %32, align 4
  %33 = add i32 %.042, 1
  br label %23

34:                                               ; preds = %40, %22
  %.143 = phi i32 [ %43, %40 ], [ 0, %22 ]
  %35 = icmp slt i32 %.143, 3
  br i1 %35, label %36, label %9

36:                                               ; preds = %34
  %37 = sext i32 %.143 to i64
  %38 = or i64 %2, %37
  %.not = icmp eq i64 %38, 0
  br i1 %.not, label %39, label %40

39:                                               ; preds = %36
  store volatile i64 0, ptr null, align 8
  unreachable

40:                                               ; preds = %36
  %41 = getelementptr [3 x i32], ptr %7, i64 0, i64 %37
  %42 = load i32, ptr %41, align 4
  store i32 %42, ptr %0, align 4
  %43 = add i32 %.143, 1
  br label %34

44:                                               ; preds = %45, %22
  br i1 %.not60, label %45, label %47

45:                                               ; preds = %44
  %46 = load i32, ptr %7, align 4
  store i32 %46, ptr %0, align 4
  br label %44

47:                                               ; preds = %49, %44
  %.345 = phi i32 [ %55, %49 ], [ 0, %44 ]
  %48 = icmp slt i32 %.345, 3
  br i1 %48, label %49, label %9

49:                                               ; preds = %47
  %50 = sext i32 %.345 to i64
  %51 = getelementptr [3 x i32], ptr %7, i64 0, i64 %50
  %52 = load i32, ptr %51, align 4
  %53 = shl i32 %52, 1
  %54 = getelementptr [3 x i32], ptr %4, i64 0, i64 %50
  store i32 %53, ptr %54, align 4
  %55 = add i32 %.345, 1
  br label %47

56:                                               ; preds = %22
  unreachable
}

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write)
declare void @llvm.assume(i1 noundef) #1

attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
```

https://github.com/llvm/llvm-project/pull/134604


More information about the llvm-commits mailing list