[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