[llvm] [SLP]Support revectorization of the previously vectorized scalars (PR #133091)

Alexander Kornienko via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 7 03:19:50 PDT 2025


alexfh wrote:

Test case (also in https://gcc.godbolt.org/z/nsjaqfoT8):
```
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define void @_f(ptr %0, i8 %1, i8 %2) #0 {
  %4 = or i8 %1, 1
  %5 = getelementptr i8, ptr %0, i64 13520
  store i8 %4, ptr %5, align 4
  %6 = getelementptr i8, ptr %0, i64 13521
  store i8 %4, ptr %6, align 1
  %7 = getelementptr i8, ptr %0, i64 13522
  store i8 %4, ptr %7, align 2
  %8 = load i8, ptr %0, align 2
  %9 = or i8 %2, 1
  %10 = getelementptr i8, ptr %0, i64 13523
  store i8 %9, ptr %10, align 1
  %11 = getelementptr i8, ptr %0, i64 13524
  store i8 %4, ptr %11, align 4
  %12 = getelementptr i8, ptr %0, i64 13525
  store i8 %4, ptr %12, align 1
  %13 = getelementptr i8, ptr %0, i64 13526
  store i8 %4, ptr %13, align 2
  %14 = getelementptr i8, ptr %0, i64 13445
  %15 = load i8, ptr %14, align 1
  %16 = getelementptr i8, ptr %0, i64 13527
  store i8 %4, ptr %16, align 1
  %17 = getelementptr i8, ptr %0, i64 13428
  %18 = load i8, ptr %17, align 4
  %19 = or i8 %18, 1
  %20 = getelementptr i8, ptr %0, i64 13528
  store i8 %19, ptr %20, align 4
  %21 = getelementptr i8, ptr %0, i64 13429
  %22 = load i8, ptr %21, align 1
  %23 = or i8 %22, 1
  %24 = getelementptr i8, ptr %0, i64 13529
  store i8 %23, ptr %24, align 1
  %25 = getelementptr i8, ptr %0, i64 13430
  %26 = load i8, ptr %25, align 2
  %27 = or i8 %26, 1
  %28 = getelementptr i8, ptr %0, i64 13530
  store i8 %27, ptr %28, align 2
  %29 = getelementptr i8, ptr %0, i64 13431
  %30 = load i8, ptr %29, align 1
  %31 = or i8 %30, 1
  %32 = getelementptr i8, ptr %0, i64 13531
  store i8 %31, ptr %32, align 1
  %33 = getelementptr i8, ptr %0, i64 13432
  %34 = load i8, ptr %33, align 4
  %35 = or i8 %34, 1
  %36 = getelementptr i8, ptr %0, i64 13532
  store i8 %35, ptr %36, align 4
  %37 = getelementptr i8, ptr %0, i64 13433
  %38 = load i8, ptr %37, align 1
  %39 = or i8 %38, 1
  %40 = getelementptr i8, ptr %0, i64 13533
  store i8 %39, ptr %40, align 1
  %41 = getelementptr i8, ptr %0, i64 13434
  %42 = load i8, ptr %41, align 2
  %43 = or i8 %42, 1
  %44 = getelementptr i8, ptr %0, i64 13534
  store i8 %43, ptr %44, align 2
  %45 = getelementptr i8, ptr %0, i64 13435
  %46 = load i8, ptr %45, align 1
  %47 = or i8 %46, 1
  %48 = getelementptr i8, ptr %0, i64 13535
  store i8 %47, ptr %48, align 1
  %49 = getelementptr i8, ptr %0, i64 13442
  %50 = load i8, ptr %49, align 2
  %51 = or i8 %50, %15
  %52 = getelementptr i8, ptr %0, i64 13550
  store i8 %51, ptr %52, align 2
  %53 = or i8 %42, %50
  %54 = getelementptr i8, ptr %0, i64 13542
  store i8 %53, ptr %54, align 2
  %55 = getelementptr i8, ptr %0, i64 13438
  %56 = load i8, ptr %55, align 2
  %57 = or i8 %56, %8
  %58 = getelementptr i8, ptr %0, i64 13546
  store i8 %57, ptr %58, align 2
  %59 = or i8 %26, %56
  %60 = getelementptr i8, ptr %0, i64 13538
  store i8 %59, ptr %60, align 2
  %61 = getelementptr i8, ptr %0, i64 13440
  %62 = load i8, ptr %61, align 4
  %63 = or i8 %62, %15
  %64 = getelementptr i8, ptr %0, i64 13548
  store i8 %63, ptr %64, align 4
  %65 = or i8 %34, %62
  %66 = getelementptr i8, ptr %0, i64 13540
  store i8 %65, ptr %66, align 4
  %67 = getelementptr i8, ptr %0, i64 13436
  %68 = load i8, ptr %67, align 4
  %69 = getelementptr i8, ptr %0, i64 13444
  %70 = load i8, ptr %69, align 4
  %71 = or i8 %68, %70
  %72 = getelementptr i8, ptr %0, i64 13544
  store i8 %71, ptr %72, align 4
  %73 = or i8 %18, %68
  %74 = getelementptr i8, ptr %0, i64 13536
  store i8 %73, ptr %74, align 4
  %75 = getelementptr i8, ptr %0, i64 13443
  %76 = load i8, ptr %75, align 1
  %77 = or i8 %76, %15
  %78 = getelementptr i8, ptr %0, i64 13551
  store i8 %77, ptr %78, align 1
  %79 = or i8 %46, %76
  %80 = getelementptr i8, ptr %0, i64 13543
  store i8 %79, ptr %80, align 1
  %81 = getelementptr i8, ptr %0, i64 13439
  %82 = load i8, ptr %81, align 1
  %83 = or i8 %82, %15
  %84 = getelementptr i8, ptr %0, i64 13547
  store i8 %83, ptr %84, align 1
  %85 = or i8 %30, %82
  %86 = getelementptr i8, ptr %0, i64 13539
  store i8 %85, ptr %86, align 1
  %87 = getelementptr i8, ptr %0, i64 13441
  %88 = load i8, ptr %87, align 1
  %89 = or i8 %88, %15
  %90 = getelementptr i8, ptr %0, i64 13549
  store i8 %89, ptr %90, align 1
  %91 = or i8 %38, %88
  %92 = getelementptr i8, ptr %0, i64 13541
  store i8 %91, ptr %92, align 1
  %93 = getelementptr i8, ptr %0, i64 13437
  %94 = load i8, ptr %93, align 1
  %95 = load i8, ptr %0, align 1
  %96 = or i8 %94, %95
  %97 = getelementptr i8, ptr %0, i64 13545
  store i8 %96, ptr %97, align 1
  %98 = or i8 %22, %94
  %99 = getelementptr i8, ptr %0, i64 13537
  store i8 %98, ptr %99, align 1
  ret void
}

attributes #0 = { "prefer-vector-width"="128" "target-features"="+avx" }
```

```
Stack dump:
0.      Program arguments: ./clang-bad -O3 -c -o /dev/null reduced.ll
1.      Code generation
2.      Running pass 'Function Pass Manager' on module 'reduced.ll'.
3.      Running pass 'Machine Instruction Scheduler' on function '@_f'
```

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


More information about the llvm-commits mailing list