[llvm] [SLP] Vectorize full insertvalue buildvector sequences (PR #200274)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 19 11:16:48 PDT 2026
alexey-bataev wrote:
> This is causing another crash: The crash occurs during the Machine Instruction Scheduler pass.
>
> ```
> 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"
>
> %struct.barney = type { float, float }
> %struct.spam = type { %struct.blam, %struct.eggs, %struct.barney.0, %struct.wombat }
> %struct.blam = type { i32 }
> %struct.eggs = type { i32 }
> %struct.barney.0 = type { i32 }
> %struct.wombat = type { i32 }
>
> define <2 x float> @ham(ptr %arg, ptr %arg1) {
> bb:
> %alloca = alloca %struct.barney, align 4
> %getelementptr = getelementptr i8, ptr %arg1, i64 4
> %load = load float, ptr %arg, align 4
> %load2 = load float, ptr %arg1, align 4
> %fmul = fmul float %load, %load2
> %load3 = load float, ptr inttoptr (i64 4 to ptr), align 4
> %load4 = load float, ptr %getelementptr, align 4
> %fmul5 = fmul float %load3, %load4
> %fadd = fadd float %fmul, %fmul5
> call void @baz(ptr %alloca, float %fadd, float 0.000000e+00)
> %load6 = load <2 x float>, ptr %alloca, align 4
> ret <2 x float> %load6
> }
>
> define void @baz(ptr %arg, float %arg1, float %arg2) {
> bb:
> store float %arg1, ptr %arg, align 4
> %getelementptr = getelementptr i8, ptr %arg, i64 4
> store float %arg2, ptr %getelementptr, align 4
> ret void
> }
>
> define void @wibble(ptr %arg, i32 %arg1, i32 %arg2) {
> bb:
> store i32 %arg1, ptr %arg, align 4
> %getelementptr = getelementptr i8, ptr %arg, i64 8
> store i32 %arg2, ptr %getelementptr, align 4
> ret void
> }
>
> define { i64, i64 } @bar(ptr %arg, ptr %arg1) {
> bb:
> %alloca = alloca %struct.spam, align 4
> %alloca2 = alloca %struct.barney, align 4
> %alloca3 = alloca %struct.barney, align 4
> %load = load i32, ptr %arg1, align 4
> %sitofp = sitofp i32 %load to float
> call void @baz(ptr %alloca2, float %sitofp, float 0.000000e+00)
> %getelementptr = getelementptr i8, ptr %arg1, i64 4
> %load4 = load i32, ptr %getelementptr, align 4
> %sitofp5 = sitofp i32 %load4 to float
> call void @baz(ptr %alloca3, float 0.000000e+00, float %sitofp5)
> %call = call <2 x float> @ham(ptr %arg, ptr %alloca2)
> %extractelement = extractelement <2 x float> %call, i64 0
> %call6 = call <2 x float> @ham(ptr %arg, ptr %alloca3)
> %extractelement7 = extractelement <2 x float> %call6, i64 0
> %fpext = fpext float %extractelement7 to double
> %call8 = call i32 @eggs(double %fpext)
> %fpext9 = fpext float %extractelement to double
> %call10 = call i32 @eggs(double %fpext9)
> call void @wibble(ptr %alloca, i32 %call8, i32 %call10)
> %load11 = load i64, ptr %alloca, align 4
> %insertvalue = insertvalue { i64, i64 } poison, i64 %load11, 0
> %getelementptr12 = getelementptr i8, ptr %alloca, i64 8
> %load13 = load i64, ptr %getelementptr12, align 4
> %insertvalue14 = insertvalue { i64, i64 } %insertvalue, i64 %load13, 1
> ret { i64, i64 } %insertvalue14
> }
>
> define i32 @eggs(double %arg) {
> bb:
> %bitcast = bitcast double %arg to i64
> %trunc = trunc i64 %bitcast to i32
> ret i32 %trunc
> }
>
> ; uselistorder directives
> uselistorder ptr @eggs, { 1, 0 }
> ```
>
> cmd:
>
> ```
> clang \
> -fno-omit-frame-pointer \
> -no-canonical-prefixes \
> -O2 \
> --target=x86_64-unknown-linux-gnu \
> -fsanitize=undefined,nullability \
> -fno-sanitize-trap=all \
> -fno-sanitize-recover=all \
> -c -o /dev/null \
> reduced.ll
> ```
>
> Note: The sanitizer flags -fsanitize=undefined,nullability and optimization -O2 are critical to trigger the crash in the Machine Instruction Scheduler pass.
Create the issue against Machine Instruction Scheduler, it is not related to SLP
https://github.com/llvm/llvm-project/pull/200274
More information about the llvm-commits
mailing list