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

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 7 03:21:54 PDT 2025


alexey-bataev 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'
> ```



> 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'
> ```

Thanks for the reproducer!

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


More information about the llvm-commits mailing list