diff options
Diffstat (limited to 'llvm/test')
90 files changed, 7019 insertions, 1477 deletions
diff --git a/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll b/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll index fa53a18..1920fc9 100644 --- a/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll +++ b/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll @@ -1,17 +1,6 @@  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=256 | FileCheck %s -D#VBITS=256 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=384 | FileCheck %s -D#VBITS=256  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=512 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=640 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=768 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=896 | FileCheck %s -D#VBITS=512  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1024 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1152 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1280 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1408 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1536 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1664 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1792 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1920 | FileCheck %s -D#VBITS=1024  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=2048 | FileCheck %s -D#VBITS=2048  target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" diff --git a/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll b/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll index df40a96..e128987 100644 --- a/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll +++ b/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll @@ -1,19 +1,8 @@  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output | FileCheck %s -D#VBITS=128  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=128 | FileCheck %s -D#VBITS=128  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=256 | FileCheck %s -D#VBITS=256 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=384 | FileCheck %s -D#VBITS=256  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=512 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=640 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=768 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=896 | FileCheck %s -D#VBITS=512  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1024 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1152 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1280 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1408 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1536 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1664 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1792 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1920 | FileCheck %s -D#VBITS=1024  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=2048 | FileCheck %s -D#VBITS=2048  ; VBITS represents the useful bit size of a vector register from the code diff --git a/llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll b/llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll index 362586a..4fc506f 100644 --- a/llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll +++ b/llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll @@ -87,6 +87,11 @@ declare void @llvm.nvvm.barrier(i32, i32)  declare void @llvm.nvvm.barrier.sync(i32)  declare void @llvm.nvvm.barrier.sync.cnt(i32, i32) +declare float @llvm.nvvm.ex2.approx.f(float) +declare double @llvm.nvvm.ex2.approx.d(double) +declare <2 x half> @llvm.nvvm.ex2.approx.f16x2(<2 x half>) +declare float @llvm.nvvm.ex2.approx.ftz.f(float) +  ; CHECK-LABEL: @simple_upgrade  define void @simple_upgrade(i32 %a, i64 %b, i16 %c) {  ; CHECK: call i32 @llvm.bitreverse.i32(i32 %a) @@ -355,3 +360,15 @@ define void @cta_barriers(i32 %x, i32 %y) {    call void @llvm.nvvm.barrier.sync.cnt(i32 %x, i32 %y)    ret void  } + +define void @nvvm_ex2_approx(float %a, double %b, half %c, <2 x half> %d) { +; CHECK: call float @llvm.nvvm.ex2.approx.f32(float %a) +; CHECK: call double @llvm.nvvm.ex2.approx.f64(double %b) +; CHECK: call <2 x half> @llvm.nvvm.ex2.approx.v2f16(<2 x half> %d) +; CHECK: call float @llvm.nvvm.ex2.approx.ftz.f32(float %a) +  %r1 = call float @llvm.nvvm.ex2.approx.f(float %a) +  %r2 = call double @llvm.nvvm.ex2.approx.d(double %b) +  %r3 = call <2 x half> @llvm.nvvm.ex2.approx.f16x2(<2 x half> %d) +  %r4 = call float @llvm.nvvm.ex2.approx.ftz.f(float %a) +  ret void +} diff --git a/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll b/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll index b54f262..4894932 100644 --- a/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll +++ b/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll @@ -755,199 +755,117 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none  ; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1  ; CHECK-SD-NEXT:    cbz w2, .LBB6_3  ; CHECK-SD-NEXT:  // %bb.1: // %iter.check -; CHECK-SD-NEXT:    str x25, [sp, #-64]! // 8-byte Folded Spill -; CHECK-SD-NEXT:    stp x24, x23, [sp, #16] // 16-byte Folded Spill -; CHECK-SD-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill -; CHECK-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill -; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64 -; CHECK-SD-NEXT:    .cfi_offset w19, -8 -; CHECK-SD-NEXT:    .cfi_offset w20, -16 -; CHECK-SD-NEXT:    .cfi_offset w21, -24 -; CHECK-SD-NEXT:    .cfi_offset w22, -32 -; CHECK-SD-NEXT:    .cfi_offset w23, -40 -; CHECK-SD-NEXT:    .cfi_offset w24, -48 -; CHECK-SD-NEXT:    .cfi_offset w25, -64 -; CHECK-SD-NEXT:    sxtb x9, w1  ; CHECK-SD-NEXT:    cmp w2, #3 -; CHECK-SD-NEXT:    mov w10, w2 +; CHECK-SD-NEXT:    mov w9, w2  ; CHECK-SD-NEXT:    b.hi .LBB6_4  ; CHECK-SD-NEXT:  // %bb.2: -; CHECK-SD-NEXT:    mov x11, xzr +; CHECK-SD-NEXT:    mov x10, xzr  ; CHECK-SD-NEXT:    mov x8, xzr  ; CHECK-SD-NEXT:    b .LBB6_13  ; CHECK-SD-NEXT:  .LBB6_3: -; CHECK-SD-NEXT:    mov x0, xzr +; CHECK-SD-NEXT:    mov x8, xzr +; CHECK-SD-NEXT:    mov x0, x8  ; CHECK-SD-NEXT:    ret  ; CHECK-SD-NEXT:  .LBB6_4: // %vector.main.loop.iter.check -; CHECK-SD-NEXT:    dup v0.2d, x9  ; CHECK-SD-NEXT:    cmp w2, #16  ; CHECK-SD-NEXT:    b.hs .LBB6_6  ; CHECK-SD-NEXT:  // %bb.5: -; CHECK-SD-NEXT:    mov x11, xzr +; CHECK-SD-NEXT:    mov x10, xzr  ; CHECK-SD-NEXT:    mov x8, xzr  ; CHECK-SD-NEXT:    b .LBB6_10  ; CHECK-SD-NEXT:  .LBB6_6: // %vector.ph +; CHECK-SD-NEXT:    mov w8, w1 +; CHECK-SD-NEXT:    movi v0.2d, #0000000000000000  ; CHECK-SD-NEXT:    movi v1.2d, #0000000000000000 -; CHECK-SD-NEXT:    mov x8, v0.d[1] -; CHECK-SD-NEXT:    and x12, x10, #0xc +; CHECK-SD-NEXT:    sxtb x8, w8 +; CHECK-SD-NEXT:    movi v3.2d, #0000000000000000  ; CHECK-SD-NEXT:    movi v2.2d, #0000000000000000 +; CHECK-SD-NEXT:    movi v6.2d, #0000000000000000  ; CHECK-SD-NEXT:    movi v4.2d, #0000000000000000 -; CHECK-SD-NEXT:    and x11, x10, #0xfffffff0 -; CHECK-SD-NEXT:    movi v3.2d, #0000000000000000 +; CHECK-SD-NEXT:    and x11, x9, #0xc  ; CHECK-SD-NEXT:    movi v7.2d, #0000000000000000 -; CHECK-SD-NEXT:    mov x15, x0  ; CHECK-SD-NEXT:    movi v5.2d, #0000000000000000 -; CHECK-SD-NEXT:    movi v16.2d, #0000000000000000 -; CHECK-SD-NEXT:    and x16, x10, #0xfffffff0 -; CHECK-SD-NEXT:    movi v6.2d, #0000000000000000 -; CHECK-SD-NEXT:    fmov x13, d0 -; CHECK-SD-NEXT:    fmov x14, d0 +; CHECK-SD-NEXT:    and x10, x9, #0xfffffff0 +; CHECK-SD-NEXT:    dup v16.4s, w8 +; CHECK-SD-NEXT:    mov x8, x0 +; CHECK-SD-NEXT:    and x12, x9, #0xfffffff0  ; CHECK-SD-NEXT:  .LBB6_7: // %vector.body  ; CHECK-SD-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-SD-NEXT:    ldr q17, [x15], #16 -; CHECK-SD-NEXT:    subs x16, x16, #16 +; CHECK-SD-NEXT:    ldr q17, [x8], #16 +; CHECK-SD-NEXT:    subs x12, x12, #16  ; CHECK-SD-NEXT:    ushll v18.8h, v17.8b, #0 -; CHECK-SD-NEXT:    ushll2 v19.8h, v17.16b, #0 -; CHECK-SD-NEXT:    ushll v17.4s, v18.4h, #0 -; CHECK-SD-NEXT:    ushll2 v20.4s, v19.8h, #0 -; CHECK-SD-NEXT:    ushll2 v18.4s, v18.8h, #0 -; CHECK-SD-NEXT:    ushll v19.4s, v19.4h, #0 -; CHECK-SD-NEXT:    ushll v21.2d, v17.2s, #0 -; CHECK-SD-NEXT:    ushll2 v22.2d, v20.4s, #0 -; CHECK-SD-NEXT:    ushll2 v17.2d, v17.4s, #0 -; CHECK-SD-NEXT:    ushll v23.2d, v18.2s, #0 -; CHECK-SD-NEXT:    ushll v20.2d, v20.2s, #0 -; CHECK-SD-NEXT:    ushll2 v18.2d, v18.4s, #0 -; CHECK-SD-NEXT:    fmov x17, d21 -; CHECK-SD-NEXT:    mov x2, v21.d[1] -; CHECK-SD-NEXT:    ushll v21.2d, v19.2s, #0 -; CHECK-SD-NEXT:    ushll2 v19.2d, v19.4s, #0 -; CHECK-SD-NEXT:    fmov x18, d22 -; CHECK-SD-NEXT:    fmov x1, d17 -; CHECK-SD-NEXT:    fmov x3, d23 -; CHECK-SD-NEXT:    fmov x21, d20 -; CHECK-SD-NEXT:    fmov x22, d18 -; CHECK-SD-NEXT:    fmov x19, d21 -; CHECK-SD-NEXT:    mul x17, x13, x17 -; CHECK-SD-NEXT:    mov x4, v22.d[1] -; CHECK-SD-NEXT:    fmov x24, d19 -; CHECK-SD-NEXT:    mov x5, v23.d[1] -; CHECK-SD-NEXT:    mov x6, v21.d[1] -; CHECK-SD-NEXT:    mov x7, v20.d[1] -; CHECK-SD-NEXT:    mov x20, v18.d[1] -; CHECK-SD-NEXT:    mov x23, v19.d[1] -; CHECK-SD-NEXT:    mov x25, v17.d[1] -; CHECK-SD-NEXT:    mul x18, x14, x18 -; CHECK-SD-NEXT:    mul x1, x13, x1 -; CHECK-SD-NEXT:    fmov d17, x17 -; CHECK-SD-NEXT:    mul x3, x13, x3 -; CHECK-SD-NEXT:    fmov d18, x18 -; CHECK-SD-NEXT:    mul x19, x13, x19 -; CHECK-SD-NEXT:    fmov d19, x1 -; CHECK-SD-NEXT:    mul x21, x13, x21 -; CHECK-SD-NEXT:    fmov d20, x3 -; CHECK-SD-NEXT:    mul x22, x13, x22 -; CHECK-SD-NEXT:    fmov d21, x19 -; CHECK-SD-NEXT:    mul x24, x13, x24 -; CHECK-SD-NEXT:    fmov d24, x21 -; CHECK-SD-NEXT:    mul x2, x8, x2 -; CHECK-SD-NEXT:    fmov d22, x22 -; CHECK-SD-NEXT:    mul x4, x8, x4 -; CHECK-SD-NEXT:    fmov d23, x24 -; CHECK-SD-NEXT:    mul x5, x8, x5 -; CHECK-SD-NEXT:    mov v17.d[1], x2 -; CHECK-SD-NEXT:    mul x6, x8, x6 -; CHECK-SD-NEXT:    mov v18.d[1], x4 -; CHECK-SD-NEXT:    mul x7, x8, x7 -; CHECK-SD-NEXT:    mov v20.d[1], x5 -; CHECK-SD-NEXT:    add v1.2d, v17.2d, v1.2d -; CHECK-SD-NEXT:    mul x20, x8, x20 -; CHECK-SD-NEXT:    mov v21.d[1], x6 -; CHECK-SD-NEXT:    add v6.2d, v18.2d, v6.2d -; CHECK-SD-NEXT:    mul x23, x8, x23 -; CHECK-SD-NEXT:    mov v24.d[1], x7 -; CHECK-SD-NEXT:    add v4.2d, v20.2d, v4.2d -; CHECK-SD-NEXT:    mul x17, x8, x25 -; CHECK-SD-NEXT:    mov v22.d[1], x20 -; CHECK-SD-NEXT:    add v7.2d, v21.2d, v7.2d -; CHECK-SD-NEXT:    mov v23.d[1], x23 -; CHECK-SD-NEXT:    add v16.2d, v24.2d, v16.2d -; CHECK-SD-NEXT:    mov v19.d[1], x17 -; CHECK-SD-NEXT:    add v3.2d, v22.2d, v3.2d -; CHECK-SD-NEXT:    add v5.2d, v23.2d, v5.2d -; CHECK-SD-NEXT:    add v2.2d, v19.2d, v2.2d +; CHECK-SD-NEXT:    ushll2 v17.8h, v17.16b, #0 +; CHECK-SD-NEXT:    ushll2 v19.4s, v18.8h, #0 +; CHECK-SD-NEXT:    ushll v20.4s, v17.4h, #0 +; CHECK-SD-NEXT:    ushll v18.4s, v18.4h, #0 +; CHECK-SD-NEXT:    ushll2 v17.4s, v17.8h, #0 +; CHECK-SD-NEXT:    smlal2 v2.2d, v16.4s, v19.4s +; CHECK-SD-NEXT:    smlal2 v4.2d, v16.4s, v20.4s +; CHECK-SD-NEXT:    smlal v6.2d, v16.2s, v20.2s +; CHECK-SD-NEXT:    smlal v3.2d, v16.2s, v19.2s +; CHECK-SD-NEXT:    smlal2 v1.2d, v16.4s, v18.4s +; CHECK-SD-NEXT:    smlal v7.2d, v16.2s, v17.2s +; CHECK-SD-NEXT:    smlal v0.2d, v16.2s, v18.2s +; CHECK-SD-NEXT:    smlal2 v5.2d, v16.4s, v17.4s  ; CHECK-SD-NEXT:    b.ne .LBB6_7  ; CHECK-SD-NEXT:  // %bb.8: // %middle.block -; CHECK-SD-NEXT:    add v1.2d, v1.2d, v7.2d -; CHECK-SD-NEXT:    add v4.2d, v4.2d, v16.2d -; CHECK-SD-NEXT:    cmp x11, x10 -; CHECK-SD-NEXT:    add v2.2d, v2.2d, v5.2d -; CHECK-SD-NEXT:    add v3.2d, v3.2d, v6.2d +; CHECK-SD-NEXT:    add v0.2d, v0.2d, v6.2d +; CHECK-SD-NEXT:    add v3.2d, v3.2d, v7.2d +; CHECK-SD-NEXT:    cmp x10, x9  ; CHECK-SD-NEXT:    add v1.2d, v1.2d, v4.2d -; CHECK-SD-NEXT:    add v2.2d, v2.2d, v3.2d +; CHECK-SD-NEXT:    add v2.2d, v2.2d, v5.2d +; CHECK-SD-NEXT:    add v0.2d, v0.2d, v3.2d  ; CHECK-SD-NEXT:    add v1.2d, v1.2d, v2.2d -; CHECK-SD-NEXT:    addp d1, v1.2d -; CHECK-SD-NEXT:    fmov x8, d1 +; CHECK-SD-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-SD-NEXT:    addp d0, v0.2d +; CHECK-SD-NEXT:    fmov x8, d0  ; CHECK-SD-NEXT:    b.eq .LBB6_15  ; CHECK-SD-NEXT:  // %bb.9: // %vec.epilog.iter.check -; CHECK-SD-NEXT:    cbz x12, .LBB6_13 +; CHECK-SD-NEXT:    cbz x11, .LBB6_13  ; CHECK-SD-NEXT:  .LBB6_10: // %vec.epilog.ph +; CHECK-SD-NEXT:    movi v0.2d, #0000000000000000 +; CHECK-SD-NEXT:    mov w11, w1  ; CHECK-SD-NEXT:    movi v1.2d, #0000000000000000 -; CHECK-SD-NEXT:    movi v2.2d, #0000000000000000 -; CHECK-SD-NEXT:    mov x13, x11 +; CHECK-SD-NEXT:    sxtb x11, w11  ; CHECK-SD-NEXT:    movi v3.2d, #0x000000000000ff -; CHECK-SD-NEXT:    fmov x14, d0 -; CHECK-SD-NEXT:    and x11, x10, #0xfffffffc -; CHECK-SD-NEXT:    fmov x15, d0 -; CHECK-SD-NEXT:    sub x12, x13, x11 -; CHECK-SD-NEXT:    add x13, x0, x13 -; CHECK-SD-NEXT:    mov v1.d[0], x8 -; CHECK-SD-NEXT:    mov x8, v0.d[1] +; CHECK-SD-NEXT:    dup v2.2s, w11 +; CHECK-SD-NEXT:    mov x11, x10 +; CHECK-SD-NEXT:    and x10, x9, #0xfffffffc +; CHECK-SD-NEXT:    mov v0.d[0], x8 +; CHECK-SD-NEXT:    sub x8, x11, x10 +; CHECK-SD-NEXT:    add x11, x0, x11  ; CHECK-SD-NEXT:  .LBB6_11: // %vec.epilog.vector.body  ; CHECK-SD-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-SD-NEXT:    ldr s0, [x13], #4 -; CHECK-SD-NEXT:    adds x12, x12, #4 -; CHECK-SD-NEXT:    ushll v0.8h, v0.8b, #0 -; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0 -; CHECK-SD-NEXT:    ushll v4.2d, v0.2s, #0 -; CHECK-SD-NEXT:    ushll2 v0.2d, v0.4s, #0 +; CHECK-SD-NEXT:    ldr s4, [x11], #4 +; CHECK-SD-NEXT:    adds x8, x8, #4 +; CHECK-SD-NEXT:    ushll v4.8h, v4.8b, #0 +; CHECK-SD-NEXT:    ushll v4.4s, v4.4h, #0 +; CHECK-SD-NEXT:    ushll v5.2d, v4.2s, #0 +; CHECK-SD-NEXT:    ushll2 v4.2d, v4.4s, #0 +; CHECK-SD-NEXT:    and v5.16b, v5.16b, v3.16b  ; CHECK-SD-NEXT:    and v4.16b, v4.16b, v3.16b -; CHECK-SD-NEXT:    and v0.16b, v0.16b, v3.16b -; CHECK-SD-NEXT:    fmov x16, d4 -; CHECK-SD-NEXT:    fmov x18, d0 -; CHECK-SD-NEXT:    mov x17, v4.d[1] -; CHECK-SD-NEXT:    mov x1, v0.d[1] -; CHECK-SD-NEXT:    mul x16, x14, x16 -; CHECK-SD-NEXT:    mul x18, x15, x18 -; CHECK-SD-NEXT:    mul x17, x8, x17 -; CHECK-SD-NEXT:    fmov d0, x16 -; CHECK-SD-NEXT:    mul x1, x8, x1 -; CHECK-SD-NEXT:    fmov d4, x18 -; CHECK-SD-NEXT:    mov v0.d[1], x17 -; CHECK-SD-NEXT:    mov v4.d[1], x1 -; CHECK-SD-NEXT:    add v1.2d, v0.2d, v1.2d -; CHECK-SD-NEXT:    add v2.2d, v4.2d, v2.2d +; CHECK-SD-NEXT:    xtn v5.2s, v5.2d +; CHECK-SD-NEXT:    xtn v4.2s, v4.2d +; CHECK-SD-NEXT:    smlal v1.2d, v2.2s, v4.2s +; CHECK-SD-NEXT:    smlal v0.2d, v2.2s, v5.2s  ; CHECK-SD-NEXT:    b.ne .LBB6_11  ; CHECK-SD-NEXT:  // %bb.12: // %vec.epilog.middle.block -; CHECK-SD-NEXT:    add v0.2d, v1.2d, v2.2d -; CHECK-SD-NEXT:    cmp x11, x10 +; CHECK-SD-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-SD-NEXT:    cmp x10, x9  ; CHECK-SD-NEXT:    addp d0, v0.2d  ; CHECK-SD-NEXT:    fmov x8, d0  ; CHECK-SD-NEXT:    b.eq .LBB6_15  ; CHECK-SD-NEXT:  .LBB6_13: // %for.body.preheader -; CHECK-SD-NEXT:    sub x10, x10, x11 -; CHECK-SD-NEXT:    add x11, x0, x11 +; CHECK-SD-NEXT:    sxtb x11, w1 +; CHECK-SD-NEXT:    sub x9, x9, x10 +; CHECK-SD-NEXT:    add x10, x0, x10  ; CHECK-SD-NEXT:  .LBB6_14: // %for.body  ; CHECK-SD-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-SD-NEXT:    ldrb w12, [x11], #1 -; CHECK-SD-NEXT:    subs x10, x10, #1 -; CHECK-SD-NEXT:    smaddl x8, w12, w9, x8 +; CHECK-SD-NEXT:    ldrb w12, [x10], #1 +; CHECK-SD-NEXT:    subs x9, x9, #1 +; CHECK-SD-NEXT:    smaddl x8, w12, w11, x8  ; CHECK-SD-NEXT:    b.ne .LBB6_14 -; CHECK-SD-NEXT:  .LBB6_15: -; CHECK-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload -; CHECK-SD-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload -; CHECK-SD-NEXT:    ldp x24, x23, [sp, #16] // 16-byte Folded Reload -; CHECK-SD-NEXT:    ldr x25, [sp], #64 // 8-byte Folded Reload +; CHECK-SD-NEXT:  .LBB6_15: // %for.cond.cleanup  ; CHECK-SD-NEXT:    mov x0, x8  ; CHECK-SD-NEXT:    ret  ; @@ -957,63 +875,64 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none  ; CHECK-GI-NEXT:    cbz w2, .LBB6_7  ; CHECK-GI-NEXT:  // %bb.1: // %iter.check  ; CHECK-GI-NEXT:    movi d0, #0000000000000000 -; CHECK-GI-NEXT:    sxtb x9, w1 -; CHECK-GI-NEXT:    mov x11, xzr +; CHECK-GI-NEXT:    mov x10, xzr  ; CHECK-GI-NEXT:    cmp w2, #4 -; CHECK-GI-NEXT:    mov w10, w2 +; CHECK-GI-NEXT:    mov w9, w2  ; CHECK-GI-NEXT:    b.lo .LBB6_12  ; CHECK-GI-NEXT:  // %bb.2: // %vector.main.loop.iter.check  ; CHECK-GI-NEXT:    movi d0, #0000000000000000 -; CHECK-GI-NEXT:    dup v1.2d, x9 -; CHECK-GI-NEXT:    mov x11, xzr +; CHECK-GI-NEXT:    mov x10, xzr  ; CHECK-GI-NEXT:    cmp w2, #16  ; CHECK-GI-NEXT:    b.lo .LBB6_9  ; CHECK-GI-NEXT:  // %bb.3: // %vector.ph +; CHECK-GI-NEXT:    mov w8, w1  ; CHECK-GI-NEXT:    movi v0.2d, #0000000000000000 -; CHECK-GI-NEXT:    xtn v2.2s, v1.2d -; CHECK-GI-NEXT:    and x8, x10, #0xc +; CHECK-GI-NEXT:    movi v1.2d, #0000000000000000 +; CHECK-GI-NEXT:    sxtb x8, w8 +; CHECK-GI-NEXT:    movi v2.2d, #0000000000000000  ; CHECK-GI-NEXT:    movi v3.2d, #0000000000000000  ; CHECK-GI-NEXT:    movi v4.2d, #0000000000000000 -; CHECK-GI-NEXT:    and x11, x10, #0xfffffff0 -; CHECK-GI-NEXT:    movi v5.2d, #0000000000000000  ; CHECK-GI-NEXT:    movi v6.2d, #0000000000000000 -; CHECK-GI-NEXT:    mov x12, x0 +; CHECK-GI-NEXT:    and x10, x9, #0xfffffff0 +; CHECK-GI-NEXT:    dup v5.2d, x8  ; CHECK-GI-NEXT:    movi v7.2d, #0000000000000000 -; CHECK-GI-NEXT:    movi v16.2d, #0000000000000000 -; CHECK-GI-NEXT:    and x13, x10, #0xfffffff0 -; CHECK-GI-NEXT:    movi v17.2d, #0000000000000000 +; CHECK-GI-NEXT:    and x8, x9, #0xc +; CHECK-GI-NEXT:    mov x11, x0 +; CHECK-GI-NEXT:    and x12, x9, #0xfffffff0 +; CHECK-GI-NEXT:    xtn v16.2s, v5.2d +; CHECK-GI-NEXT:    movi v5.2d, #0000000000000000  ; CHECK-GI-NEXT:  .LBB6_4: // %vector.body  ; CHECK-GI-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-GI-NEXT:    ldr q18, [x12], #16 -; CHECK-GI-NEXT:    subs x13, x13, #16 -; CHECK-GI-NEXT:    ushll v19.8h, v18.8b, #0 -; CHECK-GI-NEXT:    ushll2 v18.8h, v18.16b, #0 -; CHECK-GI-NEXT:    ushll v20.4s, v19.4h, #0 -; CHECK-GI-NEXT:    ushll2 v19.4s, v19.8h, #0 -; CHECK-GI-NEXT:    ushll v21.4s, v18.4h, #0 +; CHECK-GI-NEXT:    ldr q17, [x11], #16 +; CHECK-GI-NEXT:    subs x12, x12, #16 +; CHECK-GI-NEXT:    ushll v18.8h, v17.8b, #0 +; CHECK-GI-NEXT:    ushll2 v17.8h, v17.16b, #0 +; CHECK-GI-NEXT:    ushll v19.4s, v18.4h, #0  ; CHECK-GI-NEXT:    ushll2 v18.4s, v18.8h, #0 -; CHECK-GI-NEXT:    mov d22, v20.d[1] -; CHECK-GI-NEXT:    mov d23, v19.d[1] -; CHECK-GI-NEXT:    mov d24, v21.d[1] -; CHECK-GI-NEXT:    mov d25, v18.d[1] -; CHECK-GI-NEXT:    smlal v0.2d, v2.2s, v20.2s -; CHECK-GI-NEXT:    smlal v4.2d, v2.2s, v19.2s -; CHECK-GI-NEXT:    smlal v6.2d, v2.2s, v21.2s -; CHECK-GI-NEXT:    smlal v16.2d, v2.2s, v18.2s -; CHECK-GI-NEXT:    smlal v3.2d, v2.2s, v22.2s -; CHECK-GI-NEXT:    smlal v5.2d, v2.2s, v23.2s -; CHECK-GI-NEXT:    smlal v7.2d, v2.2s, v24.2s -; CHECK-GI-NEXT:    smlal v17.2d, v2.2s, v25.2s +; CHECK-GI-NEXT:    ushll v20.4s, v17.4h, #0 +; CHECK-GI-NEXT:    ushll2 v17.4s, v17.8h, #0 +; CHECK-GI-NEXT:    mov d21, v19.d[1] +; CHECK-GI-NEXT:    mov d22, v18.d[1] +; CHECK-GI-NEXT:    mov d23, v20.d[1] +; CHECK-GI-NEXT:    mov d24, v17.d[1] +; CHECK-GI-NEXT:    smlal v0.2d, v16.2s, v19.2s +; CHECK-GI-NEXT:    smlal v2.2d, v16.2s, v18.2s +; CHECK-GI-NEXT:    smlal v4.2d, v16.2s, v20.2s +; CHECK-GI-NEXT:    smlal v6.2d, v16.2s, v17.2s +; CHECK-GI-NEXT:    smlal v1.2d, v16.2s, v21.2s +; CHECK-GI-NEXT:    smlal v3.2d, v16.2s, v22.2s +; CHECK-GI-NEXT:    smlal v5.2d, v16.2s, v23.2s +; CHECK-GI-NEXT:    smlal v7.2d, v16.2s, v24.2s  ; CHECK-GI-NEXT:    b.ne .LBB6_4  ; CHECK-GI-NEXT:  // %bb.5: // %middle.block -; CHECK-GI-NEXT:    add v0.2d, v0.2d, v3.2d +; CHECK-GI-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-GI-NEXT:    add v1.2d, v2.2d, v3.2d +; CHECK-GI-NEXT:    cmp x10, x9  ; CHECK-GI-NEXT:    add v2.2d, v4.2d, v5.2d -; CHECK-GI-NEXT:    cmp x11, x10  ; CHECK-GI-NEXT:    add v3.2d, v6.2d, v7.2d -; CHECK-GI-NEXT:    add v4.2d, v16.2d, v17.2d -; CHECK-GI-NEXT:    add v0.2d, v0.2d, v2.2d -; CHECK-GI-NEXT:    add v2.2d, v3.2d, v4.2d -; CHECK-GI-NEXT:    add v0.2d, v0.2d, v2.2d +; CHECK-GI-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-GI-NEXT:    add v1.2d, v2.2d, v3.2d +; CHECK-GI-NEXT:    add v0.2d, v0.2d, v1.2d  ; CHECK-GI-NEXT:    addp d0, v0.2d  ; CHECK-GI-NEXT:    b.ne .LBB6_8  ; CHECK-GI-NEXT:  // %bb.6: @@ -1027,50 +946,54 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none  ; CHECK-GI-NEXT:  .LBB6_8: // %vec.epilog.iter.check  ; CHECK-GI-NEXT:    cbz x8, .LBB6_12  ; CHECK-GI-NEXT:  .LBB6_9: // %vec.epilog.ph +; CHECK-GI-NEXT:    mov w8, w1  ; CHECK-GI-NEXT:    mov v0.d[1], xzr -; CHECK-GI-NEXT:    movi v2.2d, #0000000000000000 -; CHECK-GI-NEXT:    mov x12, x11 -; CHECK-GI-NEXT:    xtn v1.2s, v1.2d -; CHECK-GI-NEXT:    and x11, x10, #0xfffffffc -; CHECK-GI-NEXT:    sub x8, x12, x11 -; CHECK-GI-NEXT:    add x12, x0, x12 +; CHECK-GI-NEXT:    movi v1.2d, #0000000000000000 +; CHECK-GI-NEXT:    sxtb x8, w8 +; CHECK-GI-NEXT:    mov x11, x10 +; CHECK-GI-NEXT:    and x10, x9, #0xfffffffc +; CHECK-GI-NEXT:    dup v2.2d, x8 +; CHECK-GI-NEXT:    sub x8, x11, x10 +; CHECK-GI-NEXT:    add x11, x0, x11 +; CHECK-GI-NEXT:    xtn v2.2s, v2.2d  ; CHECK-GI-NEXT:  .LBB6_10: // %vec.epilog.vector.body  ; CHECK-GI-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-GI-NEXT:    ldr w13, [x12], #4 +; CHECK-GI-NEXT:    ldr w12, [x11], #4  ; CHECK-GI-NEXT:    adds x8, x8, #4 -; CHECK-GI-NEXT:    fmov s3, w13 -; CHECK-GI-NEXT:    uxtb w13, w13 +; CHECK-GI-NEXT:    fmov s3, w12 +; CHECK-GI-NEXT:    uxtb w12, w12  ; CHECK-GI-NEXT:    mov b4, v3.b[2]  ; CHECK-GI-NEXT:    mov b5, v3.b[1]  ; CHECK-GI-NEXT:    mov b6, v3.b[3] -; CHECK-GI-NEXT:    fmov s3, w13 -; CHECK-GI-NEXT:    fmov w14, s4 -; CHECK-GI-NEXT:    fmov w15, s5 -; CHECK-GI-NEXT:    fmov w16, s6 +; CHECK-GI-NEXT:    fmov s3, w12 +; CHECK-GI-NEXT:    fmov w13, s4 +; CHECK-GI-NEXT:    fmov w14, s5 +; CHECK-GI-NEXT:    fmov w15, s6 +; CHECK-GI-NEXT:    uxtb w13, w13  ; CHECK-GI-NEXT:    uxtb w14, w14  ; CHECK-GI-NEXT:    uxtb w15, w15 -; CHECK-GI-NEXT:    uxtb w16, w16 -; CHECK-GI-NEXT:    fmov s4, w14 -; CHECK-GI-NEXT:    mov v3.s[1], w15 -; CHECK-GI-NEXT:    mov v4.s[1], w16 -; CHECK-GI-NEXT:    smlal v0.2d, v1.2s, v3.2s -; CHECK-GI-NEXT:    smlal v2.2d, v1.2s, v4.2s +; CHECK-GI-NEXT:    fmov s4, w13 +; CHECK-GI-NEXT:    mov v3.s[1], w14 +; CHECK-GI-NEXT:    mov v4.s[1], w15 +; CHECK-GI-NEXT:    smlal v0.2d, v2.2s, v3.2s +; CHECK-GI-NEXT:    smlal v1.2d, v2.2s, v4.2s  ; CHECK-GI-NEXT:    b.ne .LBB6_10  ; CHECK-GI-NEXT:  // %bb.11: // %vec.epilog.middle.block -; CHECK-GI-NEXT:    add v0.2d, v0.2d, v2.2d -; CHECK-GI-NEXT:    cmp x11, x10 +; CHECK-GI-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-GI-NEXT:    cmp x10, x9  ; CHECK-GI-NEXT:    addp d0, v0.2d  ; CHECK-GI-NEXT:    fmov x8, d0  ; CHECK-GI-NEXT:    b.eq .LBB6_14  ; CHECK-GI-NEXT:  .LBB6_12: // %for.body.preheader -; CHECK-GI-NEXT:    sub x10, x10, x11 -; CHECK-GI-NEXT:    add x11, x0, x11 +; CHECK-GI-NEXT:    sxtb x11, w1 +; CHECK-GI-NEXT:    sub x9, x9, x10 +; CHECK-GI-NEXT:    add x10, x0, x10  ; CHECK-GI-NEXT:  .LBB6_13: // %for.body  ; CHECK-GI-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-GI-NEXT:    ldrb w8, [x11], #1 +; CHECK-GI-NEXT:    ldrb w8, [x10], #1  ; CHECK-GI-NEXT:    fmov x12, d0 -; CHECK-GI-NEXT:    subs x10, x10, #1 -; CHECK-GI-NEXT:    madd x8, x8, x9, x12 +; CHECK-GI-NEXT:    subs x9, x9, #1 +; CHECK-GI-NEXT:    madd x8, x8, x11, x12  ; CHECK-GI-NEXT:    fmov d0, x8  ; CHECK-GI-NEXT:    b.ne .LBB6_13  ; CHECK-GI-NEXT:  .LBB6_14: // %for.cond.cleanup diff --git a/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir b/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir index 35eafe8..f535e0f 100644 --- a/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir +++ b/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir @@ -68,13 +68,9 @@  # CHECK:      early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.4)  # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16  # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1024, 0 -# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 1040 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg -# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1040, 0 -# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg +# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 2064, 0 +# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 2080 +# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg  # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22  #  # CHECK-NEXT: $x8 = ADDXri $sp, 1040, 0 @@ -83,14 +79,10 @@  # CHECK-NEXT: $x8 = ADDXri $sp, 2064, 0  # CHECK-NEXT: STR_PXI $p0, killed $x8, 18 :: (store (<vscale x 1 x s16>) into %stack.1)  # -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1024, 0 -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 1056 -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1040, 0 -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16 +# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 2064, 0 +# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 +# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg +# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16  # CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.4)  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29 @@ -100,38 +92,26 @@  # ASM:       str x29, [sp, #-16]!  # ASM-NEXT:  .cfi_def_cfa_offset 16  # ASM-NEXT:  .cfi_offset w29, -16 -# ASM-NEXT:  sub sp, sp, #1024 -# ASM-NEXT:  .cfi_def_cfa_offset 1040 -# ASM-NEXT:  addvl sp, sp, #-1 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1040 + 8 * VG -# ASM-NEXT:  sub sp, sp, #1040 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG -# ASM-NEXT:  addvl sp, sp, #-2 +# ASM-NEXT:  sub sp, sp, #2064 +# ASM-NEXT:  .cfi_def_cfa_offset 2080 +# ASM-NEXT:  addvl sp, sp, #-3  # ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 2080 + 24 * VG  # -# ASM:	     addvl sp, sp, #2 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG -# ASM-NEXT:  add sp, sp, #1024 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1056 + 8 * VG -# ASM-NEXT:  addvl sp, sp, #1 -# ASM-NEXT:  .cfi_def_cfa wsp, 1056 -# ASM-NEXT:  add sp, sp, #1040 -# ASM-NEXT:  .cfi_def_cfa_offset 16 +# ASM:	     add sp, sp, #2064 +# ASM-NEXT:  .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 16 + 24 * VG +# ASM-NEXT:  addvl   sp, sp, #3 +# ASM-NEXT:  .cfi_def_cfa wsp, 16  # ASM-NEXT:  ldr x29, [sp], #16  # ASM-NEXT:  .cfi_def_cfa_offset 0  # ASM-NEXT:  .cfi_restore w29  # UNWINDINFO:      DW_CFA_def_cfa_offset: +16  # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16 -# UNWINDINFO:      DW_CFA_def_cfa_offset: +1040 -# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +1040, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus +# UNWINDINFO:      DW_CFA_def_cfa_offset: +2080  # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus  # -# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +1056, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO:      DW_CFA_def_cfa: reg31 +1056 -# UNWINDINFO:      DW_CFA_def_cfa_offset: +16 +# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus +# UNWINDINFO:      DW_CFA_def_cfa: reg31 +16  # UNWINDINFO:      DW_CFA_def_cfa_offset: +0  # UNWINDINFO-NEXT: DW_CFA_restore: reg29 @@ -270,13 +250,9 @@ body:             |  # CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.5)  # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16  # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1024, 0 -# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 1040 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg -# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1040, 0 -# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg +# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 2064, 0 +# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 2080 +# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg  # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22  #  # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 1040, 0 @@ -286,14 +262,10 @@ body:             |  # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 2064, 0  # CHECK-NEXT: STR_PXI $p0, killed $[[TMP]], 23  # -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1024, 0 -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 1056 -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1040, 0 -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16 +# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 2064, 0 +# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 +# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg +# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16  # CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.5)  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29 @@ -303,38 +275,27 @@ body:             |  # ASM:       str x29, [sp, #-16]!  # ASM-NEXT:  .cfi_def_cfa_offset 16  # ASM-NEXT:  .cfi_offset w29, -16 -# ASM-NEXT:  sub sp, sp, #1024 -# ASM-NEXT:  .cfi_def_cfa_offset 1040 -# ASM-NEXT:  addvl sp, sp, #-1 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1040 + 8 * VG -# ASM-NEXT:  sub sp, sp, #1040 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG -# ASM-NEXT:  addvl sp, sp, #-2 +# ASM-NEXT:  sub sp, sp, #2064 +# ASM-NEXT:  .cfi_def_cfa_offset 2080 +# ASM-NEXT:  addvl sp, sp, #-3  # ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 2080 + 24 * VG  # -# ASM:       addvl sp, sp, #2 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG -# ASM-NEXT:  add sp, sp, #1024 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1056 + 8 * VG -# ASM-NEXT:  addvl sp, sp, #1 -# ASM-NEXT:  .cfi_def_cfa wsp, 1056 -# ASM-NEXT:  add sp, sp, #1040 -# ASM-NEXT:  .cfi_def_cfa_offset 16 +# ASM:       add sp, sp, #2064 +# ASM-NEXT:  .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 16 + 24 * VG +# ASM-NEXT:  addvl   sp, sp, #3 +# ASM-NEXT:  .cfi_def_cfa wsp, 16  # ASM-NEXT:  ldr x29, [sp], #16  # ASM-NEXT:  .cfi_def_cfa_offset 0  # ASM-NEXT:  .cfi_restore w29 +# ASM-NEXT:  ret  # UNWINDINFO: DW_CFA_def_cfa_offset: +16  # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16 -# UNWINDINFO: DW_CFA_def_cfa_offset: +1040 -# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +1040, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus +# UNWINDINFO: DW_CFA_def_cfa_offset: +2080  # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus  # -# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +1056, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO: DW_CFA_def_cfa: reg31 +1056 -# UNWINDINFO: DW_CFA_def_cfa_offset: +16 +# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus +# UNWINDINFO: DW_CFA_def_cfa: reg31 +16  # UNWINDINFO: DW_CFA_def_cfa_offset: +0  # UNWINDINFO-NEXT: DW_CFA_restore: reg29 @@ -385,10 +346,8 @@ body:             |  # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16  # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8  # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1024, 0 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1040, 0 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg +# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 2064, 0 +# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg  #  # CHECK-NEXT: $[[TMP:x[0-9]+]] = SUBXri $fp, 1024, 0  # CHECK-NEXT: STR_ZXI $z0, killed $[[TMP]], -2 @@ -396,10 +355,8 @@ body:             |  # CHECK-NEXT: STR_ZXI $z1, killed $[[TMP]], -3  # CHECK-NEXT: STR_PXI $p0, $fp, -1  # -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1024, 0 -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1040, 0 +# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 2064, 0 +# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16  # CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.6), (load (s64) from %stack.5)  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0 @@ -414,15 +371,11 @@ body:             |  # ASM-NEXT:  .cfi_def_cfa w29, 16  # ASM-NEXT:  .cfi_offset w30, -8  # ASM-NEXT:  .cfi_offset w29, -16 -# ASM-NEXT:  sub sp, sp, #1024 -# ASM-NEXT:  addvl sp, sp, #-1 -# ASM-NEXT:  sub sp, sp, #1040 -# ASM-NEXT:  addvl sp, sp, #-2 +# ASM-NEXT:  sub sp, sp, #2064 +# ASM-NEXT:  addvl sp, sp, #-3  # -# ASM:       addvl sp, sp, #2 -# ASM-NEXT:  add sp, sp, #1024 -# ASM-NEXT:  addvl sp, sp, #1 -# ASM-NEXT:  add sp, sp, #1040 +# ASM:       add sp, sp, #2064 +# ASM-NEXT:  addvl sp, sp, #3  # ASM-NEXT:  .cfi_def_cfa wsp, 16  # ASM-NEXT:  ldp x29, x30, [sp], #16  # ASM-NEXT:  .cfi_def_cfa_offset 0 diff --git a/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll b/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll index 690a39d..c13dd33 100644 --- a/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll +++ b/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll @@ -19,20 +19,16 @@ define void @zpr_and_ppr_local(<vscale x 16 x i1> %pred, <vscale x 16 x i8> %vec  ; CHECK-LABEL: zpr_and_ppr_local:  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 +; CHECK-NEXT:    sub sp, sp, #2048 +; CHECK-NEXT:    addvl sp, sp, #-2  ; CHECK-NEXT:    .cfi_escape 0x0f, 0x09, 0x8f, 0x90, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 2064 + 16 * VG  ; CHECK-NEXT:    .cfi_offset w29, -16  ; CHECK-NEXT:    add x8, sp, #2048  ; CHECK-NEXT:    str p0, [x8, #15, mul vl]  ; CHECK-NEXT:    add x8, sp, #1024  ; CHECK-NEXT:    str z0, [x8] -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 +; CHECK-NEXT:    add sp, sp, #2048 +; CHECK-NEXT:    addvl sp, sp, #2  ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload  ; CHECK-NEXT:    ret    %ppr_local = alloca <vscale x 16 x i1> @@ -62,20 +58,16 @@ define void @zpr_and_ppr_local_fp(<vscale x 16 x i1> %pred, <vscale x 16 x i8> %  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill  ; CHECK-NEXT:    mov x29, sp -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 +; CHECK-NEXT:    sub sp, sp, #2048 +; CHECK-NEXT:    addvl sp, sp, #-2  ; CHECK-NEXT:    .cfi_def_cfa w29, 16  ; CHECK-NEXT:    .cfi_offset w30, -8  ; CHECK-NEXT:    .cfi_offset w29, -16  ; CHECK-NEXT:    sub x8, x29, #1024  ; CHECK-NEXT:    str p0, [x29, #-1, mul vl]  ; CHECK-NEXT:    str z0, [x8, #-2, mul vl] -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 +; CHECK-NEXT:    add sp, sp, #2048 +; CHECK-NEXT:    addvl sp, sp, #2  ; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload  ; CHECK-NEXT:    ret    %ppr_local = alloca <vscale x 16 x i1> @@ -103,17 +95,15 @@ define void @fpr_and_ppr_local(<vscale x 16 x i1> %pred, double %double) "aarch6  ; CHECK-LABEL: fpr_and_ppr_local:  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill -; CHECK-NEXT:    sub sp, sp, #1024 +; CHECK-NEXT:    sub sp, sp, #2064  ; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    sub sp, sp, #1040  ; CHECK-NEXT:    .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG  ; CHECK-NEXT:    .cfi_offset w29, -16  ; CHECK-NEXT:    add x8, sp, #2064  ; CHECK-NEXT:    str p0, [x8, #7, mul vl]  ; CHECK-NEXT:    str d0, [sp, #1032] -; CHECK-NEXT:    add sp, sp, #1024 +; CHECK-NEXT:    add sp, sp, #2064  ; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1040  ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload  ; CHECK-NEXT:    ret    %ppr_local = alloca <vscale x 16 x i1> @@ -144,17 +134,15 @@ define void @fpr_and_ppr_local_fp(<vscale x 16 x i1> %pred, double %double) "aar  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill  ; CHECK-NEXT:    mov x29, sp -; CHECK-NEXT:    sub sp, sp, #1024 +; CHECK-NEXT:    sub sp, sp, #2064  ; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    sub sp, sp, #1040  ; CHECK-NEXT:    .cfi_def_cfa w29, 16  ; CHECK-NEXT:    .cfi_offset w30, -8  ; CHECK-NEXT:    .cfi_offset w29, -16  ; CHECK-NEXT:    str p0, [x29, #-1, mul vl]  ; CHECK-NEXT:    str d0, [sp, #1032] -; CHECK-NEXT:    add sp, sp, #1024 +; CHECK-NEXT:    add sp, sp, #2064  ; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1040  ; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload  ; CHECK-NEXT:    ret    %ppr_local = alloca <vscale x 16 x i1> @@ -793,11 +781,8 @@ define void @zpr_and_ppr_local_stack_probing(<vscale x 16 x i1> %pred, <vscale x  ; CHECK-LABEL: zpr_and_ppr_local_stack_probing:  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    str xzr, [sp] -; CHECK-NEXT:    sub sp, sp, #1824 -; CHECK-NEXT:    addvl sp, sp, #-1 +; CHECK-NEXT:    sub sp, sp, #2848 +; CHECK-NEXT:    addvl sp, sp, #-2  ; CHECK-NEXT:    str xzr, [sp]  ; CHECK-NEXT:    .cfi_escape 0x0f, 0x09, 0x8f, 0xb0, 0x16, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 2864 + 16 * VG  ; CHECK-NEXT:    .cfi_offset w29, -16 @@ -806,10 +791,8 @@ define void @zpr_and_ppr_local_stack_probing(<vscale x 16 x i1> %pred, <vscale x  ; CHECK-NEXT:    add x8, sp, #1824  ; CHECK-NEXT:    str z0, [x8]  ; CHECK-NEXT:    str x0, [sp] -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1824 +; CHECK-NEXT:    add sp, sp, #2848 +; CHECK-NEXT:    addvl sp, sp, #2  ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload  ; CHECK-NEXT:    ret    "probe-stack"="inline-asm" "stack-probe-size"="4096" "frame-pointer"="none" "aarch64_pstate_sm_compatible" diff --git a/llvm/test/CodeGen/AArch64/stackmap.ll b/llvm/test/CodeGen/AArch64/stackmap.ll index 995d254..26221d0 100644 --- a/llvm/test/CodeGen/AArch64/stackmap.ll +++ b/llvm/test/CodeGen/AArch64/stackmap.ll @@ -81,14 +81,14 @@  ; CHECK-NEXT:   .hword  8  ; CHECK-NEXT:   .hword  0  ; CHECK-NEXT:   .hword  0 -; CHECK-NEXT:   .word   65535 +; CHECK-NEXT:   .word   -1  ; SmallConstant  ; CHECK-NEXT:   .byte   4  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .hword  8  ; CHECK-NEXT:   .hword  0  ; CHECK-NEXT:   .hword  0 -; CHECK-NEXT:   .word   65535 +; CHECK-NEXT:   .word   -1  ; SmallConstant  ; CHECK-NEXT:   .byte   4  ; CHECK-NEXT:   .byte   0 diff --git a/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll b/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll index becddae..b2ed8de 100644 --- a/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll +++ b/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll @@ -1,19 +1,8 @@  ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py  ; RUN: llc -aarch64-sve-vector-bits-min=128  < %s | not grep ptrue  ; RUN: llc -aarch64-sve-vector-bits-min=256  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_256 -; RUN: llc -aarch64-sve-vector-bits-min=384  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_256  ; RUN: llc -aarch64-sve-vector-bits-min=512  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512 -; RUN: llc -aarch64-sve-vector-bits-min=640  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512 -; RUN: llc -aarch64-sve-vector-bits-min=768  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512 -; RUN: llc -aarch64-sve-vector-bits-min=896  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512  ; RUN: llc -aarch64-sve-vector-bits-min=1024 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1152 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1280 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1408 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1536 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1664 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1792 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1920 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024  ; RUN: llc -aarch64-sve-vector-bits-min=2048 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_2048  target triple = "aarch64-unknown-linux-gnu" diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy-scc-vcc.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy-scc-vcc.ll index 1a7ccf0..588802c 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy-scc-vcc.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy-scc-vcc.ll @@ -1,7 +1,7 @@  ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 -; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx700 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX7 %s -; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx803 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX8 %s -; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s +; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx700 < %s | FileCheck -check-prefixes=GFX7 %s +; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx803 < %s | FileCheck -check-prefixes=GFX8 %s +; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck -check-prefixes=GFX11 %s  define amdgpu_kernel void @fcmp_uniform_select(float %a, i32 %b, i32 %c, ptr addrspace(1) %out) {  ; GFX7-LABEL: fcmp_uniform_select: diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy-scc-vcc.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy-scc-vcc.mir index 67cc016..b6652f6 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy-scc-vcc.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy-scc-vcc.mir @@ -1,7 +1,7 @@  # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py -# RUN: llc -mtriple=amdgcn -mcpu=gfx700 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefixes=GFX7 %s -# RUN: llc -mtriple=amdgcn -mcpu=gfx803 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefixes=GF8 %s -# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefixes=GFX11 %s +# RUN: llc -mtriple=amdgcn -mcpu=gfx700 -run-pass=instruction-select %s -o - | FileCheck -check-prefixes=GFX7 %s +# RUN: llc -mtriple=amdgcn -mcpu=gfx803 -run-pass=instruction-select %s -o - | FileCheck -check-prefixes=GF8 %s +# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=instruction-select %s -o - | FileCheck -check-prefixes=GFX11 %s  ---  name: test_copy_scc_vcc diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.abs.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.abs.ll index 02d0e52..6facdfd 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.abs.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.abs.ll @@ -104,109 +104,110 @@ define amdgpu_cs <4 x i32> @abs_sgpr_v4i32(<4 x i32> inreg %arg) {    ret <4 x i32> %res  } -define amdgpu_cs i16 @abs_vgpr_i16(i16 %arg) { +define i16 @abs_vgpr_i16(i16 %arg) {  ; GFX6-LABEL: abs_vgpr_i16:  ; GFX6:       ; %bb.0: +; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX6-NEXT:    v_bfe_i32 v0, v0, 0, 16  ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, 0, v0  ; GFX6-NEXT:    v_max_i32_e32 v0, v0, v1 -; GFX6-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX6-NEXT:    ; return to shader part epilog +; GFX6-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX8-LABEL: abs_vgpr_i16:  ; GFX8:       ; %bb.0: +; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX8-NEXT:    v_sub_u16_e32 v1, 0, v0  ; GFX8-NEXT:    v_max_i16_e32 v0, v0, v1 -; GFX8-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX8-NEXT:    ; return to shader part epilog +; GFX8-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX10-LABEL: abs_vgpr_i16:  ; GFX10:       ; %bb.0: +; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX10-NEXT:    v_sub_nc_u16 v1, 0, v0  ; GFX10-NEXT:    v_max_i16 v0, v0, v1 -; GFX10-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX10-NEXT:    ; return to shader part epilog +; GFX10-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX1250-LABEL: abs_vgpr_i16:  ; GFX1250:       ; %bb.0: +; GFX1250-NEXT:    s_wait_loadcnt_dscnt 0x0 +; GFX1250-NEXT:    s_wait_kmcnt 0x0  ; GFX1250-NEXT:    v_sub_nc_u16 v1, 0, v0 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_1)  ; GFX1250-NEXT:    v_max_i16 v0, v0, v1 -; GFX1250-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX1250-NEXT:    ; return to shader part epilog +; GFX1250-NEXT:    s_set_pc_i64 s[30:31]    %res = call i16 @llvm.abs.i16(i16 %arg, i1 false)    ret i16 %res  } -define amdgpu_cs i32 @abs_vgpr_i32(i32 %arg) { +define i32 @abs_vgpr_i32(i32 %arg) {  ; GFX6-LABEL: abs_vgpr_i32:  ; GFX6:       ; %bb.0: +; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, 0, v0  ; GFX6-NEXT:    v_max_i32_e32 v0, v0, v1 -; GFX6-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX6-NEXT:    ; return to shader part epilog +; GFX6-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX8-LABEL: abs_vgpr_i32:  ; GFX8:       ; %bb.0: +; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX8-NEXT:    v_sub_u32_e32 v1, vcc, 0, v0  ; GFX8-NEXT:    v_max_i32_e32 v0, v0, v1 -; GFX8-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX8-NEXT:    ; return to shader part epilog +; GFX8-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX10-LABEL: abs_vgpr_i32:  ; GFX10:       ; %bb.0: +; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, 0, v0  ; GFX10-NEXT:    v_max_i32_e32 v0, v0, v1 -; GFX10-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX10-NEXT:    ; return to shader part epilog +; GFX10-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX1250-LABEL: abs_vgpr_i32:  ; GFX1250:       ; %bb.0: +; GFX1250-NEXT:    s_wait_loadcnt_dscnt 0x0 +; GFX1250-NEXT:    s_wait_kmcnt 0x0  ; GFX1250-NEXT:    v_sub_nc_u32_e32 v1, 0, v0 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_1)  ; GFX1250-NEXT:    v_max_i32_e32 v0, v0, v1 -; GFX1250-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX1250-NEXT:    ; return to shader part epilog +; GFX1250-NEXT:    s_set_pc_i64 s[30:31]    %res = call i32 @llvm.abs.i32(i32 %arg, i1 false)    ret i32 %res  } -define amdgpu_cs i64 @abs_vgpr_i64(i64 %arg) { +define i64 @abs_vgpr_i64(i64 %arg) {  ; GFX6-LABEL: abs_vgpr_i64:  ; GFX6:       ; %bb.0: +; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX6-NEXT:    v_ashrrev_i32_e32 v2, 31, v1  ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, v0, v2  ; GFX6-NEXT:    v_addc_u32_e32 v1, vcc, v1, v2, vcc  ; GFX6-NEXT:    v_xor_b32_e32 v0, v0, v2  ; GFX6-NEXT:    v_xor_b32_e32 v1, v1, v2 -; GFX6-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX6-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX6-NEXT:    ; return to shader part epilog +; GFX6-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX8-LABEL: abs_vgpr_i64:  ; GFX8:       ; %bb.0: +; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX8-NEXT:    v_ashrrev_i32_e32 v2, 31, v1  ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2  ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, v1, v2, vcc  ; GFX8-NEXT:    v_xor_b32_e32 v0, v0, v2  ; GFX8-NEXT:    v_xor_b32_e32 v1, v1, v2 -; GFX8-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX8-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX8-NEXT:    ; return to shader part epilog +; GFX8-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX10-LABEL: abs_vgpr_i64:  ; GFX10:       ; %bb.0: +; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX10-NEXT:    v_ashrrev_i32_e32 v2, 31, v1  ; GFX10-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2  ; GFX10-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v1, v2, vcc_lo  ; GFX10-NEXT:    v_xor_b32_e32 v0, v0, v2  ; GFX10-NEXT:    v_xor_b32_e32 v1, v1, v2 -; GFX10-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX10-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX10-NEXT:    ; return to shader part epilog +; GFX10-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX1250-LABEL: abs_vgpr_i64:  ; GFX1250:       ; %bb.0: +; GFX1250-NEXT:    s_wait_loadcnt_dscnt 0x0 +; GFX1250-NEXT:    s_wait_kmcnt 0x0  ; GFX1250-NEXT:    v_ashrrev_i32_e32 v2, 31, v1  ; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)  ; GFX1250-NEXT:    v_mov_b32_e32 v3, v2 @@ -214,17 +215,15 @@ define amdgpu_cs i64 @abs_vgpr_i64(i64 %arg) {  ; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)  ; GFX1250-NEXT:    v_xor_b32_e32 v0, v0, v2  ; GFX1250-NEXT:    v_xor_b32_e32 v1, v1, v2 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) -; GFX1250-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX1250-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX1250-NEXT:    ; return to shader part epilog +; GFX1250-NEXT:    s_set_pc_i64 s[30:31]    %res = call i64 @llvm.abs.i64(i64 %arg, i1 false)    ret i64 %res  } -define amdgpu_cs <4 x i32> @abs_vgpr_v4i32(<4 x i32> %arg) { +define <4 x i32> @abs_vgpr_v4i32(<4 x i32> %arg) {  ; GFX6-LABEL: abs_vgpr_v4i32:  ; GFX6:       ; %bb.0: +; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, 0, v0  ; GFX6-NEXT:    v_max_i32_e32 v0, v0, v4  ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, 0, v1 @@ -233,14 +232,11 @@ define amdgpu_cs <4 x i32> @abs_vgpr_v4i32(<4 x i32> %arg) {  ; GFX6-NEXT:    v_max_i32_e32 v2, v2, v4  ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, 0, v3  ; GFX6-NEXT:    v_max_i32_e32 v3, v3, v4 -; GFX6-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX6-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX6-NEXT:    v_readfirstlane_b32 s2, v2 -; GFX6-NEXT:    v_readfirstlane_b32 s3, v3 -; GFX6-NEXT:    ; return to shader part epilog +; GFX6-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX8-LABEL: abs_vgpr_v4i32:  ; GFX8:       ; %bb.0: +; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX8-NEXT:    v_sub_u32_e32 v4, vcc, 0, v0  ; GFX8-NEXT:    v_max_i32_e32 v0, v0, v4  ; GFX8-NEXT:    v_sub_u32_e32 v4, vcc, 0, v1 @@ -249,14 +245,11 @@ define amdgpu_cs <4 x i32> @abs_vgpr_v4i32(<4 x i32> %arg) {  ; GFX8-NEXT:    v_max_i32_e32 v2, v2, v4  ; GFX8-NEXT:    v_sub_u32_e32 v4, vcc, 0, v3  ; GFX8-NEXT:    v_max_i32_e32 v3, v3, v4 -; GFX8-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX8-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX8-NEXT:    v_readfirstlane_b32 s2, v2 -; GFX8-NEXT:    v_readfirstlane_b32 s3, v3 -; GFX8-NEXT:    ; return to shader part epilog +; GFX8-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX10-LABEL: abs_vgpr_v4i32:  ; GFX10:       ; %bb.0: +; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX10-NEXT:    v_sub_nc_u32_e32 v4, 0, v0  ; GFX10-NEXT:    v_sub_nc_u32_e32 v5, 0, v1  ; GFX10-NEXT:    v_sub_nc_u32_e32 v6, 0, v2 @@ -265,14 +258,12 @@ define amdgpu_cs <4 x i32> @abs_vgpr_v4i32(<4 x i32> %arg) {  ; GFX10-NEXT:    v_max_i32_e32 v1, v1, v5  ; GFX10-NEXT:    v_max_i32_e32 v2, v2, v6  ; GFX10-NEXT:    v_max_i32_e32 v3, v3, v7 -; GFX10-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX10-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX10-NEXT:    v_readfirstlane_b32 s2, v2 -; GFX10-NEXT:    v_readfirstlane_b32 s3, v3 -; GFX10-NEXT:    ; return to shader part epilog +; GFX10-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX1250-LABEL: abs_vgpr_v4i32:  ; GFX1250:       ; %bb.0: +; GFX1250-NEXT:    s_wait_loadcnt_dscnt 0x0 +; GFX1250-NEXT:    s_wait_kmcnt 0x0  ; GFX1250-NEXT:    v_dual_sub_nc_u32 v4, 0, v0 :: v_dual_sub_nc_u32 v5, 0, v1  ; GFX1250-NEXT:    v_dual_sub_nc_u32 v6, 0, v2 :: v_dual_sub_nc_u32 v7, 0, v3  ; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_3) @@ -281,13 +272,7 @@ define amdgpu_cs <4 x i32> @abs_vgpr_v4i32(<4 x i32> %arg) {  ; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_4)  ; GFX1250-NEXT:    v_max_i32_e32 v2, v2, v6  ; GFX1250-NEXT:    v_max_i32_e32 v3, v3, v7 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) -; GFX1250-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX1250-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) -; GFX1250-NEXT:    v_readfirstlane_b32 s2, v2 -; GFX1250-NEXT:    v_readfirstlane_b32 s3, v3 -; GFX1250-NEXT:    ; return to shader part epilog +; GFX1250-NEXT:    s_set_pc_i64 s[30:31]    %res = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %arg, i1 false)    ret <4 x i32> %res  } @@ -304,44 +289,43 @@ define amdgpu_cs <2 x i8> @abs_sgpr_v2i8(<2 x i8> inreg %arg) {    ret <2 x i8> %res  } -define amdgpu_cs <2 x i8> @abs_vgpr_v2i8(<2 x i8> %arg) { +define <2 x i8> @abs_vgpr_v2i8(<2 x i8> %arg) {  ; GFX6-LABEL: abs_vgpr_v2i8:  ; GFX6:       ; %bb.0: +; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX6-NEXT:    v_bfe_i32 v0, v0, 0, 8  ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, 0, v0  ; GFX6-NEXT:    v_bfe_i32 v1, v1, 0, 8  ; GFX6-NEXT:    v_max_i32_e32 v0, v0, v2  ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, 0, v1  ; GFX6-NEXT:    v_max_i32_e32 v1, v1, v2 -; GFX6-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX6-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX6-NEXT:    ; return to shader part epilog +; GFX6-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX8-LABEL: abs_vgpr_v2i8:  ; GFX8:       ; %bb.0: +; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX8-NEXT:    v_mov_b32_e32 v2, 0  ; GFX8-NEXT:    v_sub_u16_sdwa v3, v2, sext(v0) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0  ; GFX8-NEXT:    v_sub_u16_sdwa v2, v2, sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0  ; GFX8-NEXT:    v_max_i16_sdwa v0, sext(v0), v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD  ; GFX8-NEXT:    v_max_i16_sdwa v1, sext(v1), v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD -; GFX8-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX8-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX8-NEXT:    ; return to shader part epilog +; GFX8-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX10-LABEL: abs_vgpr_v2i8:  ; GFX10:       ; %bb.0: +; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX10-NEXT:    v_bfe_i32 v0, v0, 0, 8  ; GFX10-NEXT:    v_bfe_i32 v1, v1, 0, 8  ; GFX10-NEXT:    v_sub_nc_u16 v2, 0, v0  ; GFX10-NEXT:    v_sub_nc_u16 v3, 0, v1  ; GFX10-NEXT:    v_max_i16 v0, v0, v2  ; GFX10-NEXT:    v_max_i16 v1, v1, v3 -; GFX10-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX10-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX10-NEXT:    ; return to shader part epilog +; GFX10-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX1250-LABEL: abs_vgpr_v2i8:  ; GFX1250:       ; %bb.0: +; GFX1250-NEXT:    s_wait_loadcnt_dscnt 0x0 +; GFX1250-NEXT:    s_wait_kmcnt 0x0  ; GFX1250-NEXT:    v_bfe_i32 v0, v0, 0, 8  ; GFX1250-NEXT:    v_bfe_i32 v1, v1, 0, 8  ; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) @@ -350,10 +334,7 @@ define amdgpu_cs <2 x i8> @abs_vgpr_v2i8(<2 x i8> %arg) {  ; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)  ; GFX1250-NEXT:    v_max_i16 v0, v0, v2  ; GFX1250-NEXT:    v_max_i16 v1, v1, v3 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) -; GFX1250-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX1250-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX1250-NEXT:    ; return to shader part epilog +; GFX1250-NEXT:    s_set_pc_i64 s[30:31]    %res = call <2 x i8> @llvm.abs.v2i8(<2 x i8> %arg, i1 false)    ret <2 x i8> %res  } @@ -372,9 +353,10 @@ define amdgpu_cs <3 x i8> @abs_sgpr_v3i8(<3 x i8> inreg %arg) {    ret <3 x i8> %res  } -define amdgpu_cs <3 x i8> @abs_vgpr_v3i8(<3 x i8>  %arg) { +define <3 x i8> @abs_vgpr_v3i8(<3 x i8>  %arg) {  ; GFX6-LABEL: abs_vgpr_v3i8:  ; GFX6:       ; %bb.0: +; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX6-NEXT:    v_bfe_i32 v0, v0, 0, 8  ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, 0, v0  ; GFX6-NEXT:    v_bfe_i32 v1, v1, 0, 8 @@ -384,13 +366,11 @@ define amdgpu_cs <3 x i8> @abs_vgpr_v3i8(<3 x i8>  %arg) {  ; GFX6-NEXT:    v_max_i32_e32 v1, v1, v3  ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, 0, v2  ; GFX6-NEXT:    v_max_i32_e32 v2, v2, v3 -; GFX6-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX6-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX6-NEXT:    v_readfirstlane_b32 s2, v2 -; GFX6-NEXT:    ; return to shader part epilog +; GFX6-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX8-LABEL: abs_vgpr_v3i8:  ; GFX8:       ; %bb.0: +; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX8-NEXT:    v_mov_b32_e32 v3, 0  ; GFX8-NEXT:    v_sub_u16_sdwa v4, v3, sext(v0) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0  ; GFX8-NEXT:    v_max_i16_sdwa v0, sext(v0), v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD @@ -398,13 +378,11 @@ define amdgpu_cs <3 x i8> @abs_vgpr_v3i8(<3 x i8>  %arg) {  ; GFX8-NEXT:    v_sub_u16_sdwa v3, v3, sext(v2) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0  ; GFX8-NEXT:    v_max_i16_sdwa v1, sext(v1), v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD  ; GFX8-NEXT:    v_max_i16_sdwa v2, sext(v2), v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD -; GFX8-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX8-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX8-NEXT:    v_readfirstlane_b32 s2, v2 -; GFX8-NEXT:    ; return to shader part epilog +; GFX8-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX10-LABEL: abs_vgpr_v3i8:  ; GFX10:       ; %bb.0: +; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX10-NEXT:    v_bfe_i32 v0, v0, 0, 8  ; GFX10-NEXT:    v_bfe_i32 v1, v1, 0, 8  ; GFX10-NEXT:    v_bfe_i32 v2, v2, 0, 8 @@ -414,13 +392,12 @@ define amdgpu_cs <3 x i8> @abs_vgpr_v3i8(<3 x i8>  %arg) {  ; GFX10-NEXT:    v_max_i16 v0, v0, v3  ; GFX10-NEXT:    v_max_i16 v1, v1, v4  ; GFX10-NEXT:    v_max_i16 v2, v2, v5 -; GFX10-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX10-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX10-NEXT:    v_readfirstlane_b32 s2, v2 -; GFX10-NEXT:    ; return to shader part epilog +; GFX10-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX1250-LABEL: abs_vgpr_v3i8:  ; GFX1250:       ; %bb.0: +; GFX1250-NEXT:    s_wait_loadcnt_dscnt 0x0 +; GFX1250-NEXT:    s_wait_kmcnt 0x0  ; GFX1250-NEXT:    v_bfe_i32 v0, v0, 0, 8  ; GFX1250-NEXT:    v_bfe_i32 v1, v1, 0, 8  ; GFX1250-NEXT:    v_bfe_i32 v2, v2, 0, 8 @@ -433,12 +410,7 @@ define amdgpu_cs <3 x i8> @abs_vgpr_v3i8(<3 x i8>  %arg) {  ; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)  ; GFX1250-NEXT:    v_max_i16 v1, v1, v4  ; GFX1250-NEXT:    v_max_i16 v2, v2, v5 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) -; GFX1250-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX1250-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_3) -; GFX1250-NEXT:    v_readfirstlane_b32 s2, v2 -; GFX1250-NEXT:    ; return to shader part epilog +; GFX1250-NEXT:    s_set_pc_i64 s[30:31]    %res = call <3 x i8> @llvm.abs.v3i8(<3 x i8> %arg, i1 false)    ret <3 x i8> %res  } @@ -485,44 +457,44 @@ define amdgpu_cs <2 x i16> @abs_sgpr_v2i16(<2 x i16> inreg %arg) {    ret <2 x i16> %res  } -define amdgpu_cs <2 x i16> @abs_vgpr_v2i16(<2 x i16> %arg) { +define <2 x i16> @abs_vgpr_v2i16(<2 x i16> %arg) {  ; GFX6-LABEL: abs_vgpr_v2i16:  ; GFX6:       ; %bb.0: +; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX6-NEXT:    v_bfe_i32 v0, v0, 0, 16  ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, 0, v0  ; GFX6-NEXT:    v_bfe_i32 v1, v1, 0, 16  ; GFX6-NEXT:    v_max_i32_e32 v0, v0, v2  ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, 0, v1  ; GFX6-NEXT:    v_max_i32_e32 v1, v1, v2 -; GFX6-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX6-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX6-NEXT:    ; return to shader part epilog +; GFX6-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX8-LABEL: abs_vgpr_v2i16:  ; GFX8:       ; %bb.0: +; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX8-NEXT:    v_mov_b32_e32 v2, 0  ; GFX8-NEXT:    v_sub_u16_e32 v1, 0, v0  ; GFX8-NEXT:    v_sub_u16_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1  ; GFX8-NEXT:    v_max_i16_e32 v1, v0, v1  ; GFX8-NEXT:    v_max_i16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD  ; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0 -; GFX8-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX8-NEXT:    ; return to shader part epilog +; GFX8-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX10-LABEL: abs_vgpr_v2i16:  ; GFX10:       ; %bb.0: +; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX10-NEXT:    v_pk_sub_i16 v1, 0, v0  ; GFX10-NEXT:    v_pk_max_i16 v0, v0, v1 -; GFX10-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX10-NEXT:    ; return to shader part epilog +; GFX10-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX1250-LABEL: abs_vgpr_v2i16:  ; GFX1250:       ; %bb.0: +; GFX1250-NEXT:    s_wait_loadcnt_dscnt 0x0 +; GFX1250-NEXT:    s_wait_kmcnt 0x0  ; GFX1250-NEXT:    v_pk_sub_i16 v1, 0, v0 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_1)  ; GFX1250-NEXT:    v_pk_max_i16 v0, v0, v1 -; GFX1250-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX1250-NEXT:    ; return to shader part epilog +; GFX1250-NEXT:    s_set_pc_i64 s[30:31]    %res = call <2 x i16> @llvm.abs.v2i16(<2 x i16> %arg, i1 false)    ret <2 x i16> %res  } @@ -576,9 +548,10 @@ define amdgpu_cs <3 x i16> @abs_sgpr_v3i16(<3 x i16> inreg %arg) {    ret <3 x i16> %res  } -define amdgpu_cs <3 x i16> @abs_vgpr_v3i16(<3 x i16> %arg) { +define <3 x i16> @abs_vgpr_v3i16(<3 x i16> %arg) {  ; GFX6-LABEL: abs_vgpr_v3i16:  ; GFX6:       ; %bb.0: +; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX6-NEXT:    v_bfe_i32 v0, v0, 0, 16  ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, 0, v0  ; GFX6-NEXT:    v_bfe_i32 v1, v1, 0, 16 @@ -588,13 +561,11 @@ define amdgpu_cs <3 x i16> @abs_vgpr_v3i16(<3 x i16> %arg) {  ; GFX6-NEXT:    v_max_i32_e32 v1, v1, v3  ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, 0, v2  ; GFX6-NEXT:    v_max_i32_e32 v2, v2, v3 -; GFX6-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX6-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX6-NEXT:    v_readfirstlane_b32 s2, v2 -; GFX6-NEXT:    ; return to shader part epilog +; GFX6-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX8-LABEL: abs_vgpr_v3i16:  ; GFX8:       ; %bb.0: +; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX8-NEXT:    v_mov_b32_e32 v3, 0  ; GFX8-NEXT:    v_sub_u16_e32 v2, 0, v0  ; GFX8-NEXT:    v_sub_u16_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1 @@ -603,31 +574,27 @@ define amdgpu_cs <3 x i16> @abs_vgpr_v3i16(<3 x i16> %arg) {  ; GFX8-NEXT:    v_max_i16_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD  ; GFX8-NEXT:    v_or_b32_e32 v0, v2, v0  ; GFX8-NEXT:    v_max_i16_e32 v1, v1, v4 -; GFX8-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX8-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX8-NEXT:    ; return to shader part epilog +; GFX8-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX10-LABEL: abs_vgpr_v3i16:  ; GFX10:       ; %bb.0: +; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)  ; GFX10-NEXT:    v_pk_sub_i16 v2, 0, v0  ; GFX10-NEXT:    v_sub_nc_u16 v3, 0, v1  ; GFX10-NEXT:    v_pk_max_i16 v0, v0, v2  ; GFX10-NEXT:    v_max_i16 v1, v1, v3 -; GFX10-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX10-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX10-NEXT:    ; return to shader part epilog +; GFX10-NEXT:    s_setpc_b64 s[30:31]  ;  ; GFX1250-LABEL: abs_vgpr_v3i16:  ; GFX1250:       ; %bb.0: +; GFX1250-NEXT:    s_wait_loadcnt_dscnt 0x0 +; GFX1250-NEXT:    s_wait_kmcnt 0x0  ; GFX1250-NEXT:    v_pk_sub_i16 v2, 0, v0  ; GFX1250-NEXT:    v_sub_nc_u16 v3, 0, v1  ; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)  ; GFX1250-NEXT:    v_pk_max_i16 v0, v0, v2  ; GFX1250-NEXT:    v_max_i16 v1, v1, v3 -; GFX1250-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) -; GFX1250-NEXT:    v_readfirstlane_b32 s0, v0 -; GFX1250-NEXT:    v_readfirstlane_b32 s1, v1 -; GFX1250-NEXT:    ; return to shader part epilog +; GFX1250-NEXT:    s_set_pc_i64 s[30:31]    %res = call <3 x i16> @llvm.abs.v3i16(<3 x i16> %arg, i1 false)    ret <3 x i16> %res  } diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll index e86f747..37b5422 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll @@ -1,11 +1,11 @@  ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4 -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx600 < %s | FileCheck -check-prefix=GFX6 %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10WGP %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+cumode < %s | FileCheck -check-prefix=GFX10CU %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11WGP %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode < %s | FileCheck -check-prefix=GFX11CU %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx600 < %s | FileCheck -check-prefix=GFX6 %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10WGP %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+cumode < %s | FileCheck -check-prefix=GFX10CU %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11WGP %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode < %s | FileCheck -check-prefix=GFX11CU %s  ; Note: we use MIR test checks + stop after legalizer to prevent  ; tests from being optimized out. diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll index 44b12a9..61a6137 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll @@ -1,5 +1,5 @@  ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 -; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 -stop-after=finalize-isel < %s | FileCheck %s +; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx900 -stop-after=finalize-isel < %s | FileCheck %s  declare void @readsMem(ptr) #0  declare void @writesMem(ptr) #1 diff --git a/llvm/test/CodeGen/AMDGPU/callbr.ll b/llvm/test/CodeGen/AMDGPU/callbr.ll new file mode 100644 index 0000000..253a6ec --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/callbr.ll @@ -0,0 +1,54 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mtriple=amdgcn -mcpu=gfx90a < %s | FileCheck %s + +define void @callbr_inline_asm(ptr %src, ptr %dst1, ptr %dst2, i32 %c) { +; CHECK-LABEL: callbr_inline_asm: +; CHECK:       ; %bb.0: +; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; CHECK-NEXT:    flat_load_dword v0, v[0:1] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    v_cmp_gt_i32 vcc v6, 42; s_cbranch_vccnz .LBB0_2 +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  ; %bb.1: ; %fallthrough +; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0) +; CHECK-NEXT:    flat_store_dword v[2:3], v0 +; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0) +; CHECK-NEXT:    s_setpc_b64 s[30:31] +; CHECK-NEXT:  .LBB0_2: ; Inline asm indirect target +; CHECK-NEXT:    ; %indirect +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0) +; CHECK-NEXT:    flat_store_dword v[4:5], v0 +; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0) +; CHECK-NEXT:    s_setpc_b64 s[30:31] +	%a = load i32, ptr %src, align 4 +	callbr void asm "v_cmp_gt_i32 vcc $0, 42; s_cbranch_vccnz ${1:l}", "r,!i"(i32 %c) to label %fallthrough [label %indirect] +fallthrough: +	store i32 %a, ptr %dst1, align 4 +	br label %ret +indirect: +	store i32 %a, ptr %dst2, align 4 +	br label %ret +ret: +	ret void +} + +define void @callbr_self_loop(i1 %c) { +; CHECK-LABEL: callbr_self_loop: +; CHECK:       ; %bb.0: +; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; CHECK-NEXT:  .LBB1_1: ; %callbr +; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1 +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:    s_branch .LBB1_1 +; CHECK-NEXT:  .LBB1_2: ; Inline asm indirect target +; CHECK-NEXT:    ; %callbr.target.ret +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    s_setpc_b64 s[30:31] +  br label %callbr +callbr: +  callbr void asm "", "!i"() to label %callbr [label %ret] +ret: +  ret void +} diff --git a/llvm/test/CodeGen/AMDGPU/do-not-unify-divergent-exit-nodes-with-musttail.ll b/llvm/test/CodeGen/AMDGPU/do-not-unify-divergent-exit-nodes-with-musttail.ll index 007e3f0..076a99f 100644 --- a/llvm/test/CodeGen/AMDGPU/do-not-unify-divergent-exit-nodes-with-musttail.ll +++ b/llvm/test/CodeGen/AMDGPU/do-not-unify-divergent-exit-nodes-with-musttail.ll @@ -3,6 +3,7 @@  declare void @foo(ptr)  declare i1 @bar(ptr) +declare i32 @bar32(ptr)  define void @musttail_call_without_return_value(ptr %p) {  ; CHECK-LABEL: define void @musttail_call_without_return_value( @@ -28,6 +29,31 @@ bb.1:    ret void  } +define void @musttail_call_without_return_value_callbr(ptr %p) { +; CHECK-LABEL: define void @musttail_call_without_return_value_callbr( +; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:  [[ENTRY:.*:]] +; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[P]], align 1 +; CHECK-NEXT:    callbr void asm "", "r,!i"(i32 [[LOAD]]) +; CHECK-NEXT:            to label %[[BB_0:.*]] [label %bb.1] +; CHECK:       [[BB_0]]: +; CHECK-NEXT:    musttail call void @foo(ptr [[P]]) +; CHECK-NEXT:    ret void +; CHECK:       [[BB_1:.*:]] +; CHECK-NEXT:    ret void +; +entry: +  %load = load i32, ptr %p, align 1 +  callbr void asm "", "r,!i"(i32 %load) to label %bb.0 [label %bb.1] + +bb.0: +  musttail call void @foo(ptr %p) +  ret void + +bb.1: +  ret void +} +  define i1 @musttail_call_with_return_value(ptr %p) {  ; CHECK-LABEL: define i1 @musttail_call_with_return_value(  ; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] { @@ -51,3 +77,28 @@ bb.0:  bb.1:    ret i1 %load  } + +define i32 @musttail_call_with_return_value_callbr(ptr %p) { +; CHECK-LABEL: define i32 @musttail_call_with_return_value_callbr( +; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:  [[ENTRY:.*:]] +; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[P]], align 1 +; CHECK-NEXT:    callbr void asm "", "r,!i"(i32 [[LOAD]]) +; CHECK-NEXT:            to label %[[BB_0:.*]] [label %bb.1] +; CHECK:       [[BB_0]]: +; CHECK-NEXT:    [[RET:%.*]] = musttail call i32 @bar32(ptr [[P]]) +; CHECK-NEXT:    ret i32 [[RET]] +; CHECK:       [[BB_1:.*:]] +; CHECK-NEXT:    ret i32 [[LOAD]] +; +entry: +  %load = load i32, ptr %p, align 1 +  callbr void asm "", "r,!i"(i32 %load) to label %bb.0 [label %bb.1] + +bb.0: +  %ret = musttail call i32 @bar32(ptr %p) +  ret i32 %ret + +bb.1: +  ret i32 %load +} diff --git a/llvm/test/CodeGen/AMDGPU/infinite-loop.ll b/llvm/test/CodeGen/AMDGPU/infinite-loop.ll index 3e2e43f..df63592 100644 --- a/llvm/test/CodeGen/AMDGPU/infinite-loop.ll +++ b/llvm/test/CodeGen/AMDGPU/infinite-loop.ll @@ -36,26 +36,60 @@ loop:    br label %loop  } +define amdgpu_kernel void @infinite_loop_callbr(ptr addrspace(1) %out) { +; SI-LABEL: infinite_loop_callbr: +; SI:       ; %bb.0: ; %entry +; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9 +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:    s_mov_b32 s3, 0xf000 +; SI-NEXT:    s_mov_b32 s2, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 +; SI-NEXT:    s_waitcnt lgkmcnt(0) +; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:    s_endpgm +; IR-LABEL: @infinite_loop_callbr( +; IR-NEXT:  entry: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP:%.*]] [] +; IR:       loop: +; IR-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK:%.*]], label [[DUMMYRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP]] [] +; IR:       DummyReturnBlock: +; IR-NEXT:    ret void +; +entry: +  callbr void asm "", ""() to label %loop [] + +loop: +  store volatile i32 999, ptr addrspace(1) %out, align 4 +  callbr void asm "", ""() to label %loop [] +} +  define amdgpu_kernel void @infinite_loop_ret(ptr addrspace(1) %out) {  ; SI-LABEL: infinite_loop_ret:  ; SI:       ; %bb.0: ; %entry  ; SI-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0  ; SI-NEXT:    s_and_saveexec_b64 s[0:1], vcc -; SI-NEXT:    s_cbranch_execz .LBB1_3 +; SI-NEXT:    s_cbranch_execz .LBB2_3  ; SI-NEXT:  ; %bb.1: ; %loop.preheader  ; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9  ; SI-NEXT:    s_mov_b32 s3, 0xf000  ; SI-NEXT:    s_mov_b32 s2, -1  ; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7  ; SI-NEXT:    s_and_b64 vcc, exec, -1 -; SI-NEXT:  .LBB1_2: ; %loop +; SI-NEXT:  .LBB2_2: ; %loop  ; SI-NEXT:    ; =>This Inner Loop Header: Depth=1  ; SI-NEXT:    s_waitcnt lgkmcnt(0)  ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0  ; SI-NEXT:    s_waitcnt vmcnt(0)  ; SI-NEXT:    s_mov_b64 vcc, vcc -; SI-NEXT:    s_cbranch_vccnz .LBB1_2 -; SI-NEXT:  .LBB1_3: ; %UnifiedReturnBlock +; SI-NEXT:    s_cbranch_vccnz .LBB2_2 +; SI-NEXT:  .LBB2_3: ; %UnifiedReturnBlock  ; SI-NEXT:    s_endpgm  ; IR-LABEL: @infinite_loop_ret(  ; IR-NEXT:  entry: @@ -81,44 +115,93 @@ return:    ret void  } +define amdgpu_kernel void @infinite_loop_ret_callbr(ptr addrspace(1) %out) { +; SI-LABEL: infinite_loop_ret_callbr: +; SI:       ; %bb.0: ; %entry +; SI-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0 +; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:  ; %bb.1: ; %loop.preheader +; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9 +; SI-NEXT:    s_mov_b32 s3, 0xf000 +; SI-NEXT:    s_mov_b32 s2, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 +; SI-NEXT:    s_waitcnt lgkmcnt(0) +; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:  .LBB3_2: ; Inline asm indirect target +; SI-NEXT:    ; %UnifiedReturnBlock +; SI-NEXT:    ; Label of block must be emitted +; SI-NEXT:    s_endpgm +; IR-LABEL: @infinite_loop_ret_callbr( +; IR-NEXT:  entry: +; IR-NEXT:    [[TMP:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x() +; IR-NEXT:    [[COND:%.*]] = icmp eq i32 [[TMP]], 1 +; IR-NEXT:    [[COND32:%.*]] = zext i1 [[COND]] to i32 +; IR-NEXT:    callbr void asm "", "r,!i"(i32 [[COND32]]) +; IR-NEXT:            to label [[LOOP:%.*]] [label %UnifiedReturnBlock] +; IR:       loop: +; IR-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK:%.*]], label [[UNIFIEDRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP]] [] +; IR:       UnifiedReturnBlock: +; IR-NEXT:    ret void +; +entry: +  %tmp = tail call i32 @llvm.amdgcn.workitem.id.x() +  %cond = icmp eq i32 %tmp, 1 +  %cond32 = zext i1 %cond to i32 +  callbr void asm "", "r,!i"(i32 %cond32) to label %loop [label %return] + +loop: +  store volatile i32 999, ptr addrspace(1) %out, align 4 +  callbr void asm "", ""() to label %loop [] + +return: +  ret void +} +  define amdgpu_kernel void @infinite_loops(ptr addrspace(1) %out) {  ; SI-LABEL: infinite_loops:  ; SI:       ; %bb.0: ; %entry  ; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9  ; SI-NEXT:    s_mov_b64 s[2:3], -1 -; SI-NEXT:    s_cbranch_scc1 .LBB2_4 +; SI-NEXT:    s_cbranch_scc1 .LBB4_4  ; SI-NEXT:  ; %bb.1:  ; SI-NEXT:    s_mov_b32 s3, 0xf000  ; SI-NEXT:    s_mov_b32 s2, -1  ; SI-NEXT:    v_mov_b32_e32 v0, 0x378  ; SI-NEXT:    s_and_b64 vcc, exec, -1 -; SI-NEXT:  .LBB2_2: ; %loop2 +; SI-NEXT:  .LBB4_2: ; %loop2  ; SI-NEXT:    ; =>This Inner Loop Header: Depth=1  ; SI-NEXT:    s_waitcnt lgkmcnt(0)  ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0  ; SI-NEXT:    s_waitcnt vmcnt(0)  ; SI-NEXT:    s_mov_b64 vcc, vcc -; SI-NEXT:    s_cbranch_vccnz .LBB2_2 +; SI-NEXT:    s_cbranch_vccnz .LBB4_2  ; SI-NEXT:  ; %bb.3: ; %Flow  ; SI-NEXT:    s_mov_b64 s[2:3], 0 -; SI-NEXT:  .LBB2_4: ; %Flow2 +; SI-NEXT:  .LBB4_4: ; %Flow2  ; SI-NEXT:    s_and_b64 vcc, exec, s[2:3]  ; SI-NEXT:    s_waitcnt lgkmcnt(0)  ; SI-NEXT:    s_mov_b64 vcc, vcc -; SI-NEXT:    s_cbranch_vccz .LBB2_7 +; SI-NEXT:    s_cbranch_vccz .LBB4_7  ; SI-NEXT:  ; %bb.5:  ; SI-NEXT:    s_mov_b32 s3, 0xf000  ; SI-NEXT:    s_mov_b32 s2, -1  ; SI-NEXT:    s_waitcnt expcnt(0)  ; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7  ; SI-NEXT:    s_and_b64 vcc, exec, 0 -; SI-NEXT:  .LBB2_6: ; %loop1 +; SI-NEXT:  .LBB4_6: ; %loop1  ; SI-NEXT:    ; =>This Inner Loop Header: Depth=1  ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0  ; SI-NEXT:    s_waitcnt vmcnt(0)  ; SI-NEXT:    s_mov_b64 vcc, vcc -; SI-NEXT:    s_cbranch_vccz .LBB2_6 -; SI-NEXT:  .LBB2_7: ; %DummyReturnBlock +; SI-NEXT:    s_cbranch_vccz .LBB4_6 +; SI-NEXT:  .LBB4_7: ; %DummyReturnBlock  ; SI-NEXT:    s_endpgm  ; IR-LABEL: @infinite_loops(  ; IR-NEXT:  entry: @@ -144,24 +227,78 @@ loop2:    br label %loop2  } +define amdgpu_kernel void @infinite_loops_callbr(ptr addrspace(1) %out) { +; SI-LABEL: infinite_loops_callbr: +; SI:       ; %bb.0: ; %entry +; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9 +; SI-NEXT:    s_waitcnt lgkmcnt(0) +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:  ; %bb.1: ; %loop1 +; SI-NEXT:    s_mov_b32 s3, 0xf000 +; SI-NEXT:    s_mov_b32 s2, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 +; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:    s_endpgm +; SI-NEXT:  .LBB5_2: ; Inline asm indirect target +; SI-NEXT:    ; %loop2.preheader +; SI-NEXT:    ; Label of block must be emitted +; SI-NEXT:    s_mov_b32 s3, 0xf000 +; SI-NEXT:    s_mov_b32 s2, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x378 +; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:    s_endpgm +; IR-LABEL: @infinite_loops_callbr( +; IR-NEXT:  entry: +; IR-NEXT:    callbr void asm "", "r,!i"(i32 poison) +; IR-NEXT:            to label [[LOOP1:%.*]] [label %loop2] +; IR:       loop1: +; IR-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK:%.*]], label [[DUMMYRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP1]] [] +; IR:       loop2: +; IR-NEXT:    store volatile i32 888, ptr addrspace(1) [[OUT]], align 4 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK1:%.*]], label [[DUMMYRETURNBLOCK]] +; IR:       TransitionBlock1: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP2:%.*]] [] +; IR:       DummyReturnBlock: +; IR-NEXT:    ret void +; +entry: +  callbr void asm "", "r,!i"(i32 poison) to label %loop1 [label %loop2] + +loop1: +  store volatile i32 999, ptr addrspace(1) %out, align 4 +  callbr void asm "", ""() to label %loop1 [] + +loop2: +  store volatile i32 888, ptr addrspace(1) %out, align 4 +  callbr void asm "", ""() to label %loop2 [] +} +  define amdgpu_kernel void @infinite_loop_nest_ret(ptr addrspace(1) %out) {  ; SI-LABEL: infinite_loop_nest_ret:  ; SI:       ; %bb.0: ; %entry  ; SI-NEXT:    v_cmp_ne_u32_e32 vcc, 1, v0  ; SI-NEXT:    s_and_saveexec_b64 s[0:1], vcc -; SI-NEXT:    s_cbranch_execz .LBB3_5 +; SI-NEXT:    s_cbranch_execz .LBB6_5  ; SI-NEXT:  ; %bb.1: ; %outer_loop.preheader  ; SI-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x9  ; SI-NEXT:    v_cmp_ne_u32_e64 s[0:1], 3, v0  ; SI-NEXT:    s_mov_b32 s7, 0xf000  ; SI-NEXT:    s_mov_b32 s6, -1  ; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 -; SI-NEXT:  .LBB3_2: ; %outer_loop +; SI-NEXT:  .LBB6_2: ; %outer_loop  ; SI-NEXT:    ; =>This Loop Header: Depth=1 -; SI-NEXT:    ; Child Loop BB3_3 Depth 2 +; SI-NEXT:    ; Child Loop BB6_3 Depth 2  ; SI-NEXT:    s_mov_b64 s[2:3], 0 -; SI-NEXT:  .LBB3_3: ; %inner_loop -; SI-NEXT:    ; Parent Loop BB3_2 Depth=1 +; SI-NEXT:  .LBB6_3: ; %inner_loop +; SI-NEXT:    ; Parent Loop BB6_2 Depth=1  ; SI-NEXT:    ; => This Inner Loop Header: Depth=2  ; SI-NEXT:    s_and_b64 s[8:9], exec, s[0:1]  ; SI-NEXT:    s_or_b64 s[2:3], s[8:9], s[2:3] @@ -169,13 +306,13 @@ define amdgpu_kernel void @infinite_loop_nest_ret(ptr addrspace(1) %out) {  ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0  ; SI-NEXT:    s_waitcnt vmcnt(0)  ; SI-NEXT:    s_andn2_b64 exec, exec, s[2:3] -; SI-NEXT:    s_cbranch_execnz .LBB3_3 +; SI-NEXT:    s_cbranch_execnz .LBB6_3  ; SI-NEXT:  ; %bb.4: ; %loop.exit.guard -; SI-NEXT:    ; in Loop: Header=BB3_2 Depth=1 +; SI-NEXT:    ; in Loop: Header=BB6_2 Depth=1  ; SI-NEXT:    s_or_b64 exec, exec, s[2:3]  ; SI-NEXT:    s_mov_b64 vcc, 0 -; SI-NEXT:    s_branch .LBB3_2 -; SI-NEXT:  .LBB3_5: ; %UnifiedReturnBlock +; SI-NEXT:    s_branch .LBB6_2 +; SI-NEXT:  .LBB6_5: ; %UnifiedReturnBlock  ; SI-NEXT:    s_endpgm  ; IR-LABEL: @infinite_loop_nest_ret(  ; IR-NEXT:  entry: @@ -212,4 +349,82 @@ return:    ret void  } +define amdgpu_kernel void @infinite_loop_nest_ret_callbr(ptr addrspace(1) %out) { +; SI-LABEL: infinite_loop_nest_ret_callbr: +; SI:       ; %bb.0: ; %entry +; SI-NEXT:    v_cmp_ne_u32_e32 vcc, 1, v0 +; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:  ; %bb.1: ; %outer_loop.preheader +; SI-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x9 +; SI-NEXT:    s_mov_b32 s7, 0xf000 +; SI-NEXT:    s_mov_b32 s6, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 +; SI-NEXT:    s_and_b64 s[0:1], exec, 0 +; SI-NEXT:    s_branch .LBB7_3 +; SI-NEXT:  .LBB7_2: ; %loop.exit.guard +; SI-NEXT:    ; in Loop: Header=BB7_3 Depth=1 +; SI-NEXT:    s_and_b64 vcc, exec, s[2:3] +; SI-NEXT:    s_cbranch_vccnz .LBB7_5 +; SI-NEXT:  .LBB7_3: ; %outer_loop +; SI-NEXT:    ; =>This Inner Loop Header: Depth=1 +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:    s_waitcnt lgkmcnt(0) +; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:    s_mov_b64 s[2:3], -1 +; SI-NEXT:    s_mov_b64 vcc, s[0:1] +; SI-NEXT:    s_cbranch_vccz .LBB7_2 +; SI-NEXT:  ; %bb.4: ; %TransitionBlock.target.outer_loop +; SI-NEXT:    ; in Loop: Header=BB7_3 Depth=1 +; SI-NEXT:    s_mov_b64 s[2:3], 0 +; SI-NEXT:    s_branch .LBB7_2 +; SI-NEXT:  .LBB7_5: ; Inline asm indirect target +; SI-NEXT:    ; %UnifiedReturnBlock +; SI-NEXT:    ; Label of block must be emitted +; SI-NEXT:    s_endpgm +; IR-LABEL: @infinite_loop_nest_ret_callbr( +; IR-NEXT:  entry: +; IR-NEXT:    [[TMP:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x() +; IR-NEXT:    [[COND1:%.*]] = icmp ne i32 [[TMP]], 1 +; IR-NEXT:    [[COND1_32:%.*]] = zext i1 [[COND1]] to i32 +; IR-NEXT:    callbr void asm "", "r,!i"(i32 [[COND1_32]]) +; IR-NEXT:            to label [[OUTER_LOOP:%.*]] [label %UnifiedReturnBlock] +; IR:       outer_loop: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[INNER_LOOP:%.*]] [] +; IR:       inner_loop: +; IR-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4 +; IR-NEXT:    [[COND3:%.*]] = icmp eq i32 [[TMP]], 3 +; IR-NEXT:    [[COND3_32:%.*]] = zext i1 [[COND3]] to i32 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK:%.*]], label [[UNIFIEDRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", "r,!i"(i32 [[COND3_32]]) +; IR-NEXT:            to label [[INNER_LOOP]] [label %outer_loop] +; IR:       UnifiedReturnBlock: +; IR-NEXT:    ret void +; +entry: +  %tmp = tail call i32 @llvm.amdgcn.workitem.id.x() +  %cond1 = icmp ne i32 %tmp, 1  ; avoid following BB optimizing away through the domination +  %cond1_32 = zext i1 %cond1 to i32 +  callbr void asm "", "r,!i"(i32 %cond1_32) to label %outer_loop [label %return] + +outer_loop: +  ; %cond2 = icmp eq i32 %tmp, 2 +  ; br i1 %cond2, label %outer_loop, label %inner_loop +  callbr void asm "", ""() to label %inner_loop [] + +inner_loop:                                     ; preds = %LeafBlock, %LeafBlock1 +  store volatile i32 999, ptr addrspace(1) %out, align 4 +  %cond3 = icmp eq i32 %tmp, 3 +  %cond3_32 = zext i1 %cond3 to i32 +  callbr void asm "", "r,!i"(i32 %cond3_32) to label %inner_loop [label %outer_loop] + +return: +  ret void +} +  declare i32 @llvm.amdgcn.workitem.id.x() diff --git a/llvm/test/CodeGen/AMDGPU/promote-alloca-array-to-vector.ll b/llvm/test/CodeGen/AMDGPU/promote-alloca-array-to-vector.ll new file mode 100644 index 0000000..05a0e39 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/promote-alloca-array-to-vector.ll @@ -0,0 +1,325 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -S -mtriple=amdgcn-- -mcpu=gfx1100 -passes=amdgpu-promote-alloca < %s | FileCheck -check-prefix=OPT %s + +define amdgpu_kernel void @large_array_vectors_small_users(<16 x i8> %in, <16 x i8> %add, ptr addrspace(3) %out) #0 { +; OPT-LABEL: define amdgpu_kernel void @large_array_vectors_small_users( +; OPT-SAME: <16 x i8> [[IN:%.*]], <16 x i8> [[ADD:%.*]], ptr addrspace(3) [[OUT:%.*]]) #[[ATTR0:[0-9]+]] { +; OPT-NEXT:  [[ENTRY:.*:]] +; OPT-NEXT:    [[ALLOCA:%.*]] = freeze <128 x i8> poison +; OPT-NEXT:    [[TMP0:%.*]] = extractelement <16 x i8> [[IN]], i64 0 +; OPT-NEXT:    [[TMP1:%.*]] = insertelement <128 x i8> [[ALLOCA]], i8 [[TMP0]], i32 0 +; OPT-NEXT:    [[TMP2:%.*]] = extractelement <16 x i8> [[IN]], i64 1 +; OPT-NEXT:    [[TMP3:%.*]] = insertelement <128 x i8> [[TMP1]], i8 [[TMP2]], i32 1 +; OPT-NEXT:    [[TMP4:%.*]] = extractelement <16 x i8> [[IN]], i64 2 +; OPT-NEXT:    [[TMP5:%.*]] = insertelement <128 x i8> [[TMP3]], i8 [[TMP4]], i32 2 +; OPT-NEXT:    [[TMP6:%.*]] = extractelement <16 x i8> [[IN]], i64 3 +; OPT-NEXT:    [[TMP7:%.*]] = insertelement <128 x i8> [[TMP5]], i8 [[TMP6]], i32 3 +; OPT-NEXT:    [[TMP8:%.*]] = extractelement <16 x i8> [[IN]], i64 4 +; OPT-NEXT:    [[TMP9:%.*]] = insertelement <128 x i8> [[TMP7]], i8 [[TMP8]], i32 4 +; OPT-NEXT:    [[TMP10:%.*]] = extractelement <16 x i8> [[IN]], i64 5 +; OPT-NEXT:    [[TMP11:%.*]] = insertelement <128 x i8> [[TMP9]], i8 [[TMP10]], i32 5 +; OPT-NEXT:    [[TMP12:%.*]] = extractelement <16 x i8> [[IN]], i64 6 +; OPT-NEXT:    [[TMP13:%.*]] = insertelement <128 x i8> [[TMP11]], i8 [[TMP12]], i32 6 +; OPT-NEXT:    [[TMP14:%.*]] = extractelement <16 x i8> [[IN]], i64 7 +; OPT-NEXT:    [[TMP15:%.*]] = insertelement <128 x i8> [[TMP13]], i8 [[TMP14]], i32 7 +; OPT-NEXT:    [[TMP16:%.*]] = extractelement <16 x i8> [[IN]], i64 8 +; OPT-NEXT:    [[TMP17:%.*]] = insertelement <128 x i8> [[TMP15]], i8 [[TMP16]], i32 8 +; OPT-NEXT:    [[TMP18:%.*]] = extractelement <16 x i8> [[IN]], i64 9 +; OPT-NEXT:    [[TMP19:%.*]] = insertelement <128 x i8> [[TMP17]], i8 [[TMP18]], i32 9 +; OPT-NEXT:    [[TMP20:%.*]] = extractelement <16 x i8> [[IN]], i64 10 +; OPT-NEXT:    [[TMP21:%.*]] = insertelement <128 x i8> [[TMP19]], i8 [[TMP20]], i32 10 +; OPT-NEXT:    [[TMP22:%.*]] = extractelement <16 x i8> [[IN]], i64 11 +; OPT-NEXT:    [[TMP23:%.*]] = insertelement <128 x i8> [[TMP21]], i8 [[TMP22]], i32 11 +; OPT-NEXT:    [[TMP24:%.*]] = extractelement <16 x i8> [[IN]], i64 12 +; OPT-NEXT:    [[TMP25:%.*]] = insertelement <128 x i8> [[TMP23]], i8 [[TMP24]], i32 12 +; OPT-NEXT:    [[TMP26:%.*]] = extractelement <16 x i8> [[IN]], i64 13 +; OPT-NEXT:    [[TMP27:%.*]] = insertelement <128 x i8> [[TMP25]], i8 [[TMP26]], i32 13 +; OPT-NEXT:    [[TMP28:%.*]] = extractelement <16 x i8> [[IN]], i64 14 +; OPT-NEXT:    [[TMP29:%.*]] = insertelement <128 x i8> [[TMP27]], i8 [[TMP28]], i32 14 +; OPT-NEXT:    [[TMP30:%.*]] = extractelement <16 x i8> [[IN]], i64 15 +; OPT-NEXT:    [[TMP31:%.*]] = insertelement <128 x i8> [[TMP29]], i8 [[TMP30]], i32 15 +; OPT-NEXT:    [[TMP32:%.*]] = extractelement <16 x i8> [[IN]], i64 0 +; OPT-NEXT:    [[TMP33:%.*]] = insertelement <128 x i8> [[TMP31]], i8 [[TMP32]], i32 0 +; OPT-NEXT:    [[TMP34:%.*]] = extractelement <16 x i8> [[IN]], i64 1 +; OPT-NEXT:    [[TMP35:%.*]] = insertelement <128 x i8> [[TMP33]], i8 [[TMP34]], i32 1 +; OPT-NEXT:    [[TMP36:%.*]] = extractelement <16 x i8> [[IN]], i64 2 +; OPT-NEXT:    [[TMP37:%.*]] = insertelement <128 x i8> [[TMP35]], i8 [[TMP36]], i32 2 +; OPT-NEXT:    [[TMP38:%.*]] = extractelement <16 x i8> [[IN]], i64 3 +; OPT-NEXT:    [[TMP39:%.*]] = insertelement <128 x i8> [[TMP37]], i8 [[TMP38]], i32 3 +; OPT-NEXT:    [[TMP40:%.*]] = extractelement <16 x i8> [[IN]], i64 4 +; OPT-NEXT:    [[TMP41:%.*]] = insertelement <128 x i8> [[TMP39]], i8 [[TMP40]], i32 4 +; OPT-NEXT:    [[TMP42:%.*]] = extractelement <16 x i8> [[IN]], i64 5 +; OPT-NEXT:    [[TMP43:%.*]] = insertelement <128 x i8> [[TMP41]], i8 [[TMP42]], i32 5 +; OPT-NEXT:    [[TMP44:%.*]] = extractelement <16 x i8> [[IN]], i64 6 +; OPT-NEXT:    [[TMP45:%.*]] = insertelement <128 x i8> [[TMP43]], i8 [[TMP44]], i32 6 +; OPT-NEXT:    [[TMP46:%.*]] = extractelement <16 x i8> [[IN]], i64 7 +; OPT-NEXT:    [[TMP47:%.*]] = insertelement <128 x i8> [[TMP45]], i8 [[TMP46]], i32 7 +; OPT-NEXT:    [[TMP48:%.*]] = extractelement <16 x i8> [[IN]], i64 8 +; OPT-NEXT:    [[TMP49:%.*]] = insertelement <128 x i8> [[TMP47]], i8 [[TMP48]], i32 8 +; OPT-NEXT:    [[TMP50:%.*]] = extractelement <16 x i8> [[IN]], i64 9 +; OPT-NEXT:    [[TMP51:%.*]] = insertelement <128 x i8> [[TMP49]], i8 [[TMP50]], i32 9 +; OPT-NEXT:    [[TMP52:%.*]] = extractelement <16 x i8> [[IN]], i64 10 +; OPT-NEXT:    [[TMP53:%.*]] = insertelement <128 x i8> [[TMP51]], i8 [[TMP52]], i32 10 +; OPT-NEXT:    [[TMP54:%.*]] = extractelement <16 x i8> [[IN]], i64 11 +; OPT-NEXT:    [[TMP55:%.*]] = insertelement <128 x i8> [[TMP53]], i8 [[TMP54]], i32 11 +; OPT-NEXT:    [[TMP56:%.*]] = extractelement <16 x i8> [[IN]], i64 12 +; OPT-NEXT:    [[TMP57:%.*]] = insertelement <128 x i8> [[TMP55]], i8 [[TMP56]], i32 12 +; OPT-NEXT:    [[TMP58:%.*]] = extractelement <16 x i8> [[IN]], i64 13 +; OPT-NEXT:    [[TMP59:%.*]] = insertelement <128 x i8> [[TMP57]], i8 [[TMP58]], i32 13 +; OPT-NEXT:    [[TMP60:%.*]] = extractelement <16 x i8> [[IN]], i64 14 +; OPT-NEXT:    [[TMP61:%.*]] = insertelement <128 x i8> [[TMP59]], i8 [[TMP60]], i32 14 +; OPT-NEXT:    [[TMP62:%.*]] = extractelement <16 x i8> [[IN]], i64 15 +; OPT-NEXT:    [[TMP63:%.*]] = insertelement <128 x i8> [[TMP61]], i8 [[TMP62]], i32 15 +; OPT-NEXT:    [[TMP64:%.*]] = extractelement <16 x i8> [[IN]], i64 0 +; OPT-NEXT:    [[TMP65:%.*]] = insertelement <128 x i8> [[TMP63]], i8 [[TMP64]], i32 0 +; OPT-NEXT:    [[TMP66:%.*]] = extractelement <16 x i8> [[IN]], i64 1 +; OPT-NEXT:    [[TMP67:%.*]] = insertelement <128 x i8> [[TMP65]], i8 [[TMP66]], i32 1 +; OPT-NEXT:    [[TMP68:%.*]] = extractelement <16 x i8> [[IN]], i64 2 +; OPT-NEXT:    [[TMP69:%.*]] = insertelement <128 x i8> [[TMP67]], i8 [[TMP68]], i32 2 +; OPT-NEXT:    [[TMP70:%.*]] = extractelement <16 x i8> [[IN]], i64 3 +; OPT-NEXT:    [[TMP71:%.*]] = insertelement <128 x i8> [[TMP69]], i8 [[TMP70]], i32 3 +; OPT-NEXT:    [[TMP72:%.*]] = extractelement <16 x i8> [[IN]], i64 4 +; OPT-NEXT:    [[TMP73:%.*]] = insertelement <128 x i8> [[TMP71]], i8 [[TMP72]], i32 4 +; OPT-NEXT:    [[TMP74:%.*]] = extractelement <16 x i8> [[IN]], i64 5 +; OPT-NEXT:    [[TMP75:%.*]] = insertelement <128 x i8> [[TMP73]], i8 [[TMP74]], i32 5 +; OPT-NEXT:    [[TMP76:%.*]] = extractelement <16 x i8> [[IN]], i64 6 +; OPT-NEXT:    [[TMP77:%.*]] = insertelement <128 x i8> [[TMP75]], i8 [[TMP76]], i32 6 +; OPT-NEXT:    [[TMP78:%.*]] = extractelement <16 x i8> [[IN]], i64 7 +; OPT-NEXT:    [[TMP79:%.*]] = insertelement <128 x i8> [[TMP77]], i8 [[TMP78]], i32 7 +; OPT-NEXT:    [[TMP80:%.*]] = extractelement <16 x i8> [[IN]], i64 8 +; OPT-NEXT:    [[TMP81:%.*]] = insertelement <128 x i8> [[TMP79]], i8 [[TMP80]], i32 8 +; OPT-NEXT:    [[TMP82:%.*]] = extractelement <16 x i8> [[IN]], i64 9 +; OPT-NEXT:    [[TMP83:%.*]] = insertelement <128 x i8> [[TMP81]], i8 [[TMP82]], i32 9 +; OPT-NEXT:    [[TMP84:%.*]] = extractelement <16 x i8> [[IN]], i64 10 +; OPT-NEXT:    [[TMP85:%.*]] = insertelement <128 x i8> [[TMP83]], i8 [[TMP84]], i32 10 +; OPT-NEXT:    [[TMP86:%.*]] = extractelement <16 x i8> [[IN]], i64 11 +; OPT-NEXT:    [[TMP87:%.*]] = insertelement <128 x i8> [[TMP85]], i8 [[TMP86]], i32 11 +; OPT-NEXT:    [[TMP88:%.*]] = extractelement <16 x i8> [[IN]], i64 12 +; OPT-NEXT:    [[TMP89:%.*]] = insertelement <128 x i8> [[TMP87]], i8 [[TMP88]], i32 12 +; OPT-NEXT:    [[TMP90:%.*]] = extractelement <16 x i8> [[IN]], i64 13 +; OPT-NEXT:    [[TMP91:%.*]] = insertelement <128 x i8> [[TMP89]], i8 [[TMP90]], i32 13 +; OPT-NEXT:    [[TMP92:%.*]] = extractelement <16 x i8> [[IN]], i64 14 +; OPT-NEXT:    [[TMP93:%.*]] = insertelement <128 x i8> [[TMP91]], i8 [[TMP92]], i32 14 +; OPT-NEXT:    [[TMP94:%.*]] = extractelement <16 x i8> [[IN]], i64 15 +; OPT-NEXT:    [[TMP95:%.*]] = insertelement <128 x i8> [[TMP93]], i8 [[TMP94]], i32 15 +; OPT-NEXT:    [[TMP96:%.*]] = extractelement <16 x i8> [[IN]], i64 0 +; OPT-NEXT:    [[TMP97:%.*]] = insertelement <128 x i8> [[TMP95]], i8 [[TMP96]], i32 0 +; OPT-NEXT:    [[TMP98:%.*]] = extractelement <16 x i8> [[IN]], i64 1 +; OPT-NEXT:    [[TMP99:%.*]] = insertelement <128 x i8> [[TMP97]], i8 [[TMP98]], i32 1 +; OPT-NEXT:    [[TMP100:%.*]] = extractelement <16 x i8> [[IN]], i64 2 +; OPT-NEXT:    [[TMP101:%.*]] = insertelement <128 x i8> [[TMP99]], i8 [[TMP100]], i32 2 +; OPT-NEXT:    [[TMP102:%.*]] = extractelement <16 x i8> [[IN]], i64 3 +; OPT-NEXT:    [[TMP103:%.*]] = insertelement <128 x i8> [[TMP101]], i8 [[TMP102]], i32 3 +; OPT-NEXT:    [[TMP104:%.*]] = extractelement <16 x i8> [[IN]], i64 4 +; OPT-NEXT:    [[TMP105:%.*]] = insertelement <128 x i8> [[TMP103]], i8 [[TMP104]], i32 4 +; OPT-NEXT:    [[TMP106:%.*]] = extractelement <16 x i8> [[IN]], i64 5 +; OPT-NEXT:    [[TMP107:%.*]] = insertelement <128 x i8> [[TMP105]], i8 [[TMP106]], i32 5 +; OPT-NEXT:    [[TMP108:%.*]] = extractelement <16 x i8> [[IN]], i64 6 +; OPT-NEXT:    [[TMP109:%.*]] = insertelement <128 x i8> [[TMP107]], i8 [[TMP108]], i32 6 +; OPT-NEXT:    [[TMP110:%.*]] = extractelement <16 x i8> [[IN]], i64 7 +; OPT-NEXT:    [[TMP111:%.*]] = insertelement <128 x i8> [[TMP109]], i8 [[TMP110]], i32 7 +; OPT-NEXT:    [[TMP112:%.*]] = extractelement <16 x i8> [[IN]], i64 8 +; OPT-NEXT:    [[TMP113:%.*]] = insertelement <128 x i8> [[TMP111]], i8 [[TMP112]], i32 8 +; OPT-NEXT:    [[TMP114:%.*]] = extractelement <16 x i8> [[IN]], i64 9 +; OPT-NEXT:    [[TMP115:%.*]] = insertelement <128 x i8> [[TMP113]], i8 [[TMP114]], i32 9 +; OPT-NEXT:    [[TMP116:%.*]] = extractelement <16 x i8> [[IN]], i64 10 +; OPT-NEXT:    [[TMP117:%.*]] = insertelement <128 x i8> [[TMP115]], i8 [[TMP116]], i32 10 +; OPT-NEXT:    [[TMP118:%.*]] = extractelement <16 x i8> [[IN]], i64 11 +; OPT-NEXT:    [[TMP119:%.*]] = insertelement <128 x i8> [[TMP117]], i8 [[TMP118]], i32 11 +; OPT-NEXT:    [[TMP120:%.*]] = extractelement <16 x i8> [[IN]], i64 12 +; OPT-NEXT:    [[TMP121:%.*]] = insertelement <128 x i8> [[TMP119]], i8 [[TMP120]], i32 12 +; OPT-NEXT:    [[TMP122:%.*]] = extractelement <16 x i8> [[IN]], i64 13 +; OPT-NEXT:    [[TMP123:%.*]] = insertelement <128 x i8> [[TMP121]], i8 [[TMP122]], i32 13 +; OPT-NEXT:    [[TMP124:%.*]] = extractelement <16 x i8> [[IN]], i64 14 +; OPT-NEXT:    [[TMP125:%.*]] = insertelement <128 x i8> [[TMP123]], i8 [[TMP124]], i32 14 +; OPT-NEXT:    [[TMP126:%.*]] = extractelement <16 x i8> [[IN]], i64 15 +; OPT-NEXT:    [[TMP127:%.*]] = insertelement <128 x i8> [[TMP125]], i8 [[TMP126]], i32 15 +; OPT-NEXT:    [[TMP128:%.*]] = extractelement <16 x i8> [[IN]], i64 0 +; OPT-NEXT:    [[TMP129:%.*]] = insertelement <128 x i8> [[TMP127]], i8 [[TMP128]], i32 0 +; OPT-NEXT:    [[TMP130:%.*]] = extractelement <16 x i8> [[IN]], i64 1 +; OPT-NEXT:    [[TMP131:%.*]] = insertelement <128 x i8> [[TMP129]], i8 [[TMP130]], i32 1 +; OPT-NEXT:    [[TMP132:%.*]] = extractelement <16 x i8> [[IN]], i64 2 +; OPT-NEXT:    [[TMP133:%.*]] = insertelement <128 x i8> [[TMP131]], i8 [[TMP132]], i32 2 +; OPT-NEXT:    [[TMP134:%.*]] = extractelement <16 x i8> [[IN]], i64 3 +; OPT-NEXT:    [[TMP135:%.*]] = insertelement <128 x i8> [[TMP133]], i8 [[TMP134]], i32 3 +; OPT-NEXT:    [[TMP136:%.*]] = extractelement <16 x i8> [[IN]], i64 4 +; OPT-NEXT:    [[TMP137:%.*]] = insertelement <128 x i8> [[TMP135]], i8 [[TMP136]], i32 4 +; OPT-NEXT:    [[TMP138:%.*]] = extractelement <16 x i8> [[IN]], i64 5 +; OPT-NEXT:    [[TMP139:%.*]] = insertelement <128 x i8> [[TMP137]], i8 [[TMP138]], i32 5 +; OPT-NEXT:    [[TMP140:%.*]] = extractelement <16 x i8> [[IN]], i64 6 +; OPT-NEXT:    [[TMP141:%.*]] = insertelement <128 x i8> [[TMP139]], i8 [[TMP140]], i32 6 +; OPT-NEXT:    [[TMP142:%.*]] = extractelement <16 x i8> [[IN]], i64 7 +; OPT-NEXT:    [[TMP143:%.*]] = insertelement <128 x i8> [[TMP141]], i8 [[TMP142]], i32 7 +; OPT-NEXT:    [[TMP144:%.*]] = extractelement <16 x i8> [[IN]], i64 8 +; OPT-NEXT:    [[TMP145:%.*]] = insertelement <128 x i8> [[TMP143]], i8 [[TMP144]], i32 8 +; OPT-NEXT:    [[TMP146:%.*]] = extractelement <16 x i8> [[IN]], i64 9 +; OPT-NEXT:    [[TMP147:%.*]] = insertelement <128 x i8> [[TMP145]], i8 [[TMP146]], i32 9 +; OPT-NEXT:    [[TMP148:%.*]] = extractelement <16 x i8> [[IN]], i64 10 +; OPT-NEXT:    [[TMP149:%.*]] = insertelement <128 x i8> [[TMP147]], i8 [[TMP148]], i32 10 +; OPT-NEXT:    [[TMP150:%.*]] = extractelement <16 x i8> [[IN]], i64 11 +; OPT-NEXT:    [[TMP151:%.*]] = insertelement <128 x i8> [[TMP149]], i8 [[TMP150]], i32 11 +; OPT-NEXT:    [[TMP152:%.*]] = extractelement <16 x i8> [[IN]], i64 12 +; OPT-NEXT:    [[TMP153:%.*]] = insertelement <128 x i8> [[TMP151]], i8 [[TMP152]], i32 12 +; OPT-NEXT:    [[TMP154:%.*]] = extractelement <16 x i8> [[IN]], i64 13 +; OPT-NEXT:    [[TMP155:%.*]] = insertelement <128 x i8> [[TMP153]], i8 [[TMP154]], i32 13 +; OPT-NEXT:    [[TMP156:%.*]] = extractelement <16 x i8> [[IN]], i64 14 +; OPT-NEXT:    [[TMP157:%.*]] = insertelement <128 x i8> [[TMP155]], i8 [[TMP156]], i32 14 +; OPT-NEXT:    [[TMP158:%.*]] = extractelement <16 x i8> [[IN]], i64 15 +; OPT-NEXT:    [[TMP159:%.*]] = insertelement <128 x i8> [[TMP157]], i8 [[TMP158]], i32 15 +; OPT-NEXT:    [[TMP160:%.*]] = extractelement <16 x i8> [[IN]], i64 0 +; OPT-NEXT:    [[TMP161:%.*]] = insertelement <128 x i8> [[TMP159]], i8 [[TMP160]], i32 0 +; OPT-NEXT:    [[TMP162:%.*]] = extractelement <16 x i8> [[IN]], i64 1 +; OPT-NEXT:    [[TMP163:%.*]] = insertelement <128 x i8> [[TMP161]], i8 [[TMP162]], i32 1 +; OPT-NEXT:    [[TMP164:%.*]] = extractelement <16 x i8> [[IN]], i64 2 +; OPT-NEXT:    [[TMP165:%.*]] = insertelement <128 x i8> [[TMP163]], i8 [[TMP164]], i32 2 +; OPT-NEXT:    [[TMP166:%.*]] = extractelement <16 x i8> [[IN]], i64 3 +; OPT-NEXT:    [[TMP167:%.*]] = insertelement <128 x i8> [[TMP165]], i8 [[TMP166]], i32 3 +; OPT-NEXT:    [[TMP168:%.*]] = extractelement <16 x i8> [[IN]], i64 4 +; OPT-NEXT:    [[TMP169:%.*]] = insertelement <128 x i8> [[TMP167]], i8 [[TMP168]], i32 4 +; OPT-NEXT:    [[TMP170:%.*]] = extractelement <16 x i8> [[IN]], i64 5 +; OPT-NEXT:    [[TMP171:%.*]] = insertelement <128 x i8> [[TMP169]], i8 [[TMP170]], i32 5 +; OPT-NEXT:    [[TMP172:%.*]] = extractelement <16 x i8> [[IN]], i64 6 +; OPT-NEXT:    [[TMP173:%.*]] = insertelement <128 x i8> [[TMP171]], i8 [[TMP172]], i32 6 +; OPT-NEXT:    [[TMP174:%.*]] = extractelement <16 x i8> [[IN]], i64 7 +; OPT-NEXT:    [[TMP175:%.*]] = insertelement <128 x i8> [[TMP173]], i8 [[TMP174]], i32 7 +; OPT-NEXT:    [[TMP176:%.*]] = extractelement <16 x i8> [[IN]], i64 8 +; OPT-NEXT:    [[TMP177:%.*]] = insertelement <128 x i8> [[TMP175]], i8 [[TMP176]], i32 8 +; OPT-NEXT:    [[TMP178:%.*]] = extractelement <16 x i8> [[IN]], i64 9 +; OPT-NEXT:    [[TMP179:%.*]] = insertelement <128 x i8> [[TMP177]], i8 [[TMP178]], i32 9 +; OPT-NEXT:    [[TMP180:%.*]] = extractelement <16 x i8> [[IN]], i64 10 +; OPT-NEXT:    [[TMP181:%.*]] = insertelement <128 x i8> [[TMP179]], i8 [[TMP180]], i32 10 +; OPT-NEXT:    [[TMP182:%.*]] = extractelement <16 x i8> [[IN]], i64 11 +; OPT-NEXT:    [[TMP183:%.*]] = insertelement <128 x i8> [[TMP181]], i8 [[TMP182]], i32 11 +; OPT-NEXT:    [[TMP184:%.*]] = extractelement <16 x i8> [[IN]], i64 12 +; OPT-NEXT:    [[TMP185:%.*]] = insertelement <128 x i8> [[TMP183]], i8 [[TMP184]], i32 12 +; OPT-NEXT:    [[TMP186:%.*]] = extractelement <16 x i8> [[IN]], i64 13 +; OPT-NEXT:    [[TMP187:%.*]] = insertelement <128 x i8> [[TMP185]], i8 [[TMP186]], i32 13 +; OPT-NEXT:    [[TMP188:%.*]] = extractelement <16 x i8> [[IN]], i64 14 +; OPT-NEXT:    [[TMP189:%.*]] = insertelement <128 x i8> [[TMP187]], i8 [[TMP188]], i32 14 +; OPT-NEXT:    [[TMP190:%.*]] = extractelement <16 x i8> [[IN]], i64 15 +; OPT-NEXT:    [[TMP191:%.*]] = insertelement <128 x i8> [[TMP189]], i8 [[TMP190]], i32 15 +; OPT-NEXT:    [[TMP192:%.*]] = extractelement <16 x i8> [[IN]], i64 0 +; OPT-NEXT:    [[TMP193:%.*]] = insertelement <128 x i8> [[TMP191]], i8 [[TMP192]], i32 0 +; OPT-NEXT:    [[TMP194:%.*]] = extractelement <16 x i8> [[IN]], i64 1 +; OPT-NEXT:    [[TMP195:%.*]] = insertelement <128 x i8> [[TMP193]], i8 [[TMP194]], i32 1 +; OPT-NEXT:    [[TMP196:%.*]] = extractelement <16 x i8> [[IN]], i64 2 +; OPT-NEXT:    [[TMP197:%.*]] = insertelement <128 x i8> [[TMP195]], i8 [[TMP196]], i32 2 +; OPT-NEXT:    [[TMP198:%.*]] = extractelement <16 x i8> [[IN]], i64 3 +; OPT-NEXT:    [[TMP199:%.*]] = insertelement <128 x i8> [[TMP197]], i8 [[TMP198]], i32 3 +; OPT-NEXT:    [[TMP200:%.*]] = extractelement <16 x i8> [[IN]], i64 4 +; OPT-NEXT:    [[TMP201:%.*]] = insertelement <128 x i8> [[TMP199]], i8 [[TMP200]], i32 4 +; OPT-NEXT:    [[TMP202:%.*]] = extractelement <16 x i8> [[IN]], i64 5 +; OPT-NEXT:    [[TMP203:%.*]] = insertelement <128 x i8> [[TMP201]], i8 [[TMP202]], i32 5 +; OPT-NEXT:    [[TMP204:%.*]] = extractelement <16 x i8> [[IN]], i64 6 +; OPT-NEXT:    [[TMP205:%.*]] = insertelement <128 x i8> [[TMP203]], i8 [[TMP204]], i32 6 +; OPT-NEXT:    [[TMP206:%.*]] = extractelement <16 x i8> [[IN]], i64 7 +; OPT-NEXT:    [[TMP207:%.*]] = insertelement <128 x i8> [[TMP205]], i8 [[TMP206]], i32 7 +; OPT-NEXT:    [[TMP208:%.*]] = extractelement <16 x i8> [[IN]], i64 8 +; OPT-NEXT:    [[TMP209:%.*]] = insertelement <128 x i8> [[TMP207]], i8 [[TMP208]], i32 8 +; OPT-NEXT:    [[TMP210:%.*]] = extractelement <16 x i8> [[IN]], i64 9 +; OPT-NEXT:    [[TMP211:%.*]] = insertelement <128 x i8> [[TMP209]], i8 [[TMP210]], i32 9 +; OPT-NEXT:    [[TMP212:%.*]] = extractelement <16 x i8> [[IN]], i64 10 +; OPT-NEXT:    [[TMP213:%.*]] = insertelement <128 x i8> [[TMP211]], i8 [[TMP212]], i32 10 +; OPT-NEXT:    [[TMP214:%.*]] = extractelement <16 x i8> [[IN]], i64 11 +; OPT-NEXT:    [[TMP215:%.*]] = insertelement <128 x i8> [[TMP213]], i8 [[TMP214]], i32 11 +; OPT-NEXT:    [[TMP216:%.*]] = extractelement <16 x i8> [[IN]], i64 12 +; OPT-NEXT:    [[TMP217:%.*]] = insertelement <128 x i8> [[TMP215]], i8 [[TMP216]], i32 12 +; OPT-NEXT:    [[TMP218:%.*]] = extractelement <16 x i8> [[IN]], i64 13 +; OPT-NEXT:    [[TMP219:%.*]] = insertelement <128 x i8> [[TMP217]], i8 [[TMP218]], i32 13 +; OPT-NEXT:    [[TMP220:%.*]] = extractelement <16 x i8> [[IN]], i64 14 +; OPT-NEXT:    [[TMP221:%.*]] = insertelement <128 x i8> [[TMP219]], i8 [[TMP220]], i32 14 +; OPT-NEXT:    [[TMP222:%.*]] = extractelement <16 x i8> [[IN]], i64 15 +; OPT-NEXT:    [[TMP223:%.*]] = insertelement <128 x i8> [[TMP221]], i8 [[TMP222]], i32 15 +; OPT-NEXT:    [[TMP224:%.*]] = extractelement <16 x i8> [[IN]], i64 0 +; OPT-NEXT:    [[TMP225:%.*]] = insertelement <128 x i8> [[TMP223]], i8 [[TMP224]], i32 0 +; OPT-NEXT:    [[TMP226:%.*]] = extractelement <16 x i8> [[IN]], i64 1 +; OPT-NEXT:    [[TMP227:%.*]] = insertelement <128 x i8> [[TMP225]], i8 [[TMP226]], i32 1 +; OPT-NEXT:    [[TMP228:%.*]] = extractelement <16 x i8> [[IN]], i64 2 +; OPT-NEXT:    [[TMP229:%.*]] = insertelement <128 x i8> [[TMP227]], i8 [[TMP228]], i32 2 +; OPT-NEXT:    [[TMP230:%.*]] = extractelement <16 x i8> [[IN]], i64 3 +; OPT-NEXT:    [[TMP231:%.*]] = insertelement <128 x i8> [[TMP229]], i8 [[TMP230]], i32 3 +; OPT-NEXT:    [[TMP232:%.*]] = extractelement <16 x i8> [[IN]], i64 4 +; OPT-NEXT:    [[TMP233:%.*]] = insertelement <128 x i8> [[TMP231]], i8 [[TMP232]], i32 4 +; OPT-NEXT:    [[TMP234:%.*]] = extractelement <16 x i8> [[IN]], i64 5 +; OPT-NEXT:    [[TMP235:%.*]] = insertelement <128 x i8> [[TMP233]], i8 [[TMP234]], i32 5 +; OPT-NEXT:    [[TMP236:%.*]] = extractelement <16 x i8> [[IN]], i64 6 +; OPT-NEXT:    [[TMP237:%.*]] = insertelement <128 x i8> [[TMP235]], i8 [[TMP236]], i32 6 +; OPT-NEXT:    [[TMP238:%.*]] = extractelement <16 x i8> [[IN]], i64 7 +; OPT-NEXT:    [[TMP239:%.*]] = insertelement <128 x i8> [[TMP237]], i8 [[TMP238]], i32 7 +; OPT-NEXT:    [[TMP240:%.*]] = extractelement <16 x i8> [[IN]], i64 8 +; OPT-NEXT:    [[TMP241:%.*]] = insertelement <128 x i8> [[TMP239]], i8 [[TMP240]], i32 8 +; OPT-NEXT:    [[TMP242:%.*]] = extractelement <16 x i8> [[IN]], i64 9 +; OPT-NEXT:    [[TMP243:%.*]] = insertelement <128 x i8> [[TMP241]], i8 [[TMP242]], i32 9 +; OPT-NEXT:    [[TMP244:%.*]] = extractelement <16 x i8> [[IN]], i64 10 +; OPT-NEXT:    [[TMP245:%.*]] = insertelement <128 x i8> [[TMP243]], i8 [[TMP244]], i32 10 +; OPT-NEXT:    [[TMP246:%.*]] = extractelement <16 x i8> [[IN]], i64 11 +; OPT-NEXT:    [[TMP247:%.*]] = insertelement <128 x i8> [[TMP245]], i8 [[TMP246]], i32 11 +; OPT-NEXT:    [[TMP248:%.*]] = extractelement <16 x i8> [[IN]], i64 12 +; OPT-NEXT:    [[TMP249:%.*]] = insertelement <128 x i8> [[TMP247]], i8 [[TMP248]], i32 12 +; OPT-NEXT:    [[TMP250:%.*]] = extractelement <16 x i8> [[IN]], i64 13 +; OPT-NEXT:    [[TMP251:%.*]] = insertelement <128 x i8> [[TMP249]], i8 [[TMP250]], i32 13 +; OPT-NEXT:    [[TMP252:%.*]] = extractelement <16 x i8> [[IN]], i64 14 +; OPT-NEXT:    [[TMP253:%.*]] = insertelement <128 x i8> [[TMP251]], i8 [[TMP252]], i32 14 +; OPT-NEXT:    [[TMP254:%.*]] = extractelement <16 x i8> [[IN]], i64 15 +; OPT-NEXT:    [[TMP255:%.*]] = insertelement <128 x i8> [[TMP253]], i8 [[TMP254]], i32 15 +; OPT-NEXT:    [[TMP256:%.*]] = extractelement <128 x i8> [[TMP255]], i32 80 +; OPT-NEXT:    [[TMP257:%.*]] = insertelement <16 x i8> poison, i8 [[TMP256]], i64 0 +; OPT-NEXT:    [[TMP258:%.*]] = extractelement <128 x i8> [[TMP255]], i32 81 +; OPT-NEXT:    [[TMP259:%.*]] = insertelement <16 x i8> [[TMP257]], i8 [[TMP258]], i64 1 +; OPT-NEXT:    [[TMP260:%.*]] = extractelement <128 x i8> [[TMP255]], i32 82 +; OPT-NEXT:    [[TMP261:%.*]] = insertelement <16 x i8> [[TMP259]], i8 [[TMP260]], i64 2 +; OPT-NEXT:    [[TMP262:%.*]] = extractelement <128 x i8> [[TMP255]], i32 83 +; OPT-NEXT:    [[TMP263:%.*]] = insertelement <16 x i8> [[TMP261]], i8 [[TMP262]], i64 3 +; OPT-NEXT:    [[TMP264:%.*]] = extractelement <128 x i8> [[TMP255]], i32 84 +; OPT-NEXT:    [[TMP265:%.*]] = insertelement <16 x i8> [[TMP263]], i8 [[TMP264]], i64 4 +; OPT-NEXT:    [[TMP266:%.*]] = extractelement <128 x i8> [[TMP255]], i32 85 +; OPT-NEXT:    [[TMP267:%.*]] = insertelement <16 x i8> [[TMP265]], i8 [[TMP266]], i64 5 +; OPT-NEXT:    [[TMP268:%.*]] = extractelement <128 x i8> [[TMP255]], i32 86 +; OPT-NEXT:    [[TMP269:%.*]] = insertelement <16 x i8> [[TMP267]], i8 [[TMP268]], i64 6 +; OPT-NEXT:    [[TMP270:%.*]] = extractelement <128 x i8> [[TMP255]], i32 87 +; OPT-NEXT:    [[TMP271:%.*]] = insertelement <16 x i8> [[TMP269]], i8 [[TMP270]], i64 7 +; OPT-NEXT:    [[TMP272:%.*]] = extractelement <128 x i8> [[TMP255]], i32 88 +; OPT-NEXT:    [[TMP273:%.*]] = insertelement <16 x i8> [[TMP271]], i8 [[TMP272]], i64 8 +; OPT-NEXT:    [[TMP274:%.*]] = extractelement <128 x i8> [[TMP255]], i32 89 +; OPT-NEXT:    [[TMP275:%.*]] = insertelement <16 x i8> [[TMP273]], i8 [[TMP274]], i64 9 +; OPT-NEXT:    [[TMP276:%.*]] = extractelement <128 x i8> [[TMP255]], i32 90 +; OPT-NEXT:    [[TMP277:%.*]] = insertelement <16 x i8> [[TMP275]], i8 [[TMP276]], i64 10 +; OPT-NEXT:    [[TMP278:%.*]] = extractelement <128 x i8> [[TMP255]], i32 91 +; OPT-NEXT:    [[TMP279:%.*]] = insertelement <16 x i8> [[TMP277]], i8 [[TMP278]], i64 11 +; OPT-NEXT:    [[TMP280:%.*]] = extractelement <128 x i8> [[TMP255]], i32 92 +; OPT-NEXT:    [[TMP281:%.*]] = insertelement <16 x i8> [[TMP279]], i8 [[TMP280]], i64 12 +; OPT-NEXT:    [[TMP282:%.*]] = extractelement <128 x i8> [[TMP255]], i32 93 +; OPT-NEXT:    [[TMP283:%.*]] = insertelement <16 x i8> [[TMP281]], i8 [[TMP282]], i64 13 +; OPT-NEXT:    [[TMP284:%.*]] = extractelement <128 x i8> [[TMP255]], i32 94 +; OPT-NEXT:    [[TMP285:%.*]] = insertelement <16 x i8> [[TMP283]], i8 [[TMP284]], i64 14 +; OPT-NEXT:    [[TMP286:%.*]] = extractelement <128 x i8> [[TMP255]], i32 95 +; OPT-NEXT:    [[TMP287:%.*]] = insertelement <16 x i8> [[TMP285]], i8 [[TMP286]], i64 15 +; OPT-NEXT:    [[SUM:%.*]] = add <16 x i8> [[TMP287]], [[ADD]] +; OPT-NEXT:    store <16 x i8> [[SUM]], ptr addrspace(3) [[OUT]], align 16 +; OPT-NEXT:    ret void +; +entry: +  %alloca = alloca [8 x <16 x i8>], align 16, addrspace(5) +  %gep0 = getelementptr [8 x <16 x i8>], ptr addrspace(5) %alloca, i64 0, i64 0 +  store <16 x i8> %in, ptr addrspace(5) %gep0, align 16 +  %gep1 = getelementptr [8 x <16 x i8>], ptr addrspace(5) %alloca, i64 0, i64 1 +  store <16 x i8> %in, ptr addrspace(5) %gep0, align 16 +  %gep2 = getelementptr [8 x <16 x i8>], ptr addrspace(5) %alloca, i64 0, i64 2 +  store <16 x i8> %in, ptr addrspace(5) %gep0, align 16 +  %gep3 = getelementptr [8 x <16 x i8>], ptr addrspace(5) %alloca, i64 0, i64 3 +  store <16 x i8> %in, ptr addrspace(5) %gep0, align 16 +  %gep4 = getelementptr [8 x <16 x i8>], ptr addrspace(5) %alloca, i64 0, i64 4 +  store <16 x i8> %in, ptr addrspace(5) %gep0, align 16 +  %gep5 = getelementptr [8 x <16 x i8>], ptr addrspace(5) %alloca, i64 0, i64 5 +  store <16 x i8> %in, ptr addrspace(5) %gep0, align 16 +  %gep6 = getelementptr [8 x <16 x i8>], ptr addrspace(5) %alloca, i64 0, i64 6 +  store <16 x i8> %in, ptr addrspace(5) %gep0, align 16 +  %gep7 = getelementptr [8 x <16 x i8>], ptr addrspace(5) %alloca, i64 0, i64 7 +  store <16 x i8> %in, ptr addrspace(5) %gep0, align 16 +  %load = load <16 x i8>, ptr addrspace(5) %gep5, align 16 +  %sum = add <16 x i8> %load, %add +  store <16 x i8> %sum, ptr addrspace(3) %out, align 16 +  ret void +} + +attributes #0 = {"amdgpu-waves-per-eu"="2,2"} diff --git a/llvm/test/CodeGen/AMDGPU/readcyclecounter.ll b/llvm/test/CodeGen/AMDGPU/readcyclecounter.ll index f67cbe3..ddb522a8 100644 --- a/llvm/test/CodeGen/AMDGPU/readcyclecounter.ll +++ b/llvm/test/CodeGen/AMDGPU/readcyclecounter.ll @@ -1,17 +1,17 @@  ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefix=MEMTIME -check-prefix=SIVI -check-prefix=GCN %s  ; -global-isel=1 SI run line skipped since store not yet implemented.  ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefix=MEMTIME -check-prefix=SIVI -check-prefix=GCN %s -; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefix=MEMTIME -check-prefix=SIVI -check-prefix=GCN %s +; RUN: llc -global-isel=1 -new-reg-bank-select -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefix=MEMTIME -check-prefix=SIVI -check-prefix=GCN %s  ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefix=MEMTIME -check-prefix=GCN %s -; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefix=MEMTIME -check-prefix=GCN %s +; RUN: llc -global-isel=1 -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefix=MEMTIME -check-prefix=GCN %s  ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1030 < %s | FileCheck -check-prefixes=MEMTIME -check-prefix=GCN %s -; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1030 < %s | FileCheck -check-prefixes=MEMTIME -check-prefix=GCN %s +; RUN: llc -global-isel=1 -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx1030 < %s | FileCheck -check-prefixes=MEMTIME -check-prefix=GCN %s  ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-vopd=0 < %s | FileCheck -check-prefixes=GETREG,GETREG-SDAG -check-prefix=GCN %s -; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-vopd=0 < %s | FileCheck -check-prefixes=GETREG,GETREG-GISEL -check-prefix=GCN %s +; RUN: llc -global-isel=1 -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-vopd=0 < %s | FileCheck -check-prefixes=GETREG,GETREG-GISEL -check-prefix=GCN %s  ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GCN,GFX12 %s -; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GCN,GFX12 %s +; RUN: llc -global-isel=1 -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GCN,GFX12 %s  ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1250 < %s | FileCheck -check-prefixes=GCN,GFX1250 %s -; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1250 < %s | FileCheck -check-prefixes=GCN,GFX1250 %s +; RUN: llc -global-isel=1 -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx1250 < %s | FileCheck -check-prefixes=GCN,GFX1250 %s  declare i64 @llvm.readcyclecounter() #0 diff --git a/llvm/test/CodeGen/AMDGPU/si-annotate-nested-control-flows.ll b/llvm/test/CodeGen/AMDGPU/si-annotate-nested-control-flows.ll index 34de1e4..01bcdad 100644 --- a/llvm/test/CodeGen/AMDGPU/si-annotate-nested-control-flows.ll +++ b/llvm/test/CodeGen/AMDGPU/si-annotate-nested-control-flows.ll @@ -3,15 +3,16 @@  ; RUN: llc -mtriple=amdgcn-amd-amdhsa %s -o - | FileCheck %s --check-prefix=ISA  define void @nested_inf_loop(i1 %0, i1 %1) { -; OPT-LABEL: @nested_inf_loop( -; OPT-NEXT:  BB: -; OPT-NEXT:    br label [[BB1:%.*]] -; OPT:       BB1: -; OPT-NEXT:    [[BRMERGE:%.*]] = select i1 [[TMP0:%.*]], i1 true, i1 [[TMP1:%.*]] -; OPT-NEXT:    br i1 [[BRMERGE]], label [[BB1]], label [[INFLOOP:%.*]] -; OPT:       infloop: -; OPT-NEXT:    br i1 true, label [[INFLOOP]], label [[DUMMYRETURNBLOCK:%.*]] -; OPT:       DummyReturnBlock: +; OPT-LABEL: define void @nested_inf_loop( +; OPT-SAME: i1 [[TMP0:%.*]], i1 [[TMP1:%.*]]) { +; OPT-NEXT:  [[BB:.*:]] +; OPT-NEXT:    br label %[[BB1:.*]] +; OPT:       [[BB1]]: +; OPT-NEXT:    [[BRMERGE:%.*]] = select i1 [[TMP0]], i1 true, i1 [[TMP1]] +; OPT-NEXT:    br i1 [[BRMERGE]], label %[[BB1]], label %[[INFLOOP:.*]] +; OPT:       [[INFLOOP]]: +; OPT-NEXT:    br i1 true, label %[[INFLOOP]], label %[[DUMMYRETURNBLOCK:.*]] +; OPT:       [[DUMMYRETURNBLOCK]]:  ; OPT-NEXT:    ret void  ;  ; ISA-LABEL: nested_inf_loop: @@ -63,3 +64,84 @@ BB4:  BB3:    br label %BB1  } + +define void @nested_inf_loop_callbr(i32 %0, i32 %1) { +; OPT-LABEL: define void @nested_inf_loop_callbr( +; OPT-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) { +; OPT-NEXT:  [[BB:.*:]] +; OPT-NEXT:    callbr void asm "", ""() +; OPT-NEXT:            to label %[[BB1:.*]] [] +; OPT:       [[BB1]]: +; OPT-NEXT:    callbr void asm "", "r,!i"(i32 [[TMP0]]) +; OPT-NEXT:            to label %[[BB3:.*]] [label %BB2] +; OPT:       [[BB2:.*:]] +; OPT-NEXT:    callbr void asm "", ""() +; OPT-NEXT:            to label %[[BB4:.*]] [] +; OPT:       [[BB4]]: +; OPT-NEXT:    br i1 true, label %[[TRANSITIONBLOCK:.*]], label %[[DUMMYRETURNBLOCK:.*]] +; OPT:       [[TRANSITIONBLOCK]]: +; OPT-NEXT:    callbr void asm "", "r,!i"(i32 [[TMP1]]) +; OPT-NEXT:            to label %[[BB3]] [label %BB4] +; OPT:       [[BB3]]: +; OPT-NEXT:    callbr void asm "", ""() +; OPT-NEXT:            to label %[[BB1]] [] +; OPT:       [[DUMMYRETURNBLOCK]]: +; OPT-NEXT:    ret void +; +; ISA-LABEL: nested_inf_loop_callbr: +; ISA:       ; %bb.0: ; %BB +; ISA-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; ISA-NEXT:    ;;#ASMSTART +; ISA-NEXT:    ;;#ASMEND +; ISA-NEXT:    ; implicit-def: $sgpr6_sgpr7 +; ISA-NEXT:    ; implicit-def: $sgpr4_sgpr5 +; ISA-NEXT:  .LBB1_1: ; %BB1 +; ISA-NEXT:    ; =>This Inner Loop Header: Depth=1 +; ISA-NEXT:    ;;#ASMSTART +; ISA-NEXT:    ;;#ASMEND +; ISA-NEXT:    s_andn2_b64 s[6:7], s[6:7], exec +; ISA-NEXT:    s_and_b64 s[8:9], s[4:5], exec +; ISA-NEXT:    s_or_b64 s[6:7], s[6:7], s[8:9] +; ISA-NEXT:  .LBB1_2: ; %BB3 +; ISA-NEXT:    ; in Loop: Header=BB1_1 Depth=1 +; ISA-NEXT:    ;;#ASMSTART +; ISA-NEXT:    ;;#ASMEND +; ISA-NEXT:    s_andn2_b64 s[4:5], s[4:5], exec +; ISA-NEXT:    s_and_b64 s[8:9], s[6:7], exec +; ISA-NEXT:    s_or_b64 s[4:5], s[4:5], s[8:9] +; ISA-NEXT:    s_branch .LBB1_1 +; ISA-NEXT:  .LBB1_3: ; Inline asm indirect target +; ISA-NEXT:    ; %BB2 +; ISA-NEXT:    ; in Loop: Header=BB1_1 Depth=1 +; ISA-NEXT:    ; Label of block must be emitted +; ISA-NEXT:    ;;#ASMSTART +; ISA-NEXT:    ;;#ASMEND +; ISA-NEXT:    s_mov_b64 s[6:7], -1 +; ISA-NEXT:    s_and_saveexec_b64 s[8:9], s[4:5] +; ISA-NEXT:    s_cbranch_execz .LBB1_5 +; ISA-NEXT:  ; %bb.4: ; %TransitionBlock.target.BB3 +; ISA-NEXT:    ; in Loop: Header=BB1_1 Depth=1 +; ISA-NEXT:    s_xor_b64 s[6:7], exec, -1 +; ISA-NEXT:  .LBB1_5: ; %loop.exit.guard +; ISA-NEXT:    ; in Loop: Header=BB1_1 Depth=1 +; ISA-NEXT:    s_or_b64 exec, exec, s[8:9] +; ISA-NEXT:    s_and_b64 vcc, exec, s[6:7] +; ISA-NEXT:    s_mov_b64 s[6:7], 0 +; ISA-NEXT:    s_cbranch_vccz .LBB1_2 +; ISA-NEXT:  ; %bb.6: ; %DummyReturnBlock +; ISA-NEXT:    s_setpc_b64 s[30:31] +BB: +  callbr void asm "", ""() to label %BB1 [] + +BB1: +  callbr void asm "", "r,!i"(i32 %0) to label %BB3 [label %BB2] + +BB2: +  callbr void asm "", ""() to label %BB4 [] + +BB4: +  callbr void asm "", "r,!i"(i32 %1) to label %BB3 [label %BB4] + +BB3: +  callbr void asm "", ""() to label %BB1 [] +} diff --git a/llvm/test/CodeGen/AMDGPU/si-unify-exit-multiple-unreachables.ll b/llvm/test/CodeGen/AMDGPU/si-unify-exit-multiple-unreachables.ll index 4cbe682..004c279 100644 --- a/llvm/test/CodeGen/AMDGPU/si-unify-exit-multiple-unreachables.ll +++ b/llvm/test/CodeGen/AMDGPU/si-unify-exit-multiple-unreachables.ll @@ -1,5 +1,5 @@ -; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc < %s -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -stop-after=amdgpu-unify-divergent-exit-nodes | FileCheck %s --check-prefix=UNIFY +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -stop-after=amdgpu-unify-divergent-exit-nodes | FileCheck %s --check-prefix=UNIFY  ; RUN: llc < %s -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 | FileCheck %s  declare void @llvm.trap() @@ -70,8 +70,33 @@ define amdgpu_kernel void @kernel(i32 %a, ptr addrspace(1) %x, i32 noundef %n) {  ; CHECK-NEXT:    s_mov_b64 s[2:3], -1  ; CHECK-NEXT:    s_trap 2  ; CHECK-NEXT:    s_branch .LBB0_4 - - +; UNIFY-LABEL: @kernel( +; UNIFY-NEXT:  entry: +; UNIFY-NEXT:    [[TID:%.*]] = call i32 @llvm.amdgcn.workitem.id.x() +; UNIFY-NEXT:    [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 256 +; UNIFY-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] +; UNIFY:       if.then: +; UNIFY-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 0 +; UNIFY-NEXT:    br i1 [[CMP1]], label [[IF_END6_SINK_SPLIT:%.*]], label [[COND_FALSE:%.*]] +; UNIFY:       cond.false: +; UNIFY-NEXT:    call void @llvm.trap() +; UNIFY-NEXT:    unreachable +; UNIFY:       if.else: +; UNIFY-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[TID]], 10 +; UNIFY-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END6:%.*]] +; UNIFY:       if.then3: +; UNIFY-NEXT:    [[CMP1_I7:%.*]] = icmp eq i32 [[A]], 0 +; UNIFY-NEXT:    br i1 [[CMP1_I7]], label [[IF_END6_SINK_SPLIT]], label [[COND_FALSE_I8:%.*]] +; UNIFY:       cond.false.i8: +; UNIFY-NEXT:    call void @llvm.trap() +; UNIFY-NEXT:    unreachable +; UNIFY:       if.end6.sink.split: +; UNIFY-NEXT:    [[X1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[X:%.*]], i32 [[TID]] +; UNIFY-NEXT:    store i32 [[A]], ptr addrspace(1) [[X1]], align 4 +; UNIFY-NEXT:    br label [[IF_END6]] +; UNIFY:       if.end6: +; UNIFY-NEXT:    ret void +;  entry:    %tid = call i32 @llvm.amdgcn.workitem.id.x()    %cmp = icmp eq i32 %n, 256 @@ -105,5 +130,129 @@ if.end6.sink.split:  if.end6:    ret void  } -;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: -; UNIFY: {{.*}} + +define amdgpu_kernel void @kernel_callbr(i32 %a, ptr addrspace(1) %x, i32 noundef %n) { +; CHECK-LABEL: kernel_callbr: +; CHECK:       ; %bb.0: ; %entry +; CHECK-NEXT:    s_load_dword s1, s[8:9], 0x10 +; CHECK-NEXT:    s_load_dword s0, s[8:9], 0x0 +; CHECK-NEXT:    s_waitcnt lgkmcnt(0) +; CHECK-NEXT:    s_cmpk_eq_i32 s1, 0x100 +; CHECK-NEXT:    s_cselect_b64 s[2:3], -1, 0 +; CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[2:3] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  ; %bb.1: ; %if.then +; CHECK-NEXT:    s_cmp_eq_u32 s0, 0 +; CHECK-NEXT:    s_cselect_b64 s[2:3], -1, 0 +; CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[2:3] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  .LBB1_2: ; %if.end6.sink.split +; CHECK-NEXT:    s_load_dwordx2 s[2:3], s[8:9], 0x8 +; CHECK-NEXT:    v_lshlrev_b32_e32 v0, 2, v0 +; CHECK-NEXT:    v_mov_b32_e32 v1, s0 +; CHECK-NEXT:    s_waitcnt lgkmcnt(0) +; CHECK-NEXT:    global_store_dword v0, v1, s[2:3] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  .LBB1_3: ; Inline asm indirect target +; CHECK-NEXT:    ; %UnifiedReturnBlock +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    s_endpgm +; CHECK-NEXT:  .LBB1_4: ; Inline asm indirect target +; CHECK-NEXT:    ; %if.else +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    v_cmp_gt_u32_e32 vcc, 10, v0 +; CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  ; %bb.5: ; %if.then3 +; CHECK-NEXT:    s_cmp_eq_u32 s0, 0 +; CHECK-NEXT:    s_cselect_b64 s[2:3], -1, 0 +; CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[2:3] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:    s_branch .LBB1_2 +; CHECK-NEXT:  .LBB1_6: ; Inline asm indirect target +; CHECK-NEXT:    ; %cond.false.i8 +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:  .LBB1_7: ; Inline asm indirect target +; CHECK-NEXT:    ; %cond.false +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    s_trap 2 +; CHECK-NEXT:    ; divergent unreachable +; CHECK-NEXT:    s_branch .LBB1_3 +; UNIFY-LABEL: @kernel_callbr( +; UNIFY-NEXT:  entry: +; UNIFY-NEXT:    [[TID:%.*]] = call i32 @llvm.amdgcn.workitem.id.x() +; UNIFY-NEXT:    [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 256 +; UNIFY-NEXT:    [[CMP32:%.*]] = zext i1 [[CMP]] to i32 +; UNIFY-NEXT:    callbr void asm "", "r,!i"(i32 [[CMP32]]) +; UNIFY-NEXT:            to label [[IF_THEN:%.*]] [label %if.else] +; UNIFY:       if.then: +; UNIFY-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 0 +; UNIFY-NEXT:    [[CMP1_32:%.*]] = zext i1 [[CMP1]] to i32 +; UNIFY-NEXT:    callbr void asm "", "r,!i"(i32 [[CMP1_32]]) +; UNIFY-NEXT:            to label [[IF_END6_SINK_SPLIT:%.*]] [label %cond.false] +; UNIFY:       cond.false: +; UNIFY-NEXT:    call void @llvm.trap() +; UNIFY-NEXT:    unreachable +; UNIFY:       if.else: +; UNIFY-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[TID]], 10 +; UNIFY-NEXT:    [[CMP2_32:%.*]] = zext i1 [[CMP2]] to i32 +; UNIFY-NEXT:    callbr void asm "", "r,!i"(i32 [[CMP2_32]]) +; UNIFY-NEXT:            to label [[IF_THEN3:%.*]] [label %if.end6] +; UNIFY:       if.then3: +; UNIFY-NEXT:    [[CMP1_I7:%.*]] = icmp eq i32 [[A]], 0 +; UNIFY-NEXT:    [[CMP1_I7_32:%.*]] = zext i1 [[CMP1_I7]] to i32 +; UNIFY-NEXT:    callbr void asm "", "r,!i"(i32 [[CMP1_I7_32]]) +; UNIFY-NEXT:            to label [[IF_END6_SINK_SPLIT]] [label %cond.false.i8] +; UNIFY:       cond.false.i8: +; UNIFY-NEXT:    call void @llvm.trap() +; UNIFY-NEXT:    unreachable +; UNIFY:       if.end6.sink.split: +; UNIFY-NEXT:    [[X1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[X:%.*]], i32 [[TID]] +; UNIFY-NEXT:    store i32 [[A]], ptr addrspace(1) [[X1]], align 4 +; UNIFY-NEXT:    callbr void asm "", ""() +; UNIFY-NEXT:            to label [[IF_END6:%.*]] [] +; UNIFY:       if.end6: +; UNIFY-NEXT:    ret void +; +entry: +  %tid = call i32 @llvm.amdgcn.workitem.id.x() +  %cmp = icmp eq i32 %n, 256 +  %cmp32 = zext i1 %cmp to i32 +  callbr void asm "", "r,!i"(i32 %cmp32) to label %if.then [label %if.else] + +if.then: +  %cmp1 = icmp eq i32 %a, 0 +  %cmp1_32 = zext i1 %cmp1 to i32 +  callbr void asm "", "r,!i"(i32 %cmp1_32) to label %if.end6.sink.split [label %cond.false] + +cond.false: +  call void @llvm.trap() +  unreachable + +if.else: +  %cmp2 = icmp ult i32 %tid, 10 +  %cmp2_32 = zext i1 %cmp2 to i32 +  callbr void asm "", "r,!i"(i32 %cmp2_32) to label %if.then3 [label %if.end6] + +if.then3: +  %cmp1.i7 = icmp eq i32 %a, 0 +  %cmp1.i7_32 = zext i1 %cmp1.i7 to i32 +  callbr void asm "", "r,!i"(i32 %cmp1.i7_32) to label %if.end6.sink.split [label %cond.false.i8] + +cond.false.i8: +  call void @llvm.trap() +  unreachable + +if.end6.sink.split: +  %x1 = getelementptr inbounds i32, ptr addrspace(1) %x, i32 %tid +  store i32 %a, ptr addrspace(1) %x1, align 4 +  callbr void asm "", ""() to label %if.end6 [] + +if.end6: +  ret void +} diff --git a/llvm/test/CodeGen/AMDGPU/umin-sub-to-usubo-select-combine.ll b/llvm/test/CodeGen/AMDGPU/umin-sub-to-usubo-select-combine.ll new file mode 100644 index 0000000..22e4a24 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/umin-sub-to-usubo-select-combine.ll @@ -0,0 +1,236 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 +; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s +; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11 %s + +define i16 @v_underflow_compare_fold_i16(i16 %a, i16 %b) #0 { +; GFX9-LABEL: v_underflow_compare_fold_i16: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX9-NEXT:    v_sub_u16_e32 v1, v0, v1 +; GFX9-NEXT:    v_min_u16_e32 v0, v1, v0 +; GFX9-NEXT:    s_setpc_b64 s[30:31] +; +; GFX11-LABEL: v_underflow_compare_fold_i16: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX11-NEXT:    v_sub_nc_u16 v0.h, v0.l, v1.l +; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) +; GFX11-NEXT:    v_min_u16 v0.l, v0.h, v0.l +; GFX11-NEXT:    s_setpc_b64 s[30:31] +  %sub = sub i16 %a, %b +  %cond = call i16 @llvm.umin.i16(i16 %sub, i16 %a) +  ret i16 %cond +} + +define i32 @v_underflow_compare_fold_i32(i32 %a, i32 %b) #0 { +; GFX9-LABEL: v_underflow_compare_fold_i32: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX9-NEXT:    v_sub_u32_e32 v1, v0, v1 +; GFX9-NEXT:    v_min_u32_e32 v0, v1, v0 +; GFX9-NEXT:    s_setpc_b64 s[30:31] +; +; GFX11-LABEL: v_underflow_compare_fold_i32: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX11-NEXT:    v_sub_nc_u32_e32 v1, v0, v1 +; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) +; GFX11-NEXT:    v_min_u32_e32 v0, v1, v0 +; GFX11-NEXT:    s_setpc_b64 s[30:31] +  %sub = sub i32 %a, %b +  %cond = call i32 @llvm.umin.i32(i32 %sub, i32 %a) +  ret i32 %cond +} + +define i32 @v_underflow_compare_fold_i32_commute(i32 %a, i32 %b) #0 { +; GFX9-LABEL: v_underflow_compare_fold_i32_commute: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX9-NEXT:    v_sub_u32_e32 v1, v0, v1 +; GFX9-NEXT:    v_min_u32_e32 v0, v0, v1 +; GFX9-NEXT:    s_setpc_b64 s[30:31] +; +; GFX11-LABEL: v_underflow_compare_fold_i32_commute: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX11-NEXT:    v_sub_nc_u32_e32 v1, v0, v1 +; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) +; GFX11-NEXT:    v_min_u32_e32 v0, v0, v1 +; GFX11-NEXT:    s_setpc_b64 s[30:31] +  %sub = sub i32 %a, %b +  %cond = call i32 @llvm.umin.i32(i32 %a, i32 %sub) +  ret i32 %cond +} + +define i32 @v_underflow_compare_fold_i32_multi_use(i32 %a, i32 %b, ptr addrspace(1) %ptr) #0 { +; GFX9-LABEL: v_underflow_compare_fold_i32_multi_use: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX9-NEXT:    v_sub_u32_e32 v1, v0, v1 +; GFX9-NEXT:    v_min_u32_e32 v0, v1, v0 +; GFX9-NEXT:    global_store_dword v[2:3], v1, off +; GFX9-NEXT:    s_waitcnt vmcnt(0) +; GFX9-NEXT:    s_setpc_b64 s[30:31] +; +; GFX11-LABEL: v_underflow_compare_fold_i32_multi_use: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX11-NEXT:    v_sub_nc_u32_e32 v1, v0, v1 +; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) +; GFX11-NEXT:    v_min_u32_e32 v0, v1, v0 +; GFX11-NEXT:    global_store_b32 v[2:3], v1, off +; GFX11-NEXT:    s_setpc_b64 s[30:31] +  %sub = sub i32 %a, %b +  store i32 %sub, ptr addrspace(1) %ptr +  %cond = call i32 @llvm.umin.i32(i32 %sub, i32 %a) +  ret i32 %cond +} + +define i64 @v_underflow_compare_fold_i64(i64 %a, i64 %b) #0 { +; GFX9-LABEL: v_underflow_compare_fold_i64: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX9-NEXT:    v_sub_co_u32_e32 v2, vcc, v0, v2 +; GFX9-NEXT:    v_subb_co_u32_e32 v3, vcc, v1, v3, vcc +; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, v[2:3], v[0:1] +; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc +; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc +; GFX9-NEXT:    s_setpc_b64 s[30:31] +; +; GFX11-LABEL: v_underflow_compare_fold_i64: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX11-NEXT:    v_sub_co_u32 v2, vcc_lo, v0, v2 +; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-NEXT:    v_sub_co_ci_u32_e64 v3, null, v1, v3, vcc_lo +; GFX11-NEXT:    v_cmp_lt_u64_e32 vcc_lo, v[2:3], v[0:1] +; GFX11-NEXT:    v_dual_cndmask_b32 v0, v0, v2 :: v_dual_cndmask_b32 v1, v1, v3 +; GFX11-NEXT:    s_setpc_b64 s[30:31] +  %sub = sub i64 %a, %b +  %cond = call i64 @llvm.umin.i64(i64 %sub, i64 %a) +  ret i64 %cond +} + +define i64 @v_underflow_compare_fold_i64_commute(i64 %a, i64 %b) #0 { +; GFX9-LABEL: v_underflow_compare_fold_i64_commute: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX9-NEXT:    v_sub_co_u32_e32 v2, vcc, v0, v2 +; GFX9-NEXT:    v_subb_co_u32_e32 v3, vcc, v1, v3, vcc +; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, v[0:1], v[2:3] +; GFX9-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc +; GFX9-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc +; GFX9-NEXT:    s_setpc_b64 s[30:31] +; +; GFX11-LABEL: v_underflow_compare_fold_i64_commute: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX11-NEXT:    v_sub_co_u32 v2, vcc_lo, v0, v2 +; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-NEXT:    v_sub_co_ci_u32_e64 v3, null, v1, v3, vcc_lo +; GFX11-NEXT:    v_cmp_lt_u64_e32 vcc_lo, v[0:1], v[2:3] +; GFX11-NEXT:    v_dual_cndmask_b32 v0, v2, v0 :: v_dual_cndmask_b32 v1, v3, v1 +; GFX11-NEXT:    s_setpc_b64 s[30:31] +  %sub = sub i64 %a, %b +  %cond = call i64 @llvm.umin.i64(i64 %a, i64 %sub) +  ret i64 %cond +} + +define i64 @v_underflow_compare_fold_i64_multi_use(i64 %a, i64 %b, ptr addrspace(1) %ptr) #0 { +; GFX9-LABEL: v_underflow_compare_fold_i64_multi_use: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX9-NEXT:    v_sub_co_u32_e32 v2, vcc, v0, v2 +; GFX9-NEXT:    v_subb_co_u32_e32 v3, vcc, v1, v3, vcc +; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, v[2:3], v[0:1] +; GFX9-NEXT:    global_store_dwordx2 v[4:5], v[2:3], off +; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc +; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc +; GFX9-NEXT:    s_waitcnt vmcnt(0) +; GFX9-NEXT:    s_setpc_b64 s[30:31] +; +; GFX11-LABEL: v_underflow_compare_fold_i64_multi_use: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; GFX11-NEXT:    v_sub_co_u32 v2, vcc_lo, v0, v2 +; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-NEXT:    v_sub_co_ci_u32_e64 v3, null, v1, v3, vcc_lo +; GFX11-NEXT:    v_cmp_lt_u64_e32 vcc_lo, v[2:3], v[0:1] +; GFX11-NEXT:    global_store_b64 v[4:5], v[2:3], off +; GFX11-NEXT:    v_dual_cndmask_b32 v0, v0, v2 :: v_dual_cndmask_b32 v1, v1, v3 +; GFX11-NEXT:    s_setpc_b64 s[30:31] +  %sub = sub i64 %a, %b +  store i64 %sub, ptr addrspace(1) %ptr +  %cond = call i64 @llvm.umin.i64(i64 %sub, i64 %a) +  ret i64 %cond +} + +define amdgpu_ps i16 @s_underflow_compare_fold_i16(i16 inreg %a, i16 inreg %b) #0 { +; GFX9-LABEL: s_underflow_compare_fold_i16: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_sub_i32 s1, s0, s1 +; GFX9-NEXT:    s_and_b32 s0, 0xffff, s0 +; GFX9-NEXT:    s_and_b32 s1, s1, 0xffff +; GFX9-NEXT:    s_min_u32 s0, s1, s0 +; GFX9-NEXT:    ; return to shader part epilog +; +; GFX11-LABEL: s_underflow_compare_fold_i16: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_sub_i32 s1, s0, s1 +; GFX11-NEXT:    s_and_b32 s0, 0xffff, s0 +; GFX11-NEXT:    s_and_b32 s1, s1, 0xffff +; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) +; GFX11-NEXT:    s_min_u32 s0, s1, s0 +; GFX11-NEXT:    ; return to shader part epilog +  %sub = sub i16 %a, %b +  %cond = call i16 @llvm.umin.i16(i16 %sub, i16 %a) +  ret i16 %cond +} + +define amdgpu_ps i32 @s_underflow_compare_fold_i32(i32 inreg %a, i32 inreg %b) #0 { +; GFX9-LABEL: s_underflow_compare_fold_i32: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_sub_i32 s1, s0, s1 +; GFX9-NEXT:    s_min_u32 s0, s1, s0 +; GFX9-NEXT:    ; return to shader part epilog +; +; GFX11-LABEL: s_underflow_compare_fold_i32: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_sub_i32 s1, s0, s1 +; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) +; GFX11-NEXT:    s_min_u32 s0, s1, s0 +; GFX11-NEXT:    ; return to shader part epilog +  %sub = sub i32 %a, %b +  %cond = call i32 @llvm.umin.i32(i32 %sub, i32 %a) +  ret i32 %cond +} + +define amdgpu_ps i64 @s_underflow_compare_fold_i64(i64 inreg %a, i64 inreg %b) #0 { +; GFX9-LABEL: s_underflow_compare_fold_i64: +; GFX9:       ; %bb.0: +; GFX9-NEXT:    s_sub_u32 s2, s0, s2 +; GFX9-NEXT:    v_mov_b32_e32 v0, s0 +; GFX9-NEXT:    s_subb_u32 s3, s1, s3 +; GFX9-NEXT:    v_mov_b32_e32 v1, s1 +; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, s[2:3], v[0:1] +; GFX9-NEXT:    s_and_b64 s[4:5], vcc, exec +; GFX9-NEXT:    s_cselect_b32 s1, s3, s1 +; GFX9-NEXT:    s_cselect_b32 s0, s2, s0 +; GFX9-NEXT:    ; return to shader part epilog +; +; GFX11-LABEL: s_underflow_compare_fold_i64: +; GFX11:       ; %bb.0: +; GFX11-NEXT:    s_sub_u32 s2, s0, s2 +; GFX11-NEXT:    s_subb_u32 s3, s1, s3 +; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) +; GFX11-NEXT:    v_cmp_lt_u64_e64 s4, s[2:3], s[0:1] +; GFX11-NEXT:    s_and_b32 s4, s4, exec_lo +; GFX11-NEXT:    s_cselect_b32 s0, s2, s0 +; GFX11-NEXT:    s_cselect_b32 s1, s3, s1 +; GFX11-NEXT:    ; return to shader part epilog +  %sub = sub i64 %a, %b +  %cond = call i64 @llvm.umin.i64(i64 %sub, i64 %a) +  ret i64 %cond +} + +attributes #0 = { nounwind } diff --git a/llvm/test/CodeGen/AMDGPU/update-phi.ll b/llvm/test/CodeGen/AMDGPU/update-phi.ll index 50666be..684dc1a 100644 --- a/llvm/test/CodeGen/AMDGPU/update-phi.ll +++ b/llvm/test/CodeGen/AMDGPU/update-phi.ll @@ -37,3 +37,42 @@ n28:                                               ; preds = %.loopexit, %n28  n31:                                               ; preds =    ret void  } + +define amdgpu_ps void @_amdgpu_ps_main_callbr() local_unnamed_addr #3 { +; IR-LABEL: @_amdgpu_ps_main_callbr( +; IR-NEXT:  .entry: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[DOTLOOPEXIT:%.*]] [] +; IR:       .loopexit: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[N28:%.*]] [] +; IR:       n28: +; IR-NEXT:    [[DOT01:%.*]] = phi float [ 0.000000e+00, [[DOTLOOPEXIT]] ], [ [[N29:%.*]], [[TRANSITIONBLOCK:%.*]] ] +; IR-NEXT:    [[N29]] = fadd float [[DOT01]], 1.000000e+00 +; IR-NEXT:    [[N30:%.*]] = fcmp ogt float [[N29]], 4.000000e+00 +; IR-NEXT:    [[N30_32:%.*]] = zext i1 [[N30]] to i32 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK]], label [[DUMMYRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", "r,!i"(i32 [[N30_32]]) +; IR-NEXT:            to label [[DOTLOOPEXIT]] [label %n28] +; IR:       n31: +; IR-NEXT:    ret void +; IR:       DummyReturnBlock: +; IR-NEXT:    ret void +; +.entry: +  callbr void asm "", ""() to label %.loopexit [] + +.loopexit:                                        ; preds = %n28, %.entry +  callbr void asm "", ""() to label %n28 [] + +n28:                                               ; preds = %.loopexit, %n28 +  %.01 = phi float [ 0.000000e+00, %.loopexit ], [ %n29, %n28 ] +  %n29 = fadd float %.01, 1.0 +  %n30 = fcmp ogt float %n29, 4.000000e+00 +  %n30.32 = zext i1 %n30 to i32 +  callbr void asm "", "r,!i"(i32 %n30.32) to label %.loopexit [label %n28] + +n31:                                               ; preds = +  ret void +} diff --git a/llvm/test/CodeGen/AMDGPU/vgpr-lowering-gfx1250-t16.mir b/llvm/test/CodeGen/AMDGPU/vgpr-lowering-gfx1250-t16.mir index 8a70a8a..32cc398 100644 --- a/llvm/test/CodeGen/AMDGPU/vgpr-lowering-gfx1250-t16.mir +++ b/llvm/test/CodeGen/AMDGPU/vgpr-lowering-gfx1250-t16.mir @@ -36,7 +36,7 @@ body:             |      ; GCN-NEXT: v_add_f16_e64 v128.l /*v384.l*/, v129.l /*v385.l*/, v130.l /*v386.l*/      $vgpr384_lo16 = V_ADD_F16_t16_e64 0, undef $vgpr385_lo16, 0, undef $vgpr386_lo16, 0, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0x8a +    ; GCN-NEXT: s_set_vgpr_msb 0x458a      ; ASM-SAME:                                         ;  msbs: dst=2 src0=2 src1=2 src2=0      ; GCN-NEXT: v_add_f16_e64 v0.h /*v512.h*/, v1.h /*v513.h*/, v2.h /*v514.h*/      $vgpr512_hi16 = V_ADD_F16_t16_e64 0, undef $vgpr513_hi16, 0, undef $vgpr514_hi16, 0, 0, 0, implicit $exec, implicit $mode @@ -50,7 +50,7 @@ body:             |      ; GCN-NEXT: v_add_f16_e64 v128.l /*v640.l*/, v129.l /*v641.l*/, v130.l /*v642.l*/      $vgpr640_lo16 = V_ADD_F16_t16_e64 0, undef $vgpr641_lo16, 0, undef $vgpr642_lo16, 0, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0xcf +    ; GCN-NEXT: s_set_vgpr_msb 0x8acf      ; ASM-SAME:                                         ;  msbs: dst=3 src0=3 src1=3 src2=0      ; GCN-NEXT: v_add_f16_e64 v0.h /*v768.h*/, v1.h /*v769.h*/, v2.h /*v770.h*/      $vgpr768_hi16 = V_ADD_F16_t16_e64 0, undef $vgpr769_hi16, 0, undef $vgpr770_hi16, 0, 0, 0, implicit $exec, implicit $mode diff --git a/llvm/test/CodeGen/AMDGPU/vgpr-lowering-gfx1250.mir b/llvm/test/CodeGen/AMDGPU/vgpr-lowering-gfx1250.mir index f508df2..7e1c28f 100644 --- a/llvm/test/CodeGen/AMDGPU/vgpr-lowering-gfx1250.mir +++ b/llvm/test/CodeGen/AMDGPU/vgpr-lowering-gfx1250.mir @@ -22,13 +22,13 @@ body:             |      $vgpr257 = V_MOV_B32_e32 undef $vgpr510, implicit $exec      ; Single bit change -    ; GCN-NEXT: s_set_vgpr_msb 1 +    ; GCN-NEXT: s_set_vgpr_msb 0x4101      ; ASM-SAME:                                         ;  msbs: dst=0 src0=1 src1=0 src2=0      ; GCN-NEXT: v_rcp_f32_e64 v255, v2 /*v258*/      $vgpr255 = V_RCP_F32_e64 0, undef $vgpr258, 0, 0, implicit $exec, implicit $mode      ; Reset -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x100      ; ASM-SAME:                                         ;  msbs: dst=0 src0=0 src1=0 src2=0      ; GCN-NEXT: v_rcp_f32_e64 v255, v1      $vgpr255 = V_RCP_F32_e64 0, undef $vgpr1, 0, 0, implicit $exec, implicit $mode @@ -40,7 +40,7 @@ body:             |      ; GCN-NEXT: v_add_nc_u32_e32 v0, v253 /*v509*/, v252 /*v508*/      $vgpr0 = V_ADD_U32_e32 undef $vgpr509, undef $vgpr508, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0x44 +    ; GCN-NEXT: s_set_vgpr_msb 0x544      ; ASM-SAME:                                         ;  msbs: dst=1 src0=0 src1=1 src2=0      ; GCN-NEXT: s_delay_alu instid0(VALU_DEP_1)      ; GCN-NEXT: v_add_f32_e64 v2 /*v258*/, v0, v251 /*v507*/ @@ -48,7 +48,7 @@ body:             |      ; VOP3 -    ; GCN-NEXT: s_set_vgpr_msb 0x55 +    ; GCN-NEXT: s_set_vgpr_msb 0x4455      ; ASM-SAME:                                         ;  msbs: dst=1 src0=1 src1=1 src2=1      ; GCN-NEXT: v_fma_f32 v3 /*v259*/, v4 /*v260*/, v5 /*v261*/, v6 /*v262*/      $vgpr259 = V_FMA_F32_e64 0, undef $vgpr260, 0, undef $vgpr261, 0, undef $vgpr262, 0, 0, implicit $exec, implicit $mode @@ -58,32 +58,32 @@ body:             |      $vgpr259 = V_FMA_F32_e64 0, undef $vgpr260, 0, undef $vgpr261, 0, undef $vgpr262, 0, 0, implicit $exec, implicit $mode      ; Tuple crossing the 256 boundary -    ; GCN-NEXT: s_set_vgpr_msb 17 +    ; GCN-NEXT: s_set_vgpr_msb 0x5511      ; ASM-SAME:                                         ;  msbs: dst=0 src0=1 src1=0 src2=1      ; GCN-NEXT: v_mqsad_u32_u8 v[254:257], v[2:3] /*v[258:259]*/, v0, v[244:247] /*v[500:503]*/      $vgpr254_vgpr255_vgpr256_vgpr257 = V_MQSAD_U32_U8_e64 $vgpr258_vgpr259, $vgpr0, undef $vgpr500_vgpr501_vgpr502_vgpr503, 0, implicit $exec      ; DPP/tied operand -    ; GCN-NEXT: s_set_vgpr_msb 0x45 +    ; GCN-NEXT: s_set_vgpr_msb 0x1145      ; ASM-SAME:                                         ;  msbs: dst=1 src0=1 src1=1 src2=0      ; GCN-NEXT: s_delay_alu instid0(VALU_DEP_1)      ; GCN-NEXT: v_add_nc_u16_e64_dpp v0 /*v256*/, v1 /*v257*/, v2 /*v258*/ quad_perm:[1,0,0,0] row_mask:0xf bank_mask:0xf bound_ctrl:1      $vgpr256 = V_ADD_NC_U16_fake16_e64_dpp $vgpr256, 0, $vgpr257, 0, undef $vgpr258, 0, 0, 1, 15, 15, 1, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 17 +    ; GCN-NEXT: s_set_vgpr_msb 0x4511      ; ASM-SAME:                                         ;  msbs: dst=0 src0=1 src1=0 src2=1      ; GCN-NEXT: v_add3_u32_e64_dpp v0, v1 /*v257*/, v0, v2 /*v258*/ quad_perm:[1,0,0,0] row_mask:0xf bank_mask:0xf bound_ctrl:1      $vgpr0 = V_ADD3_U32_e64_dpp $vgpr0, $vgpr257, $vgpr0, undef $vgpr258, 1, 15, 15, 1, implicit $exec      ; DS (addr, data0, and data1 operands) -    ; GCN-NEXT: s_set_vgpr_msb 20 +    ; GCN-NEXT: s_set_vgpr_msb 0x1114      ; ASM-SAME:                                         ;  msbs: dst=0 src0=0 src1=1 src2=1      ; GCN-NEXT: ds_store_2addr_b32 v0, v248 /*v504*/, v249 /*v505*/ offset1:1      DS_WRITE2_B32_gfx9 $vgpr0, undef $vgpr504, undef $vgpr505, 0, 1, 0, implicit $exec      ; Reset -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x1400      ; ASM-SAME:                                         ;  msbs: dst=0 src0=0 src1=0 src2=0      ; GCN-NEXT: ds_store_2addr_b32 v0, v248, v249 offset1:1      DS_WRITE2_B32_gfx9 $vgpr0, undef $vgpr248, undef $vgpr249, 0, 1, 0, implicit $exec @@ -93,13 +93,13 @@ body:             |      ; GCN-NEXT: ds_load_b32 v0, v255 /*v511*/      $vgpr0 = DS_READ_B32_gfx9 $vgpr511, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0x44 +    ; GCN-NEXT: s_set_vgpr_msb 0x144      ; ASM-SAME:                                         ;  msbs: dst=1 src0=0 src1=1 src2=0      ; GCN-NEXT: ds_add_rtn_u32 v255 /*v511*/, v0, v248 /*v504*/      $vgpr511 = DS_ADD_RTN_U32_gfx9 $vgpr0, undef $vgpr504, 0, 0, implicit $exec      ; Reset -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4400      ; ASM-SAME:                                         ;  msbs: dst=0 src0=0 src1=0 src2=0      ; GCN-NEXT: ds_add_rtn_u32 v0, v0, v0      $vgpr0 = DS_ADD_RTN_U32_gfx9 $vgpr0, $vgpr0, 0, 0, implicit $exec @@ -111,17 +111,17 @@ body:             |      ; GCN-NEXT: global_load_b32 v2, v[2:3] /*v[258:259]*/, off      $vgpr2 = GLOBAL_LOAD_DWORD undef $vgpr258_vgpr259, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 64 +    ; GCN-NEXT: s_set_vgpr_msb 0x140      ; ASM-SAME:                                         ;  msbs: dst=1 src0=0 src1=0 src2=0      ; GCN-NEXT: global_load_b32 v255 /*v511*/, v0, s[0:1]      $vgpr511 = GLOBAL_LOAD_DWORD_SADDR undef $sgpr0_sgpr1, $vgpr0, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 1 +    ; GCN-NEXT: s_set_vgpr_msb 0x4001      ; ASM-SAME:                                         ;  msbs: dst=0 src0=1 src1=0 src2=0      ; GCN-NEXT: scratch_load_u8 v0, v255 /*v511*/, s0      $vgpr0 = SCRATCH_LOAD_UBYTE_SVS $vgpr511, undef $sgpr0, 0, 0, implicit $exec, implicit $flat_scr -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x100      ; ASM-SAME:                                         ;  msbs: dst=0 src0=0 src1=0 src2=0      ; GCN-NEXT: global_store_b32 v[0:1], v2, off      GLOBAL_STORE_DWORD $vgpr0_vgpr1, $vgpr2, 0, 0, implicit $exec @@ -135,13 +135,13 @@ body:             |      ; GCN-NEXT: global_store_b96 v[0:1] /*v[256:257]*/, v[244:246] /*v[500:502]*/, off      GLOBAL_STORE_DWORDX3 $vgpr256_vgpr257, $vgpr500_vgpr501_vgpr502, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0x44 +    ; GCN-NEXT: s_set_vgpr_msb 0x544      ; ASM-SAME:                                         ;  msbs: dst=1 src0=0 src1=1 src2=0      ; GCN-NEXT: flat_atomic_add_u32 v254 /*v510*/, v[0:1], v255 /*v511*/ th:TH_ATOMIC_RETURN      $vgpr510 = FLAT_ATOMIC_ADD_RTN $vgpr0_vgpr1, $vgpr511, 0, 1, implicit $exec, implicit $flat_scr      ; Reset -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4400      ; ASM-SAME:                                         ;  msbs: dst=0 src0=0 src1=0 src2=0      ; GCN-NEXT: flat_atomic_add_u32 v0, v[0:1], v255 th:TH_ATOMIC_RETURN      $vgpr0 = FLAT_ATOMIC_ADD_RTN $vgpr0_vgpr1, $vgpr255, 0, 1, implicit $exec, implicit $flat_scr @@ -156,12 +156,12 @@ body:             |      ; GCN-NEXT: buffer_load_b32 v1 /*v257*/, v0, s[8:11], s3 offen      $vgpr257 = BUFFER_LOAD_DWORD_VBUFFER_OFFEN $vgpr0, undef $sgpr8_sgpr9_sgpr10_sgpr11, undef $sgpr3, 0, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0x41 +    ; GCN-NEXT: s_set_vgpr_msb 0x4041      ; ASM-SAME:                                         ;  msbs: dst=1 src0=1 src1=0 src2=0      ; GCN-NEXT: buffer_load_b32 v1 /*v257*/, v0 /*v256*/, s[8:11], s3 offen      $vgpr257 = BUFFER_LOAD_DWORD_VBUFFER_OFFEN $vgpr256, undef $sgpr8_sgpr9_sgpr10_sgpr11, undef $sgpr3, 0, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4100      ; ASM-SAME:                                         ;  msbs: dst=0 src0=0 src1=0 src2=0      ; GCN-NEXT: buffer_store_b32 v0, v1, s[0:3], s3 offen      BUFFER_STORE_DWORD_VBUFFER_OFFEN $vgpr0, $vgpr1, undef $sgpr0_sgpr1_sgpr2_sgpr3, undef $sgpr3, 0, 0, 0, implicit $exec @@ -171,7 +171,7 @@ body:             |      ; GCN-NEXT: buffer_store_b32 v0 /*v256*/, v1 /*v257*/, s[0:3], s3 offen      BUFFER_STORE_DWORD_VBUFFER_OFFEN $vgpr256, $vgpr257, undef $sgpr0_sgpr1_sgpr2_sgpr3, undef $sgpr3, 0, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4100      ; ASM-SAME:                                         ;  msbs: dst=0 src0=0 src1=0 src2=0      ; GCN-NEXT: buffer_atomic_add_f32 v0, v1, s[0:3], s3 offen      BUFFER_ATOMIC_ADD_F32_VBUFFER_OFFEN $vgpr0, $vgpr1, undef $sgpr0_sgpr1_sgpr2_sgpr3, undef $sgpr3, 0, 0, implicit $exec @@ -183,44 +183,44 @@ body:             |      ; VGPRs above 512 -    ; GCN-NEXT: s_set_vgpr_msb 0xaa +    ; GCN-NEXT: s_set_vgpr_msb 0x41aa      ; ASM-SAME:                                         ;  msbs: dst=2 src0=2 src1=2 src2=2      ; GCN-NEXT: v_fma_f32 v0 /*v512*/, v1 /*v513*/, v2 /*v514*/, v3 /*v515*/      $vgpr512 = V_FMA_F32_e64 0, undef $vgpr513, 0, undef $vgpr514, 0, undef $vgpr515, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0xab +    ; GCN-NEXT: s_set_vgpr_msb 0xaaab      ; ASM-SAME:                                         ;  msbs: dst=2 src0=3 src1=2 src2=2      ; GCN-NEXT: v_fma_f32 v0 /*v512*/, v0 /*v768*/, v2 /*v514*/, v3 /*v515*/      $vgpr512 = V_FMA_F32_e64 0, undef $vgpr768, 0, undef $vgpr514, 0, undef $vgpr515, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0xae +    ; GCN-NEXT: s_set_vgpr_msb 0xabae      ; ASM-SAME:                                         ;  msbs: dst=2 src0=2 src1=3 src2=2      ; GCN-NEXT: v_fma_f32 v0 /*v512*/, v1 /*v513*/, v2 /*v770*/, v3 /*v515*/      $vgpr512 = V_FMA_F32_e64 0, undef $vgpr513, 0, undef $vgpr770, 0, undef $vgpr515, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0xba +    ; GCN-NEXT: s_set_vgpr_msb 0xaeba      ; ASM-SAME:                                         ;  msbs: dst=2 src0=2 src1=2 src2=3      ; GCN-NEXT: v_fma_f32 v0 /*v512*/, v1 /*v513*/, v2 /*v514*/, v3 /*v771*/      $vgpr512 = V_FMA_F32_e64 0, undef $vgpr513, 0, undef $vgpr514, 0, undef $vgpr771, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0xea +    ; GCN-NEXT: s_set_vgpr_msb 0xbaea      ; ASM-SAME:                                         ;  msbs: dst=3 src0=2 src1=2 src2=2      ; GCN-NEXT: v_fma_f32 v255 /*v1023*/, v1 /*v513*/, v2 /*v514*/, v3 /*v515*/      $vgpr1023 = V_FMA_F32_e64 0, undef $vgpr513, 0, undef $vgpr514, 0, undef $vgpr515, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0xff +    ; GCN-NEXT: s_set_vgpr_msb 0xeaff      ; ASM-SAME:                                         ;  msbs: dst=3 src0=3 src1=3 src2=3      ; GCN-NEXT: v_fma_f32 v0 /*v768*/, v1 /*v769*/, v2 /*v770*/, v3 /*v771*/      $vgpr768 = V_FMA_F32_e64 0, undef $vgpr769, 0, undef $vgpr770, 0, undef $vgpr771, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0x42 +    ; GCN-NEXT: s_set_vgpr_msb 0xff42      ; ASM-SAME:                                         ;  msbs: dst=1 src0=2 src1=0 src2=0      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v0 /*v512*/      $vgpr256 = V_MOV_B32_e32 undef $vgpr512, implicit $exec      ; Reset -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4200      ; ASM-SAME:                                         ;  msbs: dst=0 src0=0 src1=0 src2=0      ; GCN-NEXT: v_fma_f32 v0, v1, v2, v3      $vgpr0 = V_FMA_F32_e64 0, undef $vgpr1, 0, undef $vgpr2, 0, undef $vgpr3, 0, 0, implicit $exec, implicit $mode @@ -232,12 +232,12 @@ body:             |      ; GCN-NEXT: global_store_b96 v[0:1] /*v[512:513]*/, v[0:2] /*v[512:514]*/, off      GLOBAL_STORE_DWORDX3 $vgpr512_vgpr513, $vgpr512_vgpr513_vgpr514, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 11 +    ; GCN-NEXT: s_set_vgpr_msb 0xa0b      ; ASM-SAME:                                         ;  msbs: dst=0 src0=3 src1=2 src2=0      ; GCN-NEXT: global_store_b64 v[254:255] /*v[1022:1023]*/, v[254:255] /*v[766:767]*/, off      GLOBAL_STORE_DWORDX2 $vgpr1022_vgpr1023, $vgpr766_vgpr767, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0x55 +    ; GCN-NEXT: s_set_vgpr_msb 0xb55      ; ASM-SAME:                                         ;  msbs: dst=1 src0=1 src1=1 src2=1      ; GCN-NEXT: v_wmma_f32_16x16x32_bf16 v[14:21] /*v[270:277]*/, v[26:33] /*v[282:289]*/, v[34:41] /*v[290:297]*/, v[14:21] /*v[270:277]*/      early-clobber $vgpr270_vgpr271_vgpr272_vgpr273_vgpr274_vgpr275_vgpr276_vgpr277 = V_WMMA_F32_16X16X32_BF16_w32_twoaddr 8, undef $vgpr282_vgpr283_vgpr284_vgpr285_vgpr286_vgpr287_vgpr288_vgpr289, 8, undef $vgpr290_vgpr291_vgpr292_vgpr293_vgpr294_vgpr295_vgpr296_vgpr297, 8, killed undef $vgpr270_vgpr271_vgpr272_vgpr273_vgpr274_vgpr275_vgpr276_vgpr277, 0, 0, 0, 0, implicit $exec @@ -247,6 +247,7 @@ body:             |  ...  # ASM-LABEL: {{^}}vopd: +  # DIS-LABEL: <vopd>:  ---  name:            vopd @@ -262,35 +263,35 @@ body:             |      ; GCN-NEXT: v_dual_sub_f32 v244 /*v500*/, v1, v2 :: v_dual_mul_f32 v0 /*v256*/, v3, v4      $vgpr500, $vgpr256 = V_DUAL_SUB_F32_e32_X_MUL_F32_e32_gfx1250 undef $vgpr1, undef $vgpr2, undef $vgpr3, undef $vgpr4, implicit $mode, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0x41 +    ; GCN-NEXT: s_set_vgpr_msb 0x4041      ; GCN-NEXT: v_dual_sub_f32 v244 /*v500*/, s1, v2 :: v_dual_mul_f32 v0 /*v256*/, v44 /*v300*/, v4      $vgpr500, $vgpr256 = V_DUAL_SUB_F32_e32_X_MUL_F32_e32_gfx1250 undef $sgpr1, undef $vgpr2, undef $vgpr300, undef $vgpr4, implicit $mode, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 4 +    ; GCN-NEXT: s_set_vgpr_msb 0x4104      ; GCN-NEXT: v_dual_sub_f32 v255, v1, v44 /*v300*/ :: v_dual_mul_f32 v6, v0, v1 /*v257*/      $vgpr255, $vgpr6 = V_DUAL_SUB_F32_e32_X_MUL_F32_e32_gfx1250 undef $vgpr1, undef $vgpr300, undef $vgpr0, $vgpr257, implicit $mode, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 1 +    ; GCN-NEXT: s_set_vgpr_msb 0x401      ; GCN-NEXT: v_dual_sub_f32 v255, 0, v1 :: v_dual_mul_f32 v6, v44 /*v300*/, v3      $vgpr255, $vgpr6 = V_DUAL_SUB_F32_e32_X_MUL_F32_e32_gfx1250 0, undef $vgpr1, undef $vgpr300, undef $vgpr3, implicit $mode, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 64 +    ; GCN-NEXT: s_set_vgpr_msb 0x140      ; GCN-NEXT: v_dual_fmamk_f32 v243 /*v499*/, v0, 0xa, v3 :: v_dual_fmac_f32 v0 /*v256*/, v1, v1      $vgpr499, $vgpr256 = V_DUAL_FMAMK_F32_X_FMAC_F32_e32_gfx1250 undef $vgpr0, 10, undef $vgpr3, undef $vgpr1, undef $vgpr1, $vgpr256, implicit $mode, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 5 +    ; GCN-NEXT: s_set_vgpr_msb 0x4005      ; GCN-NEXT: v_dual_mov_b32 v2, v3 /*v259*/ :: v_dual_add_f32 v3, v1 /*v257*/, v2 /*v258*/      $vgpr2, $vgpr3 = V_DUAL_MOV_B32_e32_X_ADD_F32_e32_gfx1250 undef $vgpr259, undef $vgpr257, undef $vgpr258, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0x44 +    ; GCN-NEXT: s_set_vgpr_msb 0x544      ; GCN-NEXT: v_dual_fmamk_f32 v244 /*v500*/, v0, 0xa, v44 /*v300*/ :: v_dual_fmac_f32 v3 /*v259*/, v1, v1 /*v257*/      $vgpr500, $vgpr259 = V_DUAL_FMAMK_F32_X_FMAC_F32_e32_gfx1250 undef $vgpr0, 10, undef $vgpr300, undef $vgpr1, undef $vgpr257, $vgpr259, implicit $mode, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 16 +    ; GCN-NEXT: s_set_vgpr_msb 0x4410      ; GCN-NEXT: v_dual_fma_f32 v0, v6, v6, v44 /*v300*/ :: v_dual_fma_f32 v1, v4, v5, v45 /*v301*/      $vgpr0, $vgpr1 = V_DUAL_FMA_F32_e64_X_FMA_F32_e64_e96_gfx1250 0, undef $vgpr6, 0, undef $vgpr6, 0, undef $vgpr300, 0, undef $vgpr4, 0, undef $vgpr5, 0, undef $vgpr301, implicit $mode, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x1000      ; GCN-NEXT: v_dual_fmac_f32 v2, v6, v6 :: v_dual_fma_f32 v3, v4, v5, v3      $vgpr2, $vgpr3 = V_DUAL_FMAC_F32_e32_X_FMA_F32_e64_e96_gfx1250 0, undef $vgpr6, 0, undef $vgpr6, undef $vgpr2, 0, undef $vgpr4, 0, undef $vgpr5, 0, $vgpr3, implicit $mode, implicit $exec @@ -298,7 +299,7 @@ body:             |      ; GCN-NEXT: v_dual_fma_f32 v244 /*v500*/, v6, v7, v8 :: v_dual_add_f32 v3 /*v259*/, v4, v5      $vgpr500, $vgpr259 = V_DUAL_FMA_F32_e64_X_ADD_F32_e32_e96_gfx1250 0, undef $vgpr6, 0, undef $vgpr7, 0, undef $vgpr8, 0, undef $vgpr4, 0, undef $vgpr5, implicit $mode, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0xae +    ; GCN-NEXT: s_set_vgpr_msb 0x40ae      ; GCN-NEXT: v_dual_fmac_f32 v2 /*v514*/, v6 /*v518*/, v8 /*v776*/ :: v_dual_fma_f32 v3 /*v515*/, v4 /*v516*/, v7 /*v775*/, v3 /*v515*/      $vgpr514, $vgpr515 = V_DUAL_FMAC_F32_e32_X_FMA_F32_e64_e96_gfx1250 0, undef $vgpr518, 0, undef $vgpr776, undef $vgpr514, 0, undef $vgpr516, 0, undef $vgpr775, 0, $vgpr515, implicit $mode, implicit $exec @@ -319,31 +320,31 @@ body:             |      ; GCN-NEXT: v_fmaak_f32 v0 /*v256*/, v1 /*v257*/, v2 /*v258*/, 0x1      $vgpr256 = V_FMAAK_F32 undef $vgpr257, undef $vgpr258, 1, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 5 +    ; GCN-NEXT: s_set_vgpr_msb 0x4505      ; GCN-NEXT: v_fmaak_f32 v0, v1 /*v257*/, v2 /*v258*/, 0x1      $vgpr0 = V_FMAAK_F32 undef $vgpr257, undef $vgpr258, 1, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0x41 +    ; GCN-NEXT: s_set_vgpr_msb 0x541      ; GCN-NEXT: v_fmaak_f32 v0 /*v256*/, v1 /*v257*/, v2, 0x1      $vgpr256 = V_FMAAK_F32 undef $vgpr257, undef $vgpr2, 1, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0x44 +    ; GCN-NEXT: s_set_vgpr_msb 0x4144      ; GCN-NEXT: v_fmaak_f32 v0 /*v256*/, v1, v2 /*v258*/, 0x1      $vgpr256 = V_FMAAK_F32 undef $vgpr1, undef $vgpr258, 1, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0x45 +    ; GCN-NEXT: s_set_vgpr_msb 0x4445      ; GCN-NEXT: v_fmamk_f32 v0 /*v256*/, v1 /*v257*/, 0x1, v2 /*v258*/      $vgpr256 = V_FMAMK_F32 undef $vgpr257, 1, undef $vgpr258, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 5 +    ; GCN-NEXT: s_set_vgpr_msb 0x4505      ; GCN-NEXT: v_fmamk_f32 v0, v1 /*v257*/, 0x1, v2 /*v258*/      $vgpr0 = V_FMAMK_F32 undef $vgpr257, 1, undef $vgpr258, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0x41 +    ; GCN-NEXT: s_set_vgpr_msb 0x541      ; GCN-NEXT: v_fmamk_f32 v0 /*v256*/, v1 /*v257*/, 0x1, v2      $vgpr256 = V_FMAMK_F32 undef $vgpr257, 1, undef $vgpr2, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0x44 +    ; GCN-NEXT: s_set_vgpr_msb 0x4144      ; GCN-NEXT: v_fmamk_f32 v0 /*v256*/, v1, 0x1, v2 /*v258*/      $vgpr256 = V_FMAMK_F32 undef $vgpr1, 1, undef $vgpr258, implicit $exec, implicit $mode @@ -389,15 +390,15 @@ body:             |      ; GCN-NEXT: v_lshlrev_b32_e64 v0, v0 /*v256*/, v2      $vgpr0 = V_LSHLREV_B32_e64 undef $vgpr256, undef $vgpr2, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 4 +    ; GCN-NEXT: s_set_vgpr_msb 0x104      ; GCN-NEXT: v_lshlrev_b32_e64 v0, v1, v0 /*v256*/      $vgpr0 = V_LSHLREV_B32_e64 undef $vgpr1, undef $vgpr256, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 1 +    ; GCN-NEXT: s_set_vgpr_msb 0x401      ; GCN-NEXT: v_subrev_nc_u32_e32 v0, v0 /*v256*/, v2      $vgpr0 = V_SUBREV_U32_e32 undef $vgpr256, undef $vgpr2, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 4 +    ; GCN-NEXT: s_set_vgpr_msb 0x104      ; GCN-NEXT: v_subrev_nc_u32_e32 v0, v1, v0 /*v256*/      $vgpr0 = V_SUBREV_U32_e32 undef $vgpr1, undef $vgpr256, implicit $exec @@ -417,7 +418,7 @@ body:             |      ; GCN-NEXT: v_fma_f32 v3 /*v259*/, v4 /*v260*/, v5 /*v261*/, v6 /*v262*/      $vgpr259 = V_FMA_F32_e64 0, undef $vgpr260, 0, undef $vgpr261, 0, undef $vgpr262, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x5500      ; GCN-NEXT: v_add_nc_u32_e32 v0, v1, v2      $vgpr0 = V_ADD_U32_e32 undef $vgpr1, undef $vgpr2, implicit $exec @@ -431,7 +432,7 @@ body:             |      ; GCN-NEXT: v_add_nc_u32_e32 v0 /*v256*/, v1, v2      $vgpr256 = V_ADD_U32_e32 undef $vgpr1, undef $vgpr2, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; GCN-NEXT: v_fma_f32 v3, v4, v5, s2      $vgpr3 = V_FMA_F32_e64 0, undef $vgpr4, 0, undef $vgpr5, 0, undef $sgpr2, 0, 0, implicit $exec, implicit $mode @@ -439,17 +440,17 @@ body:             |      ; GCN-NEXT: v_fma_f32 v3, v4 /*v260*/, v5, 1      $vgpr3 = V_FMA_F32_e64 0, undef $vgpr260, 0, undef $vgpr5, 0, 1, 0, 0, implicit $exec, implicit $mode -    ; GCN-NEXT: s_set_vgpr_msb 4 +    ; GCN-NEXT: s_set_vgpr_msb 0x104      ; GCN-NEXT: v_mov_b32_e32 v0, v1      $vgpr0 = V_MOV_B32_e32 undef $vgpr1, implicit $exec      ; GCN-NEXT: v_add_nc_u32_e32 v2, v1, v3 /*v259*/      $vgpr2 = V_ADD_U32_e32 undef $vgpr1, undef $vgpr259, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 1 +    ; GCN-NEXT: s_set_vgpr_msb 0x401      ; GCN-NEXT: v_mov_b32_e32 v0, v0 /*v256*/      ; GCN-NEXT: v_add_nc_u32_e32 v1, v1 /*v257*/, v1 -    ; GCN-NEXT: s_set_vgpr_msb 5 +    ; GCN-NEXT: s_set_vgpr_msb 0x105      ; GCN-NEXT: v_add_nc_u32_e32 v2, v2 /*v258*/, v2 /*v258*/      $vgpr0 = V_MOV_B32_e32 undef $vgpr256, implicit $exec      $vgpr1 = V_ADD_U32_e32 undef $vgpr257, undef $vgpr1, implicit $exec @@ -478,16 +479,18 @@ body:             |      ; ASM: .LBB{{.*_1}}:      ; GCN-NEXT: s_set_vgpr_msb 64      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      $vgpr256 = V_MOV_B32_e32 undef $vgpr1, implicit $exec -    ; No mode switch on fall through +    ; Reset on fallthrough block end    bb.2:      ; ASM-NEXT: %bb.2: -    ; GCN-NEXT: s_nop 0 -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 64 +    ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; GCN-NEXT: s_branch -    S_NOP 0 +    $vgpr256 = V_MOV_B32_e32 undef $vgpr1, implicit $exec      S_BRANCH %bb.3      ; Reset mode on terminator @@ -496,7 +499,7 @@ body:             |      ; ASM: .LBB{{.*_3}}:      ; GCN-NEXT: s_set_vgpr_msb 64      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1 -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; GCN-NEXT: s_swap_pc_i64      $vgpr256 = V_MOV_B32_e32 undef $vgpr1, implicit $exec      $exec = S_SWAPPC_B64 undef $sgpr0_sgpr1 @@ -518,7 +521,7 @@ body:             |      ; GCN-NEXT: v_mov_b32_e32 v0, v1      ; GCN-NEXT: s_set_vgpr_msb 64      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1 -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; GCN-NEXT: s_set_pc_i64      $vgpr0 = V_MOV_B32_e32 undef $vgpr1, implicit $exec      $vgpr256 = V_MOV_B32_e32 undef $vgpr1, implicit $exec @@ -538,7 +541,7 @@ body:             |      ; ASM-NEXT: %bb.7:      ; GCN-NEXT: s_set_vgpr_msb 64      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1 -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; ASM-NEXT: ; return to shader part epilog      $vgpr256 = V_MOV_B32_e32 undef $vgpr1, implicit $exec      SI_RETURN_TO_EPILOG undef $vgpr0, implicit-def $exec @@ -556,7 +559,7 @@ body:             |      ; ASM-NEXT: %bb.9:      ; GCN-NEXT: s_set_vgpr_msb 64      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1 -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; GCN-NEXT: s_set_pc_i64      $vgpr256 = V_MOV_B32_e32 undef $vgpr1, implicit $exec      S_SETPC_B64_return undef $sgpr0_sgpr1, implicit-def $exec @@ -574,13 +577,14 @@ body:             |      ; ASM: %bb.0:      ; GCN-NEXT: s_set_vgpr_msb 64      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      $vgpr256 = V_MOV_B32_e32 undef $vgpr0, implicit $exec    bb.1:      ; ASM: .LBB{{[0-9]+}}_1:      ; GCN-NEXT: s_set_vgpr_msb 64      ; GCN-NEXT: v_mov_b32_e32 v1 /*v257*/, v1 -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; GCN-NEXT: s_cbranch_scc0      $vgpr257 = V_MOV_B32_e32 undef $vgpr1, implicit $exec      S_CBRANCH_SCC0 %bb.1, undef implicit $scc @@ -604,7 +608,7 @@ body:             |      ; ASM: %bb.0:      ; GCN-NEXT: s_set_vgpr_msb 64      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1 -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; ASM:      def v0      ; GCN-NOT:  s_set_vgpr_msb      ; ASM:      use v0 @@ -638,7 +642,7 @@ body:             |      ; GCN-NEXT: s_set_vgpr_msb 64      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1      ; GCN-NEXT: s_nop 0 -    ; GCN-NEXT: s_set_vgpr_msb 1 +    ; GCN-NEXT: s_set_vgpr_msb 0x4001      ; GCN-NEXT: v_mov_b32_e32 v1, v0 /*v256*/      BUNDLE implicit-def $vgpr256 {        $vgpr256 = V_MOV_B32_e32 undef $vgpr1, implicit $exec @@ -680,7 +684,7 @@ body:             |      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1      ; GCN-NEXT: v_mov_b32_e32 v1 /*v257*/, v1 -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; GCN-NEXT: v_mov_b32_e32 v2, v1      ; GCN-NEXT: v_mov_b32_e32 v3, v1      BUNDLE implicit-def $vgpr256, implicit-def $vgpr257, implicit-def $vgpr2, implicit-def $vgpr3, implicit undef $vgpr1 { @@ -709,7 +713,7 @@ body:             |      ; GCN-NEXT: s_clause 0x3e      ; GCN-NEXT: v_mov_b32_e32 v0 /*v256*/, v1 -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x4000      ; GCN-NEXT: v_mov_b32_e32 v1, v1      ; GCN-NEXT: v_mov_b32_e32 v2, v1      ; GCN-COUNT-60: v_mov_b32_e32 v1, v1 @@ -823,7 +827,7 @@ body:             |      ; GCN-NEXT: v_wmma_scale_f32_16x16x128_f8f6f4 v[210:217], v[244:259] /*v[500:515]*/, v[244:259] /*v[500:515]*/, v[10:17], v1, v2      $vgpr210_vgpr211_vgpr212_vgpr213_vgpr214_vgpr215_vgpr216_vgpr217 = V_WMMA_SCALE_F32_16X16X128_F8F6F4_f8_f8_w32_threeaddr undef $vgpr500_vgpr501_vgpr502_vgpr503_vgpr504_vgpr505_vgpr506_vgpr507_vgpr508_vgpr509_vgpr510_vgpr511_vgpr512_vgpr513_vgpr514_vgpr515, undef $vgpr500_vgpr501_vgpr502_vgpr503_vgpr504_vgpr505_vgpr506_vgpr507_vgpr508_vgpr509_vgpr510_vgpr511_vgpr512_vgpr513_vgpr514_vgpr515, 0, undef $vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15_vgpr16_vgpr17, undef $vgpr1, undef $vgpr2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x500      ; GCN-NEXT: v_wmma_scale_f32_16x16x128_f8f6f4 v[210:217], v[100:115], v[100:115], v[10:17], v1, v2      $vgpr210_vgpr211_vgpr212_vgpr213_vgpr214_vgpr215_vgpr216_vgpr217 = V_WMMA_SCALE_F32_16X16X128_F8F6F4_f8_f8_w32_threeaddr undef $vgpr100_vgpr101_vgpr102_vgpr103_vgpr104_vgpr105_vgpr106_vgpr107_vgpr108_vgpr109_vgpr110_vgpr111_vgpr112_vgpr113_vgpr114_vgpr115, undef $vgpr100_vgpr101_vgpr102_vgpr103_vgpr104_vgpr105_vgpr106_vgpr107_vgpr108_vgpr109_vgpr110_vgpr111_vgpr112_vgpr113_vgpr114_vgpr115, 0, undef $vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15_vgpr16_vgpr17, undef $vgpr1, undef $vgpr2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, implicit $exec @@ -835,11 +839,11 @@ body:             |      ; GCN-NEXT: v_wmma_ld_scale16_paired_b64 v[0:1], v[2:3]      V_WMMA_LD_SCALE16_PAIRED_B64 undef $vgpr0_vgpr1, undef $vgpr2_vgpr3, 0, 0, 0, 0, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 5 +    ; GCN-NEXT: s_set_vgpr_msb 0x105      ; GCN-NEXT: v_wmma_scale16_f32_16x16x128_f8f6f4 v[210:217], v[244:259] /*v[500:515]*/, v[244:259] /*v[500:515]*/, v[10:17], v[0:1], v[2:3]      $vgpr210_vgpr211_vgpr212_vgpr213_vgpr214_vgpr215_vgpr216_vgpr217 = V_WMMA_SCALE16_F32_16X16X128_F8F6F4_f8_f8_w32_threeaddr undef $vgpr500_vgpr501_vgpr502_vgpr503_vgpr504_vgpr505_vgpr506_vgpr507_vgpr508_vgpr509_vgpr510_vgpr511_vgpr512_vgpr513_vgpr514_vgpr515, undef $vgpr500_vgpr501_vgpr502_vgpr503_vgpr504_vgpr505_vgpr506_vgpr507_vgpr508_vgpr509_vgpr510_vgpr511_vgpr512_vgpr513_vgpr514_vgpr515, 0, undef $vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15_vgpr16_vgpr17, undef $vgpr0_vgpr1, undef $vgpr2_vgpr3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, implicit $exec -    ; GCN-NEXT: s_set_vgpr_msb 0 +    ; GCN-NEXT: s_set_vgpr_msb 0x500      ; GCN-NEXT: v_wmma_scale16_f32_16x16x128_f8f6f4 v[210:217], v[100:115], v[100:115], v[10:17], v[0:1], v[2:3]      $vgpr210_vgpr211_vgpr212_vgpr213_vgpr214_vgpr215_vgpr216_vgpr217 = V_WMMA_SCALE16_F32_16X16X128_F8F6F4_f8_f8_w32_threeaddr undef $vgpr100_vgpr101_vgpr102_vgpr103_vgpr104_vgpr105_vgpr106_vgpr107_vgpr108_vgpr109_vgpr110_vgpr111_vgpr112_vgpr113_vgpr114_vgpr115, undef $vgpr100_vgpr101_vgpr102_vgpr103_vgpr104_vgpr105_vgpr106_vgpr107_vgpr108_vgpr109_vgpr110_vgpr111_vgpr112_vgpr113_vgpr114_vgpr115, 0, undef $vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15_vgpr16_vgpr17, undef $vgpr0_vgpr1, undef $vgpr2_vgpr3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, implicit $exec diff --git a/llvm/test/CodeGen/AMDGPU/wait-xcnt.mir b/llvm/test/CodeGen/AMDGPU/wait-xcnt.mir index 1b8e126..a1381ec 100644 --- a/llvm/test/CodeGen/AMDGPU/wait-xcnt.mir +++ b/llvm/test/CodeGen/AMDGPU/wait-xcnt.mir @@ -945,7 +945,6 @@ body: |      $vgpr0 = V_MOV_B32_e32 0, implicit $exec  ... -# FIXME: Missing S_WAIT_XCNT before overwriting vgpr0.  ---  name: wait_kmcnt_with_outstanding_vmem_2  tracksRegLiveness: true @@ -971,6 +970,7 @@ body: |    ; GCN-NEXT: {{  $}}    ; GCN-NEXT:   S_WAIT_KMCNT 0    ; GCN-NEXT:   $sgpr2 = S_MOV_B32 $sgpr2 +  ; GCN-NEXT:   S_WAIT_XCNT 0    ; GCN-NEXT:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec    bb.0:      liveins: $vgpr0_vgpr1, $sgpr0_sgpr1, $scc @@ -986,6 +986,180 @@ body: |  ...  --- +name: wait_kmcnt_and_wait_loadcnt +tracksRegLiveness: true +machineFunctionInfo: +  isEntryFunction: true +body: | +  ; GCN-LABEL: name: wait_kmcnt_and_wait_loadcnt +  ; GCN: bb.0: +  ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000) +  ; GCN-NEXT:   liveins: $vgpr0_vgpr1, $sgpr0_sgpr1, $scc +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +  ; GCN-NEXT:   S_CBRANCH_SCC1 %bb.2, implicit $scc +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT: bb.1: +  ; GCN-NEXT:   successors: %bb.2(0x80000000) +  ; GCN-NEXT:   liveins: $vgpr0_vgpr1, $sgpr2 +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   $vgpr2 = GLOBAL_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT: bb.2: +  ; GCN-NEXT:   liveins: $sgpr2 +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   S_WAIT_KMCNT 0 +  ; GCN-NEXT:   $sgpr2 = S_MOV_B32 $sgpr2 +  ; GCN-NEXT:   S_WAIT_LOADCNT 0 +  ; GCN-NEXT:   $vgpr2 = V_MOV_B32_e32 0, implicit $exec +  bb.0: +    liveins: $vgpr0_vgpr1, $sgpr0_sgpr1, $scc +    $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +    S_CBRANCH_SCC1 %bb.2, implicit $scc +  bb.1: +    liveins: $vgpr0_vgpr1, $sgpr2 +    $vgpr2 = GLOBAL_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec +  bb.2: +    liveins: $sgpr2 +    $sgpr2 = S_MOV_B32 $sgpr2 +    $vgpr2 = V_MOV_B32_e32 0, implicit $exec +... + +--- +name: implicit_handling_of_pending_vmem_group +tracksRegLiveness: true +machineFunctionInfo: +  isEntryFunction: true +body: | +  ; GCN-LABEL: name: implicit_handling_of_pending_vmem_group +  ; GCN: bb.0: +  ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000) +  ; GCN-NEXT:   liveins: $vgpr0_vgpr1, $sgpr0_sgpr1, $scc +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +  ; GCN-NEXT:   S_CBRANCH_SCC1 %bb.2, implicit $scc +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT: bb.1: +  ; GCN-NEXT:   successors: %bb.2(0x80000000) +  ; GCN-NEXT:   liveins: $vgpr0_vgpr1, $sgpr2 +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   $vgpr2 = GLOBAL_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT: bb.2: +  ; GCN-NEXT:   liveins: $sgpr0_sgpr1, $sgpr2 +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   S_WAIT_KMCNT 0 +  ; GCN-NEXT:   $sgpr2 = S_MOV_B32 $sgpr2 +  ; GCN-NEXT:   $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +  ; GCN-NEXT:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec +  ; GCN-NEXT:   S_WAIT_XCNT 0 +  ; GCN-NEXT:   $sgpr0 = S_MOV_B32 $sgpr0 +  bb.0: +    liveins: $vgpr0_vgpr1, $sgpr0_sgpr1, $scc +    $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +    S_CBRANCH_SCC1 %bb.2, implicit $scc +  bb.1: +    liveins: $vgpr0_vgpr1, $sgpr2 +    $vgpr2 = GLOBAL_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec +  bb.2: +    liveins: $sgpr0_sgpr1, $sgpr2 +    $sgpr2 = S_MOV_B32 $sgpr2 +    $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +    $vgpr0 = V_MOV_B32_e32 0, implicit $exec +    $sgpr0 = S_MOV_B32 $sgpr0 +... + +--- +name: pending_vmem_event_between_block +tracksRegLiveness: true +machineFunctionInfo: +  isEntryFunction: true +body: | +  ; GCN-LABEL: name: pending_vmem_event_between_block +  ; GCN: bb.0: +  ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000) +  ; GCN-NEXT:   liveins: $vgpr0_vgpr1, $sgpr0_sgpr1, $scc +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +  ; GCN-NEXT:   S_CBRANCH_SCC1 %bb.2, implicit $scc +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT: bb.1: +  ; GCN-NEXT:   successors: %bb.2(0x80000000) +  ; GCN-NEXT:   liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $sgpr2 +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   $vgpr4 = GLOBAL_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec +  ; GCN-NEXT:   $vgpr5 = GLOBAL_LOAD_DWORD $vgpr2_vgpr3, 0, 0, implicit $exec +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT: bb.2: +  ; GCN-NEXT:   liveins: $sgpr0_sgpr1, $sgpr2, $vgpr2 +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   S_WAIT_KMCNT 0 +  ; GCN-NEXT:   $sgpr2 = S_MOV_B32 $sgpr2 +  ; GCN-NEXT:   S_WAIT_XCNT 1 +  ; GCN-NEXT:   $vgpr1 = V_MOV_B32_e32 0, implicit $exec +  ; GCN-NEXT:   S_WAIT_XCNT 0 +  ; GCN-NEXT:   $vgpr2 = V_MOV_B32_e32 0, implicit $exec +  ; GCN-NEXT:   $sgpr0 = S_MOV_B32 $sgpr0 +  bb.0: +    liveins: $vgpr0_vgpr1, $sgpr0_sgpr1, $scc +    $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +    S_CBRANCH_SCC1 %bb.2, implicit $scc +  bb.1: +    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $sgpr2 +    $vgpr4 = GLOBAL_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec +    $vgpr5 = GLOBAL_LOAD_DWORD $vgpr2_vgpr3, 0, 0, implicit $exec +  bb.2: +    liveins: $sgpr0_sgpr1, $sgpr2, $vgpr2 +    $sgpr2 = S_MOV_B32 $sgpr2 +    $vgpr1 = V_MOV_B32_e32 0, implicit $exec +    $vgpr2 = V_MOV_B32_e32 0, implicit $exec +    $sgpr0 = S_MOV_B32 $sgpr0 +... + +--- +name: flushing_vmem_cnt_on_block_entry +tracksRegLiveness: true +machineFunctionInfo: +  isEntryFunction: true +body: | +  ; GCN-LABEL: name: flushing_vmem_cnt_on_block_entry +  ; GCN: bb.0: +  ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000) +  ; GCN-NEXT:   liveins: $vgpr0_vgpr1, $sgpr0_sgpr1, $scc +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +  ; GCN-NEXT:   S_CBRANCH_SCC1 %bb.2, implicit $scc +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT: bb.1: +  ; GCN-NEXT:   successors: %bb.2(0x80000000) +  ; GCN-NEXT:   liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $sgpr2 +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   $vgpr4 = GLOBAL_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec +  ; GCN-NEXT:   $vgpr5 = GLOBAL_LOAD_DWORD $vgpr2_vgpr3, 0, 0, implicit $exec +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT: bb.2: +  ; GCN-NEXT:   liveins: $sgpr0_sgpr1, $sgpr2, $vgpr2 +  ; GCN-NEXT: {{  $}} +  ; GCN-NEXT:   S_WAIT_XCNT 0 +  ; GCN-NEXT:   $vgpr1 = V_MOV_B32_e32 0, implicit $exec +  ; GCN-NEXT:   $vgpr2 = V_MOV_B32_e32 0, implicit $exec +  ; GCN-NEXT:   $sgpr0 = S_MOV_B32 $sgpr0 +  bb.0: +    liveins: $vgpr0_vgpr1, $sgpr0_sgpr1, $scc +    $sgpr2 = S_LOAD_DWORD_IMM $sgpr0_sgpr1, 0, 0 +    S_CBRANCH_SCC1 %bb.2, implicit $scc +  bb.1: +    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $sgpr2 +    $vgpr4 = GLOBAL_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec +    $vgpr5 = GLOBAL_LOAD_DWORD $vgpr2_vgpr3, 0, 0, implicit $exec +  bb.2: +    liveins: $sgpr0_sgpr1, $sgpr2, $vgpr2 +    $vgpr1 = V_MOV_B32_e32 0, implicit $exec +    $vgpr2 = V_MOV_B32_e32 0, implicit $exec +    $sgpr0 = S_MOV_B32 $sgpr0 +... + +---  name: wait_loadcnt_with_outstanding_smem  tracksRegLiveness: true  machineFunctionInfo: diff --git a/llvm/test/CodeGen/AMDGPU/whole-wave-functions.ll b/llvm/test/CodeGen/AMDGPU/whole-wave-functions.ll index a42c8ac7..7581710 100644 --- a/llvm/test/CodeGen/AMDGPU/whole-wave-functions.ll +++ b/llvm/test/CodeGen/AMDGPU/whole-wave-functions.ll @@ -3182,7 +3182,7 @@ define amdgpu_gfx_whole_wave <2 x half> @call_gfx_from_whole_wave(i1 %active, <2  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v253 /*v509*/, s33 offset:1592  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v254 /*v510*/, s33 offset:1596  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v255 /*v511*/, s33 offset:1600 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 8 ; msbs: dst=0 src0=0 src1=2 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x408 ; msbs: dst=0 src0=0 src1=2 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v0 /*v512*/, s33 offset:1604  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v1 /*v513*/, s33 offset:1608  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v2 /*v514*/, s33 offset:1612 @@ -3443,7 +3443,7 @@ define amdgpu_gfx_whole_wave <2 x half> @call_gfx_from_whole_wave(i1 %active, <2  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v253 /*v765*/, s33 offset:2616  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v254 /*v766*/, s33 offset:2620  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v255 /*v767*/, s33 offset:2624 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 12 ; msbs: dst=0 src0=0 src1=3 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x80c ; msbs: dst=0 src0=0 src1=3 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v0 /*v768*/, s33 offset:2628  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v1 /*v769*/, s33 offset:2632  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v2 /*v770*/, s33 offset:2636 @@ -3706,7 +3706,7 @@ define amdgpu_gfx_whole_wave <2 x half> @call_gfx_from_whole_wave(i1 %active, <2  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v255 /*v1023*/, s33 offset:3648  ; GFX1250-DAGISEL-NEXT:    s_wait_xcnt 0x0  ; GFX1250-DAGISEL-NEXT:    s_mov_b32 exec_lo, -1 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0 ; msbs: dst=0 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0xc00 ; msbs: dst=0 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v40, s33 ; 4-byte Folded Spill  ; GFX1250-DAGISEL-NEXT:    s_wait_xcnt 0x0  ; GFX1250-DAGISEL-NEXT:    v_writelane_b32 v40, s0, 3 @@ -4135,7 +4135,7 @@ define amdgpu_gfx_whole_wave <2 x half> @call_gfx_from_whole_wave(i1 %active, <2  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v253 /*v509*/, off, s33 offset:1592  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v254 /*v510*/, off, s33 offset:1596  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v255 /*v511*/, off, s33 offset:1600 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x80 ; msbs: dst=2 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x4080 ; msbs: dst=2 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v0 /*v512*/, off, s33 offset:1604  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v1 /*v513*/, off, s33 offset:1608  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v2 /*v514*/, off, s33 offset:1612 @@ -4396,7 +4396,7 @@ define amdgpu_gfx_whole_wave <2 x half> @call_gfx_from_whole_wave(i1 %active, <2  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v253 /*v765*/, off, s33 offset:2616  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v254 /*v766*/, off, s33 offset:2620  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v255 /*v767*/, off, s33 offset:2624 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0xc0 ; msbs: dst=3 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x80c0 ; msbs: dst=3 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v0 /*v768*/, off, s33 offset:2628  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v1 /*v769*/, off, s33 offset:2632  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v2 /*v770*/, off, s33 offset:2636 @@ -4661,7 +4661,7 @@ define amdgpu_gfx_whole_wave <2 x half> @call_gfx_from_whole_wave(i1 %active, <2  ; GFX1250-DAGISEL-NEXT:    s_mov_b32 exec_lo, s4  ; GFX1250-DAGISEL-NEXT:    s_mov_b32 s33, s0  ; GFX1250-DAGISEL-NEXT:    s_wait_loadcnt 0x0 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0 ; msbs: dst=0 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0xc000 ; msbs: dst=0 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    s_set_pc_i64 s[30:31]    %ret = call amdgpu_gfx <2 x half>(<2 x half>, <2 x half>) @gfx_callee(<2 x half> %y, <2 x half> %x) convergent    ret <2 x half> %ret @@ -6346,7 +6346,7 @@ define amdgpu_gfx_whole_wave <2 x half> @tail_call_gfx_from_whole_wave(i1 %activ  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v253 /*v509*/, s32 offset:1588  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v254 /*v510*/, s32 offset:1592  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v255 /*v511*/, s32 offset:1596 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 8 ; msbs: dst=0 src0=0 src1=2 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x408 ; msbs: dst=0 src0=0 src1=2 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v0 /*v512*/, s32 offset:1600  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v1 /*v513*/, s32 offset:1604  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v2 /*v514*/, s32 offset:1608 @@ -6607,7 +6607,7 @@ define amdgpu_gfx_whole_wave <2 x half> @tail_call_gfx_from_whole_wave(i1 %activ  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v253 /*v765*/, s32 offset:2612  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v254 /*v766*/, s32 offset:2616  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v255 /*v767*/, s32 offset:2620 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 12 ; msbs: dst=0 src0=0 src1=3 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x80c ; msbs: dst=0 src0=0 src1=3 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v0 /*v768*/, s32 offset:2624  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v1 /*v769*/, s32 offset:2628  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v2 /*v770*/, s32 offset:2632 @@ -6872,7 +6872,7 @@ define amdgpu_gfx_whole_wave <2 x half> @tail_call_gfx_from_whole_wave(i1 %activ  ; GFX1250-DAGISEL-NEXT:    s_mov_b32 exec_lo, -1  ; GFX1250-DAGISEL-NEXT:    v_mov_b32_e32 v2, v0  ; GFX1250-DAGISEL-NEXT:    s_mov_b64 s[36:37], gfx_callee@abs64 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0 ; msbs: dst=0 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0xc00 ; msbs: dst=0 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    v_swap_b32 v0, v1  ; GFX1250-DAGISEL-NEXT:    s_xor_b32 exec_lo, s0, -1  ; GFX1250-DAGISEL-NEXT:    s_clause 0x3e @@ -7283,7 +7283,7 @@ define amdgpu_gfx_whole_wave <2 x half> @tail_call_gfx_from_whole_wave(i1 %activ  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v253 /*v509*/, off, s32 offset:1588  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v254 /*v510*/, off, s32 offset:1592  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v255 /*v511*/, off, s32 offset:1596 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x80 ; msbs: dst=2 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x4080 ; msbs: dst=2 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v0 /*v512*/, off, s32 offset:1600  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v1 /*v513*/, off, s32 offset:1604  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v2 /*v514*/, off, s32 offset:1608 @@ -7544,7 +7544,7 @@ define amdgpu_gfx_whole_wave <2 x half> @tail_call_gfx_from_whole_wave(i1 %activ  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v253 /*v765*/, off, s32 offset:2612  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v254 /*v766*/, off, s32 offset:2616  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v255 /*v767*/, off, s32 offset:2620 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0xc0 ; msbs: dst=3 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x80c0 ; msbs: dst=3 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v0 /*v768*/, off, s32 offset:2624  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v1 /*v769*/, off, s32 offset:2628  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v2 /*v770*/, off, s32 offset:2632 @@ -7807,7 +7807,7 @@ define amdgpu_gfx_whole_wave <2 x half> @tail_call_gfx_from_whole_wave(i1 %activ  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v255 /*v1023*/, off, s32 offset:3644  ; GFX1250-DAGISEL-NEXT:    s_wait_xcnt 0x0  ; GFX1250-DAGISEL-NEXT:    s_mov_b32 exec_lo, s0 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0 ; msbs: dst=0 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0xc000 ; msbs: dst=0 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    s_set_pc_i64 s[36:37]    %ret = tail call amdgpu_gfx <2 x half>(<2 x half>, <2 x half>) @gfx_callee(<2 x half> %y, <2 x half> %x) convergent    ret <2 x half> %ret @@ -9657,7 +9657,7 @@ define amdgpu_gfx_whole_wave void @call_from_whole_wave(i1 %unused, <8 x float>  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v253 /*v509*/, s33 offset:1600  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v254 /*v510*/, s33 offset:1604  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v255 /*v511*/, s33 offset:1608 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 8 ; msbs: dst=0 src0=0 src1=2 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x408 ; msbs: dst=0 src0=0 src1=2 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v0 /*v512*/, s33 offset:1612  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v1 /*v513*/, s33 offset:1616  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v2 /*v514*/, s33 offset:1620 @@ -9918,7 +9918,7 @@ define amdgpu_gfx_whole_wave void @call_from_whole_wave(i1 %unused, <8 x float>  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v253 /*v765*/, s33 offset:2624  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v254 /*v766*/, s33 offset:2628  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v255 /*v767*/, s33 offset:2632 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 12 ; msbs: dst=0 src0=0 src1=3 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x80c ; msbs: dst=0 src0=0 src1=3 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v0 /*v768*/, s33 offset:2636  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v1 /*v769*/, s33 offset:2640  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v2 /*v770*/, s33 offset:2644 @@ -10181,7 +10181,7 @@ define amdgpu_gfx_whole_wave void @call_from_whole_wave(i1 %unused, <8 x float>  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v255 /*v1023*/, s33 offset:3656  ; GFX1250-DAGISEL-NEXT:    s_wait_xcnt 0x0  ; GFX1250-DAGISEL-NEXT:    s_mov_b32 exec_lo, -1 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0 ; msbs: dst=0 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0xc00 ; msbs: dst=0 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    s_clause 0x2  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v42, s33  ; GFX1250-DAGISEL-NEXT:    scratch_store_b32 off, v40, s33 offset:164 @@ -10616,7 +10616,7 @@ define amdgpu_gfx_whole_wave void @call_from_whole_wave(i1 %unused, <8 x float>  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v253 /*v509*/, off, s33 offset:1600  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v254 /*v510*/, off, s33 offset:1604  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v255 /*v511*/, off, s33 offset:1608 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x80 ; msbs: dst=2 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x4080 ; msbs: dst=2 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v0 /*v512*/, off, s33 offset:1612  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v1 /*v513*/, off, s33 offset:1616  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v2 /*v514*/, off, s33 offset:1620 @@ -10877,7 +10877,7 @@ define amdgpu_gfx_whole_wave void @call_from_whole_wave(i1 %unused, <8 x float>  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v253 /*v765*/, off, s33 offset:2624  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v254 /*v766*/, off, s33 offset:2628  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v255 /*v767*/, off, s33 offset:2632 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0xc0 ; msbs: dst=3 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0x80c0 ; msbs: dst=3 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v0 /*v768*/, off, s33 offset:2636  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v1 /*v769*/, off, s33 offset:2640  ; GFX1250-DAGISEL-NEXT:    scratch_load_b32 v2 /*v770*/, off, s33 offset:2644 @@ -11142,7 +11142,7 @@ define amdgpu_gfx_whole_wave void @call_from_whole_wave(i1 %unused, <8 x float>  ; GFX1250-DAGISEL-NEXT:    s_mov_b32 exec_lo, s4  ; GFX1250-DAGISEL-NEXT:    s_mov_b32 s33, s0  ; GFX1250-DAGISEL-NEXT:    s_wait_loadcnt_dscnt 0x0 -; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0 ; msbs: dst=0 src0=0 src1=0 src2=0 +; GFX1250-DAGISEL-NEXT:    s_set_vgpr_msb 0xc000 ; msbs: dst=0 src0=0 src1=0 src2=0  ; GFX1250-DAGISEL-NEXT:    s_set_pc_i64 s[30:31]    %ret = call float(ptr, ...) @llvm.amdgcn.call.whole.wave(ptr @callee, <8 x float> %x) convergent    store float %ret, ptr %p diff --git a/llvm/test/CodeGen/BPF/bpf_trap.ll b/llvm/test/CodeGen/BPF/bpf_trap.ll new file mode 100644 index 0000000..ab8df5f --- /dev/null +++ b/llvm/test/CodeGen/BPF/bpf_trap.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s | FileCheck %s +; +target triple = "bpf" + +define i32 @test(i8 %x) { +entry: +  %0 = and i8 %x, 3 +  switch i8 %0, label %default.unreachable4 [ +    i8 0, label %return +    i8 1, label %sw.bb1 +    i8 2, label %sw.bb2 +    i8 3, label %sw.bb3 +  ] + +sw.bb1:                                           ; preds = %entry +  br label %return + +sw.bb2:                                           ; preds = %entry +  br label %return + +sw.bb3:                                           ; preds = %entry +  br label %return + +default.unreachable4:                             ; preds = %entry +  unreachable + +return:                                           ; preds = %entry, %sw.bb3, %sw.bb2, %sw.bb1 +  %retval.0 = phi i32 [ 12, %sw.bb1 ], [ 43, %sw.bb2 ], [ 54, %sw.bb3 ], [ 32, %entry ] +  ret i32 %retval.0 +} + +; CHECK-NOT: __bpf_trap diff --git a/llvm/test/CodeGen/Hexagon/isel-fclass.ll b/llvm/test/CodeGen/Hexagon/isel-fclass.ll new file mode 100644 index 0000000..96b0210 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/isel-fclass.ll @@ -0,0 +1,86 @@ +; Tests lowering of sfclass/dfclass compares. +; Sub-optimal code +;         { +;                p0 = sfclass(r0,#16) +;                r0 = sfadd(r0,r0) +;        } +;        { +;                r2 = p0 +;        } +;        { +;                if (p0.new) r0 = ##1065353216 +;                p0 = cmp.eq(r2,#0) +;                jumpr r31 +;        } +; With the patterns added, we should be generating +;        { +;                p0 = sfclass(r0,#16) +;                r0 = sfadd(r0,r0) +;        } +;        { +;                if (!p0) r0 = ##1065353216 +;                jumpr r31 +;        } + +; RUN: llc -march=hexagon -stop-after=hexagon-isel %s -o - | FileCheck %s + +; CHECK: bb.0.entry1 +; CHECK: F2_sfclass +; CHECK-NOT: C2_cmp +; CHECK: C2_not +; CHECK: F2_sfadd +; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) +define float @test1(float noundef %x) { +entry1: +  %0 = tail call i32 @llvm.hexagon.F2.sfclass(float %x, i32 16) +  %tobool.not = icmp eq i32 %0, 0 +  %add = fadd float %x, %x +  %spec.select = select i1 %tobool.not, float 1.000000e+00, float %add +  ret float %spec.select +} + +; CHECK: bb.0.entry2 +; CHECK: F2_sfclass +; CHECK-NOT: C2_cmp +; CHECK: F2_sfadd +define float @test2(float noundef %x) { +entry2: +  %0 = tail call i32 @llvm.hexagon.F2.sfclass(float %x, i32 16) +  %tobool.not = icmp eq i32 %0, 0 +  %add = fadd float %x, %x +  %spec.select = select i1 %tobool.not, float %add, float 1.000000e+00 +  ret float %spec.select +} + +; CHECK: bb.0.entry3 +; CHECK: F2_dfclass +; CHECK-NOT: C2_cmp +; CHECK: C2_not +; CHECK: F2_dfadd +define double @test3(double noundef %x) { +entry3: +  %0 = tail call i32 @llvm.hexagon.F2.dfclass(double %x, i32 16) +  %tobool.not = icmp eq i32 %0, 0 +  %add = fadd double %x, %x +  %spec.select = select i1 %tobool.not, double 1.000000e+00, double %add +  ret double %spec.select +} + +; CHECK: bb.0.entry4 +; CHECK: F2_dfclass +; CHECK-NOT: C2_cmp +; CHECK: F2_dfadd +define double @test4(double noundef %x) { +entry4: +  %0 = tail call i32 @llvm.hexagon.F2.dfclass(double %x, i32 16) +  %tobool.not = icmp eq i32 %0, 0 +  %add = fadd double %x, %x +  %spec.select = select i1 %tobool.not, double %add, double 1.000000e+00 +  ret double %spec.select +} + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare i32 @llvm.hexagon.F2.dfclass(double, i32 immarg) + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare i32 @llvm.hexagon.F2.sfclass(float, i32 immarg) diff --git a/llvm/test/CodeGen/LoongArch/lasx/ctpop-ctlz.ll b/llvm/test/CodeGen/LoongArch/lasx/ctpop-ctlz.ll index ba2118f..b3155c9 100644 --- a/llvm/test/CodeGen/LoongArch/lasx/ctpop-ctlz.ll +++ b/llvm/test/CodeGen/LoongArch/lasx/ctpop-ctlz.ll @@ -106,6 +106,69 @@ define void @ctlz_v4i64(ptr %src, ptr %dst) nounwind {    ret void  } +define void @not_ctlz_v32i8(ptr %src, ptr %dst) nounwind { +; CHECK-LABEL: not_ctlz_v32i8: +; CHECK:       # %bb.0: +; CHECK-NEXT:    xvld $xr0, $a0, 0 +; CHECK-NEXT:    xvxori.b $xr0, $xr0, 255 +; CHECK-NEXT:    xvclz.b $xr0, $xr0 +; CHECK-NEXT:    xvst $xr0, $a1, 0 +; CHECK-NEXT:    ret +  %v = load <32 x i8>, ptr %src +  %neg = xor <32 x i8> %v, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> +  %res = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %neg, i1 false) +  store <32 x i8> %res, ptr %dst +  ret void +} + +define void @not_ctlz_v16i16(ptr %src, ptr %dst) nounwind { +; CHECK-LABEL: not_ctlz_v16i16: +; CHECK:       # %bb.0: +; CHECK-NEXT:    xvld $xr0, $a0, 0 +; CHECK-NEXT:    xvrepli.b $xr1, -1 +; CHECK-NEXT:    xvxor.v $xr0, $xr0, $xr1 +; CHECK-NEXT:    xvclz.h $xr0, $xr0 +; CHECK-NEXT:    xvst $xr0, $a1, 0 +; CHECK-NEXT:    ret +  %v = load <16 x i16>, ptr %src +  %neg = xor <16 x i16> %v, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> +  %res = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %neg, i1 false) +  store <16 x i16> %res, ptr %dst +  ret void +} + +define void @not_ctlz_v8i32(ptr %src, ptr %dst) nounwind { +; CHECK-LABEL: not_ctlz_v8i32: +; CHECK:       # %bb.0: +; CHECK-NEXT:    xvld $xr0, $a0, 0 +; CHECK-NEXT:    xvrepli.b $xr1, -1 +; CHECK-NEXT:    xvxor.v $xr0, $xr0, $xr1 +; CHECK-NEXT:    xvclz.w $xr0, $xr0 +; CHECK-NEXT:    xvst $xr0, $a1, 0 +; CHECK-NEXT:    ret +  %v = load <8 x i32>, ptr %src +  %neg = xor <8 x i32> %v, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> +  %res = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %neg, i1 false) +  store <8 x i32> %res, ptr %dst +  ret void +} + +define void @not_ctlz_v4i64(ptr %src, ptr %dst) nounwind { +; CHECK-LABEL: not_ctlz_v4i64: +; CHECK:       # %bb.0: +; CHECK-NEXT:    xvld $xr0, $a0, 0 +; CHECK-NEXT:    xvrepli.b $xr1, -1 +; CHECK-NEXT:    xvxor.v $xr0, $xr0, $xr1 +; CHECK-NEXT:    xvclz.d $xr0, $xr0 +; CHECK-NEXT:    xvst $xr0, $a1, 0 +; CHECK-NEXT:    ret +  %v = load <4 x i64>, ptr %src +  %neg = xor <4 x i64> %v, <i64 -1, i64 -1, i64 -1, i64 -1> +  %res = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %neg, i1 false) +  store <4 x i64> %res, ptr %dst +  ret void +} +  declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>)  declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>)  declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>) diff --git a/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll b/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll index 48ec98c..8e08e1e 100644 --- a/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll +++ b/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll @@ -5,40 +5,10 @@  define void @minnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: minnum_v8f32:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    xvld $xr0, $a2, 0 -; CHECK-NEXT:    xvld $xr1, $a1, 0 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 5 -; CHECK-NEXT:    xvpickve.w $xr3, $xr1, 5 -; CHECK-NEXT:    fmin.s $fa2, $fa3, $fa2 -; CHECK-NEXT:    xvpickve.w $xr3, $xr0, 4 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 4 -; CHECK-NEXT:    fmin.s $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 16 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 6 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 6 -; CHECK-NEXT:    fmin.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 32 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 7 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 7 -; CHECK-NEXT:    fmin.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 48 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 1 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 1 -; CHECK-NEXT:    fmin.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    xvpickve.w $xr4, $xr0, 0 -; CHECK-NEXT:    xvpickve.w $xr5, $xr1, 0 -; CHECK-NEXT:    fmin.s $fa4, $fa5, $fa4 -; CHECK-NEXT:    vextrins.w $vr4, $vr2, 16 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 2 -; CHECK-NEXT:    xvpickve.w $xr5, $xr1, 2 -; CHECK-NEXT:    fmin.s $fa2, $fa5, $fa2 -; CHECK-NEXT:    vextrins.w $vr4, $vr2, 32 -; CHECK-NEXT:    xvpickve.w $xr0, $xr0, 3 -; CHECK-NEXT:    xvpickve.w $xr1, $xr1, 3 -; CHECK-NEXT:    fmin.s $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.w $vr4, $vr0, 48 -; CHECK-NEXT:    xvpermi.q $xr4, $xr3, 2 -; CHECK-NEXT:    xvst $xr4, $a0, 0 +; CHECK-NEXT:    xvld $xr0, $a1, 0 +; CHECK-NEXT:    xvld $xr1, $a2, 0 +; CHECK-NEXT:    xvfmin.s $xr0, $xr0, $xr1 +; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <8 x float>, ptr %x @@ -51,23 +21,9 @@ entry:  define void @minnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: minnum_v4f64:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    xvld $xr0, $a2, 0 -; CHECK-NEXT:    xvld $xr1, $a1, 0 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 3 -; CHECK-NEXT:    xvpickve.d $xr3, $xr1, 3 -; CHECK-NEXT:    fmin.d $fa2, $fa3, $fa2 -; CHECK-NEXT:    xvpickve.d $xr3, $xr0, 2 -; CHECK-NEXT:    xvpickve.d $xr4, $xr1, 2 -; CHECK-NEXT:    fmin.d $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.d $vr3, $vr2, 16 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 1 -; CHECK-NEXT:    xvpickve.d $xr4, $xr1, 1 -; CHECK-NEXT:    fmin.d $fa2, $fa4, $fa2 -; CHECK-NEXT:    xvpickve.d $xr0, $xr0, 0 -; CHECK-NEXT:    xvpickve.d $xr1, $xr1, 0 -; CHECK-NEXT:    fmin.d $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.d $vr0, $vr2, 16 -; CHECK-NEXT:    xvpermi.q $xr0, $xr3, 2 +; CHECK-NEXT:    xvld $xr0, $a1, 0 +; CHECK-NEXT:    xvld $xr1, $a2, 0 +; CHECK-NEXT:    xvfmin.d $xr0, $xr0, $xr1  ; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -81,40 +37,10 @@ entry:  define void @maxnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: maxnum_v8f32:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    xvld $xr0, $a2, 0 -; CHECK-NEXT:    xvld $xr1, $a1, 0 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 5 -; CHECK-NEXT:    xvpickve.w $xr3, $xr1, 5 -; CHECK-NEXT:    fmax.s $fa2, $fa3, $fa2 -; CHECK-NEXT:    xvpickve.w $xr3, $xr0, 4 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 4 -; CHECK-NEXT:    fmax.s $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 16 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 6 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 6 -; CHECK-NEXT:    fmax.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 32 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 7 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 7 -; CHECK-NEXT:    fmax.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 48 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 1 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 1 -; CHECK-NEXT:    fmax.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    xvpickve.w $xr4, $xr0, 0 -; CHECK-NEXT:    xvpickve.w $xr5, $xr1, 0 -; CHECK-NEXT:    fmax.s $fa4, $fa5, $fa4 -; CHECK-NEXT:    vextrins.w $vr4, $vr2, 16 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 2 -; CHECK-NEXT:    xvpickve.w $xr5, $xr1, 2 -; CHECK-NEXT:    fmax.s $fa2, $fa5, $fa2 -; CHECK-NEXT:    vextrins.w $vr4, $vr2, 32 -; CHECK-NEXT:    xvpickve.w $xr0, $xr0, 3 -; CHECK-NEXT:    xvpickve.w $xr1, $xr1, 3 -; CHECK-NEXT:    fmax.s $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.w $vr4, $vr0, 48 -; CHECK-NEXT:    xvpermi.q $xr4, $xr3, 2 -; CHECK-NEXT:    xvst $xr4, $a0, 0 +; CHECK-NEXT:    xvld $xr0, $a1, 0 +; CHECK-NEXT:    xvld $xr1, $a2, 0 +; CHECK-NEXT:    xvfmax.s $xr0, $xr0, $xr1 +; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <8 x float>, ptr %x @@ -127,23 +53,9 @@ entry:  define void @maxnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: maxnum_v4f64:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    xvld $xr0, $a2, 0 -; CHECK-NEXT:    xvld $xr1, $a1, 0 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 3 -; CHECK-NEXT:    xvpickve.d $xr3, $xr1, 3 -; CHECK-NEXT:    fmax.d $fa2, $fa3, $fa2 -; CHECK-NEXT:    xvpickve.d $xr3, $xr0, 2 -; CHECK-NEXT:    xvpickve.d $xr4, $xr1, 2 -; CHECK-NEXT:    fmax.d $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.d $vr3, $vr2, 16 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 1 -; CHECK-NEXT:    xvpickve.d $xr4, $xr1, 1 -; CHECK-NEXT:    fmax.d $fa2, $fa4, $fa2 -; CHECK-NEXT:    xvpickve.d $xr0, $xr0, 0 -; CHECK-NEXT:    xvpickve.d $xr1, $xr1, 0 -; CHECK-NEXT:    fmax.d $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.d $vr0, $vr2, 16 -; CHECK-NEXT:    xvpermi.q $xr0, $xr3, 2 +; CHECK-NEXT:    xvld $xr0, $a1, 0 +; CHECK-NEXT:    xvld $xr1, $a2, 0 +; CHECK-NEXT:    xvfmax.d $xr0, $xr0, $xr1  ; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry: diff --git a/llvm/test/CodeGen/LoongArch/lasx/fp-rounding.ll b/llvm/test/CodeGen/LoongArch/lasx/fp-rounding.ll index 79407c3..fa5f27e 100644 --- a/llvm/test/CodeGen/LoongArch/lasx/fp-rounding.ll +++ b/llvm/test/CodeGen/LoongArch/lasx/fp-rounding.ll @@ -7,38 +7,8 @@ define void @ceil_v8f32(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: ceil_v8f32:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    xvld $xr0, $a1, 0 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 5 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.s $vr1, $vr1 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 4 -; CHECK-NEXT:    vreplvei.w $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrp.s $vr2, $vr2 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 16 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 6 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 32 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 7 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 48 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 1 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.s $vr1, $vr1 -; CHECK-NEXT:    xvpickve.w $xr3, $xr0, 0 -; CHECK-NEXT:    vreplvei.w $vr3, $vr3, 0 -; CHECK-NEXT:    vfrintrp.s $vr3, $vr3 -; CHECK-NEXT:    vextrins.w $vr3, $vr1, 16 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 2 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr3, $vr1, 32 -; CHECK-NEXT:    xvpickve.w $xr0, $xr0, 3 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0 -; CHECK-NEXT:    vfrintrp.s $vr0, $vr0 -; CHECK-NEXT:    vextrins.w $vr3, $vr0, 48 -; CHECK-NEXT:    xvpermi.q $xr3, $xr2, 2 -; CHECK-NEXT:    xvst $xr3, $a0, 0 +; CHECK-NEXT:    xvfrintrp.s $xr0, $xr0 +; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <8 x float>, ptr %a0 @@ -52,21 +22,7 @@ define void @ceil_v4f64(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: ceil_v4f64:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    xvld $xr0, $a1, 0 -; CHECK-NEXT:    xvpickve.d $xr1, $xr0, 3 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.d $vr1, $vr1 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 2 -; CHECK-NEXT:    vreplvei.d $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrp.d $vr2, $vr2 -; CHECK-NEXT:    vextrins.d $vr2, $vr1, 16 -; CHECK-NEXT:    xvpickve.d $xr1, $xr0, 1 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.d $vr1, $vr1 -; CHECK-NEXT:    xvpickve.d $xr0, $xr0, 0 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vfrintrp.d $vr0, $vr0 -; CHECK-NEXT:    vextrins.d $vr0, $vr1, 16 -; CHECK-NEXT:    xvpermi.q $xr0, $xr2, 2 +; CHECK-NEXT:    xvfrintrp.d $xr0, $xr0  ; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -81,38 +37,8 @@ define void @floor_v8f32(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: floor_v8f32:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    xvld $xr0, $a1, 0 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 5 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.s $vr1, $vr1 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 4 -; CHECK-NEXT:    vreplvei.w $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrm.s $vr2, $vr2 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 16 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 6 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 32 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 7 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 48 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 1 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.s $vr1, $vr1 -; CHECK-NEXT:    xvpickve.w $xr3, $xr0, 0 -; CHECK-NEXT:    vreplvei.w $vr3, $vr3, 0 -; CHECK-NEXT:    vfrintrm.s $vr3, $vr3 -; CHECK-NEXT:    vextrins.w $vr3, $vr1, 16 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 2 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr3, $vr1, 32 -; CHECK-NEXT:    xvpickve.w $xr0, $xr0, 3 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0 -; CHECK-NEXT:    vfrintrm.s $vr0, $vr0 -; CHECK-NEXT:    vextrins.w $vr3, $vr0, 48 -; CHECK-NEXT:    xvpermi.q $xr3, $xr2, 2 -; CHECK-NEXT:    xvst $xr3, $a0, 0 +; CHECK-NEXT:    xvfrintrm.s $xr0, $xr0 +; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <8 x float>, ptr %a0 @@ -126,21 +52,7 @@ define void @floor_v4f64(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: floor_v4f64:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    xvld $xr0, $a1, 0 -; CHECK-NEXT:    xvpickve.d $xr1, $xr0, 3 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.d $vr1, $vr1 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 2 -; CHECK-NEXT:    vreplvei.d $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrm.d $vr2, $vr2 -; CHECK-NEXT:    vextrins.d $vr2, $vr1, 16 -; CHECK-NEXT:    xvpickve.d $xr1, $xr0, 1 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.d $vr1, $vr1 -; CHECK-NEXT:    xvpickve.d $xr0, $xr0, 0 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vfrintrm.d $vr0, $vr0 -; CHECK-NEXT:    vextrins.d $vr0, $vr1, 16 -; CHECK-NEXT:    xvpermi.q $xr0, $xr2, 2 +; CHECK-NEXT:    xvfrintrm.d $xr0, $xr0  ; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -155,38 +67,8 @@ define void @trunc_v8f32(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: trunc_v8f32:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    xvld $xr0, $a1, 0 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 5 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.s $vr1, $vr1 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 4 -; CHECK-NEXT:    vreplvei.w $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrz.s $vr2, $vr2 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 16 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 6 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 32 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 7 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 48 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 1 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.s $vr1, $vr1 -; CHECK-NEXT:    xvpickve.w $xr3, $xr0, 0 -; CHECK-NEXT:    vreplvei.w $vr3, $vr3, 0 -; CHECK-NEXT:    vfrintrz.s $vr3, $vr3 -; CHECK-NEXT:    vextrins.w $vr3, $vr1, 16 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 2 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr3, $vr1, 32 -; CHECK-NEXT:    xvpickve.w $xr0, $xr0, 3 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0 -; CHECK-NEXT:    vfrintrz.s $vr0, $vr0 -; CHECK-NEXT:    vextrins.w $vr3, $vr0, 48 -; CHECK-NEXT:    xvpermi.q $xr3, $xr2, 2 -; CHECK-NEXT:    xvst $xr3, $a0, 0 +; CHECK-NEXT:    xvfrintrz.s $xr0, $xr0 +; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <8 x float>, ptr %a0 @@ -200,21 +82,7 @@ define void @trunc_v4f64(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: trunc_v4f64:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    xvld $xr0, $a1, 0 -; CHECK-NEXT:    xvpickve.d $xr1, $xr0, 3 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.d $vr1, $vr1 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 2 -; CHECK-NEXT:    vreplvei.d $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrz.d $vr2, $vr2 -; CHECK-NEXT:    vextrins.d $vr2, $vr1, 16 -; CHECK-NEXT:    xvpickve.d $xr1, $xr0, 1 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.d $vr1, $vr1 -; CHECK-NEXT:    xvpickve.d $xr0, $xr0, 0 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vfrintrz.d $vr0, $vr0 -; CHECK-NEXT:    vextrins.d $vr0, $vr1, 16 -; CHECK-NEXT:    xvpermi.q $xr0, $xr2, 2 +; CHECK-NEXT:    xvfrintrz.d $xr0, $xr0  ; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -229,38 +97,8 @@ define void @roundeven_v8f32(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: roundeven_v8f32:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    xvld $xr0, $a1, 0 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 5 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.s $vr1, $vr1 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 4 -; CHECK-NEXT:    vreplvei.w $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrne.s $vr2, $vr2 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 16 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 6 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 32 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 7 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 48 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 1 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.s $vr1, $vr1 -; CHECK-NEXT:    xvpickve.w $xr3, $xr0, 0 -; CHECK-NEXT:    vreplvei.w $vr3, $vr3, 0 -; CHECK-NEXT:    vfrintrne.s $vr3, $vr3 -; CHECK-NEXT:    vextrins.w $vr3, $vr1, 16 -; CHECK-NEXT:    xvpickve.w $xr1, $xr0, 2 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr3, $vr1, 32 -; CHECK-NEXT:    xvpickve.w $xr0, $xr0, 3 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0 -; CHECK-NEXT:    vfrintrne.s $vr0, $vr0 -; CHECK-NEXT:    vextrins.w $vr3, $vr0, 48 -; CHECK-NEXT:    xvpermi.q $xr3, $xr2, 2 -; CHECK-NEXT:    xvst $xr3, $a0, 0 +; CHECK-NEXT:    xvfrintrne.s $xr0, $xr0 +; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <8 x float>, ptr %a0 @@ -274,21 +112,7 @@ define void @roundeven_v4f64(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: roundeven_v4f64:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    xvld $xr0, $a1, 0 -; CHECK-NEXT:    xvpickve.d $xr1, $xr0, 3 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.d $vr1, $vr1 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 2 -; CHECK-NEXT:    vreplvei.d $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrne.d $vr2, $vr2 -; CHECK-NEXT:    vextrins.d $vr2, $vr1, 16 -; CHECK-NEXT:    xvpickve.d $xr1, $xr0, 1 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.d $vr1, $vr1 -; CHECK-NEXT:    xvpickve.d $xr0, $xr0, 0 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vfrintrne.d $vr0, $vr0 -; CHECK-NEXT:    vextrins.d $vr0, $vr1, 16 -; CHECK-NEXT:    xvpermi.q $xr0, $xr2, 2 +; CHECK-NEXT:    xvfrintrne.d $xr0, $xr0  ; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry: diff --git a/llvm/test/CodeGen/LoongArch/lsx/ctpop-ctlz.ll b/llvm/test/CodeGen/LoongArch/lsx/ctpop-ctlz.ll index a9a38e8..6ac7d51 100644 --- a/llvm/test/CodeGen/LoongArch/lsx/ctpop-ctlz.ll +++ b/llvm/test/CodeGen/LoongArch/lsx/ctpop-ctlz.ll @@ -106,6 +106,69 @@ define void @ctlz_v2i64(ptr %src, ptr %dst) nounwind {    ret void  } +define void @not_ctlz_v16i8(ptr %src, ptr %dst) nounwind { +; CHECK-LABEL: not_ctlz_v16i8: +; CHECK:       # %bb.0: +; CHECK-NEXT:    vld $vr0, $a0, 0 +; CHECK-NEXT:    vxori.b $vr0, $vr0, 255 +; CHECK-NEXT:    vclz.b $vr0, $vr0 +; CHECK-NEXT:    vst $vr0, $a1, 0 +; CHECK-NEXT:    ret +  %v = load <16 x i8>, ptr %src +  %neg = xor <16 x i8> %v, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> +  %res = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %neg, i1 false) +  store <16 x i8> %res, ptr %dst +  ret void +} + +define void @not_ctlz_v8i16(ptr %src, ptr %dst) nounwind { +; CHECK-LABEL: not_ctlz_v8i16: +; CHECK:       # %bb.0: +; CHECK-NEXT:    vld $vr0, $a0, 0 +; CHECK-NEXT:    vrepli.b $vr1, -1 +; CHECK-NEXT:    vxor.v $vr0, $vr0, $vr1 +; CHECK-NEXT:    vclz.h $vr0, $vr0 +; CHECK-NEXT:    vst $vr0, $a1, 0 +; CHECK-NEXT:    ret +  %v = load <8 x i16>, ptr %src +  %neg = xor <8 x i16> %v, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> +  %res = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %neg, i1 false) +  store <8 x i16> %res, ptr %dst +  ret void +} + +define void @not_ctlz_v4i32(ptr %src, ptr %dst) nounwind { +; CHECK-LABEL: not_ctlz_v4i32: +; CHECK:       # %bb.0: +; CHECK-NEXT:    vld $vr0, $a0, 0 +; CHECK-NEXT:    vrepli.b $vr1, -1 +; CHECK-NEXT:    vxor.v $vr0, $vr0, $vr1 +; CHECK-NEXT:    vclz.w $vr0, $vr0 +; CHECK-NEXT:    vst $vr0, $a1, 0 +; CHECK-NEXT:    ret +  %v = load <4 x i32>, ptr %src +  %neg = xor <4 x i32> %v, <i32 -1, i32 -1, i32 -1, i32 -1> +  %res = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %neg, i1 false) +  store <4 x i32> %res, ptr %dst +  ret void +} + +define void @not_ctlz_v2i64(ptr %src, ptr %dst) nounwind { +; CHECK-LABEL: not_ctlz_v2i64: +; CHECK:       # %bb.0: +; CHECK-NEXT:    vld $vr0, $a0, 0 +; CHECK-NEXT:    vrepli.b $vr1, -1 +; CHECK-NEXT:    vxor.v $vr0, $vr0, $vr1 +; CHECK-NEXT:    vclz.d $vr0, $vr0 +; CHECK-NEXT:    vst $vr0, $a1, 0 +; CHECK-NEXT:    ret +  %v = load <2 x i64>, ptr %src +  %neg = xor <2 x i64> %v, <i64 -1, i64 -1> +  %res = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %neg, i1 false) +  store <2 x i64> %res, ptr %dst +  ret void +} +  declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)  declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)  declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>) diff --git a/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll b/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll index 27ecb75..c173092 100644 --- a/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll +++ b/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll @@ -5,24 +5,10 @@  define void @minnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: minnum_v4f32:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    vld $vr0, $a2, 0 -; CHECK-NEXT:    vld $vr1, $a1, 0 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 1 -; CHECK-NEXT:    vreplvei.w $vr3, $vr1, 1 -; CHECK-NEXT:    fmin.s $fa2, $fa3, $fa2 -; CHECK-NEXT:    vreplvei.w $vr3, $vr0, 0 -; CHECK-NEXT:    vreplvei.w $vr4, $vr1, 0 -; CHECK-NEXT:    fmin.s $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 16 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 2 -; CHECK-NEXT:    vreplvei.w $vr4, $vr1, 2 -; CHECK-NEXT:    fmin.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 32 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 3 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 3 -; CHECK-NEXT:    fmin.s $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.w $vr3, $vr0, 48 -; CHECK-NEXT:    vst $vr3, $a0, 0 +; CHECK-NEXT:    vld $vr0, $a1, 0 +; CHECK-NEXT:    vld $vr1, $a2, 0 +; CHECK-NEXT:    vfmin.s $vr0, $vr0, $vr1 +; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <4 x float>, ptr %x @@ -35,15 +21,9 @@ entry:  define void @minnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: minnum_v2f64:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    vld $vr0, $a2, 0 -; CHECK-NEXT:    vld $vr1, $a1, 0 -; CHECK-NEXT:    vreplvei.d $vr2, $vr0, 1 -; CHECK-NEXT:    vreplvei.d $vr3, $vr1, 1 -; CHECK-NEXT:    fmin.d $fa2, $fa3, $fa2 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    fmin.d $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.d $vr0, $vr2, 16 +; CHECK-NEXT:    vld $vr0, $a1, 0 +; CHECK-NEXT:    vld $vr1, $a2, 0 +; CHECK-NEXT:    vfmin.d $vr0, $vr0, $vr1  ; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -57,24 +37,10 @@ entry:  define void @maxnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: maxnum_v4f32:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    vld $vr0, $a2, 0 -; CHECK-NEXT:    vld $vr1, $a1, 0 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 1 -; CHECK-NEXT:    vreplvei.w $vr3, $vr1, 1 -; CHECK-NEXT:    fmax.s $fa2, $fa3, $fa2 -; CHECK-NEXT:    vreplvei.w $vr3, $vr0, 0 -; CHECK-NEXT:    vreplvei.w $vr4, $vr1, 0 -; CHECK-NEXT:    fmax.s $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 16 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 2 -; CHECK-NEXT:    vreplvei.w $vr4, $vr1, 2 -; CHECK-NEXT:    fmax.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 32 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 3 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 3 -; CHECK-NEXT:    fmax.s $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.w $vr3, $vr0, 48 -; CHECK-NEXT:    vst $vr3, $a0, 0 +; CHECK-NEXT:    vld $vr0, $a1, 0 +; CHECK-NEXT:    vld $vr1, $a2, 0 +; CHECK-NEXT:    vfmax.s $vr0, $vr0, $vr1 +; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <4 x float>, ptr %x @@ -87,15 +53,9 @@ entry:  define void @maxnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: maxnum_v2f64:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    vld $vr0, $a2, 0 -; CHECK-NEXT:    vld $vr1, $a1, 0 -; CHECK-NEXT:    vreplvei.d $vr2, $vr0, 1 -; CHECK-NEXT:    vreplvei.d $vr3, $vr1, 1 -; CHECK-NEXT:    fmax.d $fa2, $fa3, $fa2 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    fmax.d $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.d $vr0, $vr2, 16 +; CHECK-NEXT:    vld $vr0, $a1, 0 +; CHECK-NEXT:    vld $vr1, $a2, 0 +; CHECK-NEXT:    vfmax.d $vr0, $vr0, $vr1  ; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry: diff --git a/llvm/test/CodeGen/LoongArch/lsx/fp-rounding.ll b/llvm/test/CodeGen/LoongArch/lsx/fp-rounding.ll index 1ca6290..cb01ac0 100644 --- a/llvm/test/CodeGen/LoongArch/lsx/fp-rounding.ll +++ b/llvm/test/CodeGen/LoongArch/lsx/fp-rounding.ll @@ -7,22 +7,8 @@ define void @ceil_v4f32(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: ceil_v4f32:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    vld $vr0, $a1, 0 -; CHECK-NEXT:    vreplvei.w $vr1, $vr0, 1 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.s $vr1, $vr1 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 0 -; CHECK-NEXT:    vreplvei.w $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrp.s $vr2, $vr2 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 16 -; CHECK-NEXT:    vreplvei.w $vr1, $vr0, 2 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 32 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 3 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0  ; CHECK-NEXT:    vfrintrp.s $vr0, $vr0 -; CHECK-NEXT:    vextrins.w $vr2, $vr0, 48 -; CHECK-NEXT:    vst $vr2, $a0, 0 +; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <4 x float>, ptr %a0 @@ -36,13 +22,7 @@ define void @ceil_v2f64(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: ceil_v2f64:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    vld $vr0, $a1, 0 -; CHECK-NEXT:    vreplvei.d $vr1, $vr0, 1 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrp.d $vr1, $vr1 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0  ; CHECK-NEXT:    vfrintrp.d $vr0, $vr0 -; CHECK-NEXT:    vextrins.d $vr0, $vr1, 16  ; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -57,22 +37,8 @@ define void @floor_v4f32(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: floor_v4f32:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    vld $vr0, $a1, 0 -; CHECK-NEXT:    vreplvei.w $vr1, $vr0, 1 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.s $vr1, $vr1 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 0 -; CHECK-NEXT:    vreplvei.w $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrm.s $vr2, $vr2 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 16 -; CHECK-NEXT:    vreplvei.w $vr1, $vr0, 2 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 32 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 3 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0  ; CHECK-NEXT:    vfrintrm.s $vr0, $vr0 -; CHECK-NEXT:    vextrins.w $vr2, $vr0, 48 -; CHECK-NEXT:    vst $vr2, $a0, 0 +; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <4 x float>, ptr %a0 @@ -86,13 +52,7 @@ define void @floor_v2f64(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: floor_v2f64:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    vld $vr0, $a1, 0 -; CHECK-NEXT:    vreplvei.d $vr1, $vr0, 1 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrm.d $vr1, $vr1 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0  ; CHECK-NEXT:    vfrintrm.d $vr0, $vr0 -; CHECK-NEXT:    vextrins.d $vr0, $vr1, 16  ; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -107,22 +67,8 @@ define void @trunc_v4f32(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: trunc_v4f32:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    vld $vr0, $a1, 0 -; CHECK-NEXT:    vreplvei.w $vr1, $vr0, 1 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.s $vr1, $vr1 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 0 -; CHECK-NEXT:    vreplvei.w $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrz.s $vr2, $vr2 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 16 -; CHECK-NEXT:    vreplvei.w $vr1, $vr0, 2 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 32 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 3 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0  ; CHECK-NEXT:    vfrintrz.s $vr0, $vr0 -; CHECK-NEXT:    vextrins.w $vr2, $vr0, 48 -; CHECK-NEXT:    vst $vr2, $a0, 0 +; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <4 x float>, ptr %a0 @@ -136,13 +82,7 @@ define void @trunc_v2f64(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: trunc_v2f64:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    vld $vr0, $a1, 0 -; CHECK-NEXT:    vreplvei.d $vr1, $vr0, 1 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrz.d $vr1, $vr1 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0  ; CHECK-NEXT:    vfrintrz.d $vr0, $vr0 -; CHECK-NEXT:    vextrins.d $vr0, $vr1, 16  ; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -157,22 +97,8 @@ define void @roundeven_v4f32(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: roundeven_v4f32:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    vld $vr0, $a1, 0 -; CHECK-NEXT:    vreplvei.w $vr1, $vr0, 1 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.s $vr1, $vr1 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 0 -; CHECK-NEXT:    vreplvei.w $vr2, $vr2, 0 -; CHECK-NEXT:    vfrintrne.s $vr2, $vr2 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 16 -; CHECK-NEXT:    vreplvei.w $vr1, $vr0, 2 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.s $vr1, $vr1 -; CHECK-NEXT:    vextrins.w $vr2, $vr1, 32 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 3 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0  ; CHECK-NEXT:    vfrintrne.s $vr0, $vr0 -; CHECK-NEXT:    vextrins.w $vr2, $vr0, 48 -; CHECK-NEXT:    vst $vr2, $a0, 0 +; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <4 x float>, ptr %a0 @@ -186,13 +112,7 @@ define void @roundeven_v2f64(ptr %res, ptr %a0) nounwind {  ; CHECK-LABEL: roundeven_v2f64:  ; CHECK:       # %bb.0: # %entry  ; CHECK-NEXT:    vld $vr0, $a1, 0 -; CHECK-NEXT:    vreplvei.d $vr1, $vr0, 1 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    vfrintrne.d $vr1, $vr1 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0  ; CHECK-NEXT:    vfrintrne.d $vr0, $vr0 -; CHECK-NEXT:    vextrins.d $vr0, $vr1, 16  ; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry: diff --git a/llvm/test/CodeGen/LoongArch/sink-fold-addi.ll b/llvm/test/CodeGen/LoongArch/sink-fold-addi.ll new file mode 100644 index 0000000..9a806a1 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/sink-fold-addi.ll @@ -0,0 +1,758 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 +; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx --verify-machineinstrs < %s \ +; RUN:   | FileCheck --check-prefix=LA32 %s +; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs < %s \ +; RUN:   | FileCheck --check-prefix=LA64 %s + +%struct.S = type { i64, i64, i8 } +%struct.F = type { float, double, float } +%struct.V = type { <4 x i32>, <4 x i32>, <16 x i16> } + +define void @sink_fold_i64(i64 %k, i64 %n, ptr %a) nounwind { +; LA32-LABEL: sink_fold_i64: +; LA32:       # %bb.0: # %entry +; LA32-NEXT:    addi.w $sp, $sp, -48 +; LA32-NEXT:    st.w $ra, $sp, 44 # 4-byte Folded Spill +; LA32-NEXT:    st.w $fp, $sp, 40 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s0, $sp, 36 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s1, $sp, 32 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s2, $sp, 28 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s3, $sp, 24 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s4, $sp, 20 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s5, $sp, 16 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s6, $sp, 12 # 4-byte Folded Spill +; LA32-NEXT:    move $s0, $a3 +; LA32-NEXT:    move $s1, $a2 +; LA32-NEXT:    slli.w $a1, $a0, 4 +; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3 +; LA32-NEXT:    add.w $a0, $a4, $a0 +; LA32-NEXT:    sltui $a1, $a3, 1 +; LA32-NEXT:    slti $a2, $a3, 0 +; LA32-NEXT:    masknez $a2, $a2, $a1 +; LA32-NEXT:    sltui $a3, $s1, 1 +; LA32-NEXT:    maskeqz $a1, $a3, $a1 +; LA32-NEXT:    or $a1, $a1, $a2 +; LA32-NEXT:    addi.w $s2, $a0, 8 +; LA32-NEXT:    bnez $a1, .LBB0_3 +; LA32-NEXT:  # %bb.1: # %for.body.preheader +; LA32-NEXT:    move $fp, $a4 +; LA32-NEXT:    move $s4, $zero +; LA32-NEXT:    move $s5, $zero +; LA32-NEXT:    move $s3, $zero +; LA32-NEXT:    move $s6, $zero +; LA32-NEXT:    .p2align 4, , 16 +; LA32-NEXT:  .LBB0_2: # %for.body +; LA32-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA32-NEXT:    move $a0, $fp +; LA32-NEXT:    bl f +; LA32-NEXT:    ld.w $a0, $s2, 4 +; LA32-NEXT:    ld.w $a1, $s2, 0 +; LA32-NEXT:    add.w $a0, $a0, $s6 +; LA32-NEXT:    add.w $s3, $a1, $s3 +; LA32-NEXT:    sltu $a1, $s3, $a1 +; LA32-NEXT:    addi.w $s4, $s4, 1 +; LA32-NEXT:    sltui $a2, $s4, 1 +; LA32-NEXT:    add.w $s5, $s5, $a2 +; LA32-NEXT:    xor $a2, $s4, $s1 +; LA32-NEXT:    xor $a3, $s5, $s0 +; LA32-NEXT:    or $a2, $a2, $a3 +; LA32-NEXT:    add.w $s6, $a0, $a1 +; LA32-NEXT:    bnez $a2, .LBB0_2 +; LA32-NEXT:    b .LBB0_4 +; LA32-NEXT:  .LBB0_3: +; LA32-NEXT:    move $s3, $zero +; LA32-NEXT:    move $s6, $zero +; LA32-NEXT:  .LBB0_4: # %for.cond.cleanup +; LA32-NEXT:    st.w $s3, $s2, 0 +; LA32-NEXT:    st.w $s6, $s2, 4 +; LA32-NEXT:    ld.w $s6, $sp, 12 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s5, $sp, 16 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s4, $sp, 20 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s3, $sp, 24 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s2, $sp, 28 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s1, $sp, 32 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s0, $sp, 36 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $fp, $sp, 40 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $ra, $sp, 44 # 4-byte Folded Reload +; LA32-NEXT:    addi.w $sp, $sp, 48 +; LA32-NEXT:    ret +; +; LA64-LABEL: sink_fold_i64: +; LA64:       # %bb.0: # %entry +; LA64-NEXT:    addi.d $sp, $sp, -48 +; LA64-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill +; LA64-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s2, $sp, 8 # 8-byte Folded Spill +; LA64-NEXT:    move $s0, $a1 +; LA64-NEXT:    slli.d $a1, $a0, 4 +; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3 +; LA64-NEXT:    add.d $a0, $a2, $a0 +; LA64-NEXT:    addi.d $s1, $a0, 8 +; LA64-NEXT:    blez $s0, .LBB0_3 +; LA64-NEXT:  # %bb.1: # %for.body.preheader +; LA64-NEXT:    move $fp, $a2 +; LA64-NEXT:    move $s2, $zero +; LA64-NEXT:    .p2align 4, , 16 +; LA64-NEXT:  .LBB0_2: # %for.body +; LA64-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA64-NEXT:    move $a0, $fp +; LA64-NEXT:    pcaddu18i $ra, %call36(f) +; LA64-NEXT:    jirl $ra, $ra, 0 +; LA64-NEXT:    ld.d $a0, $s1, 0 +; LA64-NEXT:    addi.d $s0, $s0, -1 +; LA64-NEXT:    add.d $s2, $a0, $s2 +; LA64-NEXT:    bnez $s0, .LBB0_2 +; LA64-NEXT:    b .LBB0_4 +; LA64-NEXT:  .LBB0_3: +; LA64-NEXT:    move $s2, $zero +; LA64-NEXT:  .LBB0_4: # %for.cond.cleanup +; LA64-NEXT:    st.d $s2, $s1, 0 +; LA64-NEXT:    ld.d $s2, $sp, 8 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload +; LA64-NEXT:    addi.d $sp, $sp, 48 +; LA64-NEXT:    ret +entry: +  %y = getelementptr inbounds %struct.S, ptr %a, i64 %k, i32 1 +  %cmp4 = icmp sgt i64 %n, 0 +  br i1 %cmp4, label %for.body, label %for.cond.cleanup + +for.body:                                         ; preds = %entry, %for.body +  %i.06 = phi i64 [ 0, %entry ], [ %inc, %for.body ] +  %s.05 = phi i64 [ 0, %entry ], [ %add, %for.body ] +  call void @f(ptr %a) +  %0 = load i64, ptr %y +  %add = add nsw i64 %0, %s.05 +  %inc = add nuw nsw i64 %i.06, 1 +  %exitcond.not = icmp eq i64 %inc, %n +  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body + +for.cond.cleanup:                                 ; preds = %for.body, %entry +  %s.0.lcssa = phi i64 [ 0, %entry ], [ %add, %for.body ] +  store i64 %s.0.lcssa, ptr %y +  ret void +} + +define void @sink_fold_f32(i64 %k, i64 %n, ptr %a) nounwind { +; LA32-LABEL: sink_fold_f32: +; LA32:       # %bb.0: # %entry +; LA32-NEXT:    addi.w $sp, $sp, -48 +; LA32-NEXT:    st.w $ra, $sp, 44 # 4-byte Folded Spill +; LA32-NEXT:    st.w $fp, $sp, 40 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s0, $sp, 36 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s1, $sp, 32 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s2, $sp, 28 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s3, $sp, 24 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s4, $sp, 20 # 4-byte Folded Spill +; LA32-NEXT:    fst.d $fs0, $sp, 8 # 8-byte Folded Spill +; LA32-NEXT:    move $s0, $a3 +; LA32-NEXT:    move $s1, $a2 +; LA32-NEXT:    slli.w $a1, $a0, 4 +; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3 +; LA32-NEXT:    add.w $a0, $a4, $a0 +; LA32-NEXT:    sltui $a1, $a3, 1 +; LA32-NEXT:    slti $a2, $a3, 0 +; LA32-NEXT:    masknez $a2, $a2, $a1 +; LA32-NEXT:    sltui $a3, $s1, 1 +; LA32-NEXT:    maskeqz $a1, $a3, $a1 +; LA32-NEXT:    or $a1, $a1, $a2 +; LA32-NEXT:    addi.w $s2, $a0, 16 +; LA32-NEXT:    bnez $a1, .LBB1_3 +; LA32-NEXT:  # %bb.1: # %for.body.preheader +; LA32-NEXT:    move $fp, $a4 +; LA32-NEXT:    move $s3, $zero +; LA32-NEXT:    move $s4, $zero +; LA32-NEXT:    movgr2fr.w $fs0, $zero +; LA32-NEXT:    .p2align 4, , 16 +; LA32-NEXT:  .LBB1_2: # %for.body +; LA32-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA32-NEXT:    move $a0, $fp +; LA32-NEXT:    bl f +; LA32-NEXT:    fld.s $fa0, $s2, 0 +; LA32-NEXT:    addi.w $s3, $s3, 1 +; LA32-NEXT:    sltui $a0, $s3, 1 +; LA32-NEXT:    add.w $s4, $s4, $a0 +; LA32-NEXT:    xor $a0, $s3, $s1 +; LA32-NEXT:    xor $a1, $s4, $s0 +; LA32-NEXT:    or $a0, $a0, $a1 +; LA32-NEXT:    fadd.s $fs0, $fa0, $fs0 +; LA32-NEXT:    bnez $a0, .LBB1_2 +; LA32-NEXT:    b .LBB1_4 +; LA32-NEXT:  .LBB1_3: +; LA32-NEXT:    movgr2fr.w $fs0, $zero +; LA32-NEXT:  .LBB1_4: # %for.cond.cleanup +; LA32-NEXT:    fst.s $fs0, $s2, 0 +; LA32-NEXT:    fld.d $fs0, $sp, 8 # 8-byte Folded Reload +; LA32-NEXT:    ld.w $s4, $sp, 20 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s3, $sp, 24 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s2, $sp, 28 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s1, $sp, 32 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s0, $sp, 36 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $fp, $sp, 40 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $ra, $sp, 44 # 4-byte Folded Reload +; LA32-NEXT:    addi.w $sp, $sp, 48 +; LA32-NEXT:    ret +; +; LA64-LABEL: sink_fold_f32: +; LA64:       # %bb.0: # %entry +; LA64-NEXT:    addi.d $sp, $sp, -48 +; LA64-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill +; LA64-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill +; LA64-NEXT:    fst.d $fs0, $sp, 8 # 8-byte Folded Spill +; LA64-NEXT:    move $s0, $a1 +; LA64-NEXT:    slli.d $a1, $a0, 4 +; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3 +; LA64-NEXT:    add.d $a0, $a2, $a0 +; LA64-NEXT:    addi.d $s1, $a0, 16 +; LA64-NEXT:    blez $s0, .LBB1_3 +; LA64-NEXT:  # %bb.1: # %for.body.preheader +; LA64-NEXT:    move $fp, $a2 +; LA64-NEXT:    movgr2fr.w $fs0, $zero +; LA64-NEXT:    .p2align 4, , 16 +; LA64-NEXT:  .LBB1_2: # %for.body +; LA64-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA64-NEXT:    move $a0, $fp +; LA64-NEXT:    pcaddu18i $ra, %call36(f) +; LA64-NEXT:    jirl $ra, $ra, 0 +; LA64-NEXT:    fld.s $fa0, $s1, 0 +; LA64-NEXT:    addi.d $s0, $s0, -1 +; LA64-NEXT:    fadd.s $fs0, $fa0, $fs0 +; LA64-NEXT:    bnez $s0, .LBB1_2 +; LA64-NEXT:    b .LBB1_4 +; LA64-NEXT:  .LBB1_3: +; LA64-NEXT:    movgr2fr.w $fs0, $zero +; LA64-NEXT:  .LBB1_4: # %for.cond.cleanup +; LA64-NEXT:    fst.s $fs0, $s1, 0 +; LA64-NEXT:    fld.d $fs0, $sp, 8 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload +; LA64-NEXT:    addi.d $sp, $sp, 48 +; LA64-NEXT:    ret +entry: +  %y = getelementptr inbounds %struct.F, ptr %a, i64 %k, i32 2 +  %cmp4 = icmp sgt i64 %n, 0 +  br i1 %cmp4, label %for.body, label %for.cond.cleanup + +for.body:                                         ; preds = %entry, %for.body +  %i.06 = phi i64 [ 0, %entry ], [ %inc, %for.body ] +  %s.05 = phi float [ 0.0, %entry ], [ %add, %for.body ] +  call void @f(ptr %a) +  %0 = load float, ptr %y +  %add = fadd float %0, %s.05 +  %inc = add nuw nsw i64 %i.06, 1 +  %exitcond.not = icmp eq i64 %inc, %n +  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body + +for.cond.cleanup:                                 ; preds = %for.body, %entry +  %s.0.lcssa = phi float [ 0.0, %entry ], [ %add, %for.body ] +  store float %s.0.lcssa, ptr %y +  ret void +} + +define void @sink_fold_v4i32(i64 %k, i64 %n, ptr %a) nounwind { +; LA32-LABEL: sink_fold_v4i32: +; LA32:       # %bb.0: # %entry +; LA32-NEXT:    addi.w $sp, $sp, -48 +; LA32-NEXT:    st.w $ra, $sp, 44 # 4-byte Folded Spill +; LA32-NEXT:    st.w $fp, $sp, 40 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s0, $sp, 36 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s1, $sp, 32 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s2, $sp, 28 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s3, $sp, 24 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s4, $sp, 20 # 4-byte Folded Spill +; LA32-NEXT:    move $s0, $a3 +; LA32-NEXT:    move $s1, $a2 +; LA32-NEXT:    slli.w $a0, $a0, 6 +; LA32-NEXT:    add.w $a0, $a4, $a0 +; LA32-NEXT:    sltui $a1, $a3, 1 +; LA32-NEXT:    slti $a2, $a3, 0 +; LA32-NEXT:    masknez $a2, $a2, $a1 +; LA32-NEXT:    sltui $a3, $s1, 1 +; LA32-NEXT:    maskeqz $a1, $a3, $a1 +; LA32-NEXT:    or $a1, $a1, $a2 +; LA32-NEXT:    addi.w $s2, $a0, 16 +; LA32-NEXT:    bnez $a1, .LBB2_3 +; LA32-NEXT:  # %bb.1: # %for.body.preheader +; LA32-NEXT:    move $fp, $a4 +; LA32-NEXT:    move $s3, $zero +; LA32-NEXT:    move $s4, $zero +; LA32-NEXT:    vrepli.b $vr0, 0 +; LA32-NEXT:    .p2align 4, , 16 +; LA32-NEXT:  .LBB2_2: # %for.body +; LA32-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA32-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill +; LA32-NEXT:    move $a0, $fp +; LA32-NEXT:    bl f +; LA32-NEXT:    vld $vr0, $s2, 0 +; LA32-NEXT:    addi.w $s3, $s3, 1 +; LA32-NEXT:    sltui $a0, $s3, 1 +; LA32-NEXT:    add.w $s4, $s4, $a0 +; LA32-NEXT:    xor $a0, $s3, $s1 +; LA32-NEXT:    xor $a1, $s4, $s0 +; LA32-NEXT:    or $a0, $a0, $a1 +; LA32-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload +; LA32-NEXT:    vadd.w $vr1, $vr0, $vr1 +; LA32-NEXT:    vst $vr1, $sp, 0 # 16-byte Folded Spill +; LA32-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload +; LA32-NEXT:    bnez $a0, .LBB2_2 +; LA32-NEXT:    b .LBB2_4 +; LA32-NEXT:  .LBB2_3: +; LA32-NEXT:    vrepli.b $vr0, 0 +; LA32-NEXT:  .LBB2_4: # %for.cond.cleanup +; LA32-NEXT:    vst $vr0, $s2, 0 +; LA32-NEXT:    ld.w $s4, $sp, 20 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s3, $sp, 24 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s2, $sp, 28 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s1, $sp, 32 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s0, $sp, 36 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $fp, $sp, 40 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $ra, $sp, 44 # 4-byte Folded Reload +; LA32-NEXT:    addi.w $sp, $sp, 48 +; LA32-NEXT:    ret +; +; LA64-LABEL: sink_fold_v4i32: +; LA64:       # %bb.0: # %entry +; LA64-NEXT:    addi.d $sp, $sp, -48 +; LA64-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill +; LA64-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill +; LA64-NEXT:    slli.d $a0, $a0, 6 +; LA64-NEXT:    add.d $a0, $a2, $a0 +; LA64-NEXT:    addi.d $s1, $a0, 16 +; LA64-NEXT:    blez $a1, .LBB2_3 +; LA64-NEXT:  # %bb.1: # %for.body.preheader +; LA64-NEXT:    move $fp, $a2 +; LA64-NEXT:    move $s0, $a1 +; LA64-NEXT:    vrepli.b $vr0, 0 +; LA64-NEXT:    .p2align 4, , 16 +; LA64-NEXT:  .LBB2_2: # %for.body +; LA64-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA64-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill +; LA64-NEXT:    move $a0, $fp +; LA64-NEXT:    pcaddu18i $ra, %call36(f) +; LA64-NEXT:    jirl $ra, $ra, 0 +; LA64-NEXT:    vld $vr0, $s1, 0 +; LA64-NEXT:    addi.d $s0, $s0, -1 +; LA64-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload +; LA64-NEXT:    vadd.w $vr1, $vr0, $vr1 +; LA64-NEXT:    vst $vr1, $sp, 0 # 16-byte Folded Spill +; LA64-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload +; LA64-NEXT:    bnez $s0, .LBB2_2 +; LA64-NEXT:    b .LBB2_4 +; LA64-NEXT:  .LBB2_3: +; LA64-NEXT:    vrepli.b $vr0, 0 +; LA64-NEXT:  .LBB2_4: # %for.cond.cleanup +; LA64-NEXT:    vst $vr0, $s1, 0 +; LA64-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload +; LA64-NEXT:    addi.d $sp, $sp, 48 +; LA64-NEXT:    ret +entry: +  %y = getelementptr inbounds %struct.V, ptr %a, i64 %k, i32 1 +  %cmp = icmp sgt i64 %n, 0 +  br i1 %cmp, label %for.body, label %for.cond.cleanup + +for.body:                                         ; preds = %entry, %for.body +  %i.0 = phi i64 [ 0, %entry ], [ %inc, %for.body ] +  %sum.0 = phi <4 x i32> [ zeroinitializer, %entry ], [ %addv, %for.body ] +  call void @f(ptr %a) +  %v = load <4 x i32>, ptr %y +  %addv = add <4 x i32> %v, %sum.0 +  %inc = add nuw nsw i64 %i.0, 1 +  %exitcond = icmp eq i64 %inc, %n +  br i1 %exitcond, label %for.cond.cleanup, label %for.body + +for.cond.cleanup:                                 ; preds = %for.body, %entry +  %sum.lcssa = phi <4 x i32> [ zeroinitializer, %entry ], [ %addv, %for.body ] +  store <4 x i32> %sum.lcssa, ptr %y +  ret void +} + +define void @sink_fold_v16i16(i64 %k, i64 %n, ptr %a) nounwind { +; LA32-LABEL: sink_fold_v16i16: +; LA32:       # %bb.0: # %entry +; LA32-NEXT:    addi.w $sp, $sp, -80 +; LA32-NEXT:    st.w $ra, $sp, 76 # 4-byte Folded Spill +; LA32-NEXT:    st.w $fp, $sp, 72 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s0, $sp, 68 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s1, $sp, 64 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s2, $sp, 60 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s3, $sp, 56 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s4, $sp, 52 # 4-byte Folded Spill +; LA32-NEXT:    move $s0, $a3 +; LA32-NEXT:    move $s1, $a2 +; LA32-NEXT:    slli.w $a0, $a0, 6 +; LA32-NEXT:    add.w $a0, $a4, $a0 +; LA32-NEXT:    sltui $a1, $a3, 1 +; LA32-NEXT:    slti $a2, $a3, 0 +; LA32-NEXT:    masknez $a2, $a2, $a1 +; LA32-NEXT:    sltui $a3, $s1, 1 +; LA32-NEXT:    maskeqz $a1, $a3, $a1 +; LA32-NEXT:    or $a1, $a1, $a2 +; LA32-NEXT:    addi.w $s2, $a0, 32 +; LA32-NEXT:    bnez $a1, .LBB3_3 +; LA32-NEXT:  # %bb.1: # %for.body.preheader +; LA32-NEXT:    move $fp, $a4 +; LA32-NEXT:    move $s3, $zero +; LA32-NEXT:    move $s4, $zero +; LA32-NEXT:    xvrepli.b $xr0, 0 +; LA32-NEXT:    .p2align 4, , 16 +; LA32-NEXT:  .LBB3_2: # %for.body +; LA32-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA32-NEXT:    xvst $xr0, $sp, 16 # 32-byte Folded Spill +; LA32-NEXT:    move $a0, $fp +; LA32-NEXT:    bl f +; LA32-NEXT:    xvld $xr0, $s2, 0 +; LA32-NEXT:    addi.w $s3, $s3, 1 +; LA32-NEXT:    sltui $a0, $s3, 1 +; LA32-NEXT:    add.w $s4, $s4, $a0 +; LA32-NEXT:    xor $a0, $s3, $s1 +; LA32-NEXT:    xor $a1, $s4, $s0 +; LA32-NEXT:    or $a0, $a0, $a1 +; LA32-NEXT:    xvld $xr1, $sp, 16 # 32-byte Folded Reload +; LA32-NEXT:    xvadd.h $xr1, $xr0, $xr1 +; LA32-NEXT:    xvst $xr1, $sp, 16 # 32-byte Folded Spill +; LA32-NEXT:    xvld $xr0, $sp, 16 # 32-byte Folded Reload +; LA32-NEXT:    bnez $a0, .LBB3_2 +; LA32-NEXT:    b .LBB3_4 +; LA32-NEXT:  .LBB3_3: +; LA32-NEXT:    xvrepli.b $xr0, 0 +; LA32-NEXT:  .LBB3_4: # %for.cond.cleanup +; LA32-NEXT:    xvst $xr0, $s2, 0 +; LA32-NEXT:    ld.w $s4, $sp, 52 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s3, $sp, 56 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s2, $sp, 60 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s1, $sp, 64 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s0, $sp, 68 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $fp, $sp, 72 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $ra, $sp, 76 # 4-byte Folded Reload +; LA32-NEXT:    addi.w $sp, $sp, 80 +; LA32-NEXT:    ret +; +; LA64-LABEL: sink_fold_v16i16: +; LA64:       # %bb.0: # %entry +; LA64-NEXT:    addi.d $sp, $sp, -80 +; LA64-NEXT:    st.d $ra, $sp, 72 # 8-byte Folded Spill +; LA64-NEXT:    st.d $fp, $sp, 64 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s0, $sp, 56 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s1, $sp, 48 # 8-byte Folded Spill +; LA64-NEXT:    slli.d $a0, $a0, 6 +; LA64-NEXT:    add.d $a0, $a2, $a0 +; LA64-NEXT:    addi.d $s1, $a0, 32 +; LA64-NEXT:    blez $a1, .LBB3_3 +; LA64-NEXT:  # %bb.1: # %for.body.preheader +; LA64-NEXT:    move $fp, $a2 +; LA64-NEXT:    move $s0, $a1 +; LA64-NEXT:    xvrepli.b $xr0, 0 +; LA64-NEXT:    .p2align 4, , 16 +; LA64-NEXT:  .LBB3_2: # %for.body +; LA64-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA64-NEXT:    xvst $xr0, $sp, 16 # 32-byte Folded Spill +; LA64-NEXT:    move $a0, $fp +; LA64-NEXT:    pcaddu18i $ra, %call36(f) +; LA64-NEXT:    jirl $ra, $ra, 0 +; LA64-NEXT:    xvld $xr0, $s1, 0 +; LA64-NEXT:    addi.d $s0, $s0, -1 +; LA64-NEXT:    xvld $xr1, $sp, 16 # 32-byte Folded Reload +; LA64-NEXT:    xvadd.h $xr1, $xr0, $xr1 +; LA64-NEXT:    xvst $xr1, $sp, 16 # 32-byte Folded Spill +; LA64-NEXT:    xvld $xr0, $sp, 16 # 32-byte Folded Reload +; LA64-NEXT:    bnez $s0, .LBB3_2 +; LA64-NEXT:    b .LBB3_4 +; LA64-NEXT:  .LBB3_3: +; LA64-NEXT:    xvrepli.b $xr0, 0 +; LA64-NEXT:  .LBB3_4: # %for.cond.cleanup +; LA64-NEXT:    xvst $xr0, $s1, 0 +; LA64-NEXT:    ld.d $s1, $sp, 48 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $s0, $sp, 56 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $fp, $sp, 64 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $ra, $sp, 72 # 8-byte Folded Reload +; LA64-NEXT:    addi.d $sp, $sp, 80 +; LA64-NEXT:    ret +entry: +  %y = getelementptr inbounds %struct.V, ptr %a, i64 %k, i32 2 +  %cmp = icmp sgt i64 %n, 0 +  br i1 %cmp, label %for.body, label %for.cond.cleanup + +for.body:                                         ; preds = %entry, %for.body +  %i.0 = phi i64 [ 0, %entry ], [ %inc, %for.body ] +  %sum.0 = phi <16 x i16> [ zeroinitializer, %entry ], [ %addv, %for.body ] +  call void @f(ptr %a) +  %v = load <16 x i16>, ptr %y +  %addv = add <16 x i16> %v, %sum.0 +  %inc = add nuw nsw i64 %i.0, 1 +  %exitcond = icmp eq i64 %inc, %n +  br i1 %exitcond, label %for.cond.cleanup, label %for.body + +for.cond.cleanup:                                 ; preds = %for.body, %entry +  %sum.lcssa = phi <16 x i16> [ zeroinitializer, %entry ], [ %addv, %for.body ] +  store <16 x i16> %sum.lcssa, ptr %y +  ret void +} + +define void @sink_fold_extracti8(i64 %k, i64 %n, ptr %a) nounwind { +; LA32-LABEL: sink_fold_extracti8: +; LA32:       # %bb.0: # %entry +; LA32-NEXT:    addi.w $sp, $sp, -48 +; LA32-NEXT:    st.w $ra, $sp, 44 # 4-byte Folded Spill +; LA32-NEXT:    st.w $fp, $sp, 40 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s0, $sp, 36 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s1, $sp, 32 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s2, $sp, 28 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s3, $sp, 24 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s4, $sp, 20 # 4-byte Folded Spill +; LA32-NEXT:    move $s0, $a3 +; LA32-NEXT:    move $s1, $a2 +; LA32-NEXT:    slli.w $a1, $a0, 4 +; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3 +; LA32-NEXT:    add.w $a0, $a4, $a0 +; LA32-NEXT:    sltui $a1, $a3, 1 +; LA32-NEXT:    slti $a2, $a3, 0 +; LA32-NEXT:    masknez $a2, $a2, $a1 +; LA32-NEXT:    sltui $a3, $s1, 1 +; LA32-NEXT:    maskeqz $a1, $a3, $a1 +; LA32-NEXT:    or $a1, $a1, $a2 +; LA32-NEXT:    addi.w $s2, $a0, 16 +; LA32-NEXT:    bnez $a1, .LBB4_3 +; LA32-NEXT:  # %bb.1: # %for.body.preheader +; LA32-NEXT:    move $fp, $a4 +; LA32-NEXT:    move $s3, $zero +; LA32-NEXT:    move $s4, $zero +; LA32-NEXT:    vrepli.b $vr0, 0 +; LA32-NEXT:    .p2align 4, , 16 +; LA32-NEXT:  .LBB4_2: # %for.body +; LA32-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA32-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill +; LA32-NEXT:    move $a0, $fp +; LA32-NEXT:    bl f +; LA32-NEXT:    vldrepl.b $vr0, $s2, 0 +; LA32-NEXT:    addi.w $s3, $s3, 1 +; LA32-NEXT:    sltui $a0, $s3, 1 +; LA32-NEXT:    add.w $s4, $s4, $a0 +; LA32-NEXT:    xor $a0, $s3, $s1 +; LA32-NEXT:    xor $a1, $s4, $s0 +; LA32-NEXT:    or $a0, $a0, $a1 +; LA32-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload +; LA32-NEXT:    vadd.b $vr1, $vr0, $vr1 +; LA32-NEXT:    vst $vr1, $sp, 0 # 16-byte Folded Spill +; LA32-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload +; LA32-NEXT:    bnez $a0, .LBB4_2 +; LA32-NEXT:    b .LBB4_4 +; LA32-NEXT:  .LBB4_3: +; LA32-NEXT:    vrepli.b $vr0, 0 +; LA32-NEXT:  .LBB4_4: # %for.cond.cleanup +; LA32-NEXT:    vstelm.b $vr0, $s2, 0, 1 +; LA32-NEXT:    ld.w $s4, $sp, 20 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s3, $sp, 24 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s2, $sp, 28 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s1, $sp, 32 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s0, $sp, 36 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $fp, $sp, 40 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $ra, $sp, 44 # 4-byte Folded Reload +; LA32-NEXT:    addi.w $sp, $sp, 48 +; LA32-NEXT:    ret +; +; LA64-LABEL: sink_fold_extracti8: +; LA64:       # %bb.0: # %entry +; LA64-NEXT:    addi.d $sp, $sp, -48 +; LA64-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill +; LA64-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill +; LA64-NEXT:    move $s0, $a1 +; LA64-NEXT:    slli.d $a1, $a0, 4 +; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3 +; LA64-NEXT:    add.d $a0, $a2, $a0 +; LA64-NEXT:    addi.d $s1, $a0, 16 +; LA64-NEXT:    blez $s0, .LBB4_3 +; LA64-NEXT:  # %bb.1: # %for.body.preheader +; LA64-NEXT:    move $fp, $a2 +; LA64-NEXT:    vrepli.b $vr0, 0 +; LA64-NEXT:    .p2align 4, , 16 +; LA64-NEXT:  .LBB4_2: # %for.body +; LA64-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA64-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill +; LA64-NEXT:    move $a0, $fp +; LA64-NEXT:    pcaddu18i $ra, %call36(f) +; LA64-NEXT:    jirl $ra, $ra, 0 +; LA64-NEXT:    vldrepl.b $vr0, $s1, 0 +; LA64-NEXT:    addi.d $s0, $s0, -1 +; LA64-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload +; LA64-NEXT:    vadd.b $vr1, $vr0, $vr1 +; LA64-NEXT:    vst $vr1, $sp, 0 # 16-byte Folded Spill +; LA64-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload +; LA64-NEXT:    bnez $s0, .LBB4_2 +; LA64-NEXT:    b .LBB4_4 +; LA64-NEXT:  .LBB4_3: +; LA64-NEXT:    vrepli.b $vr0, 0 +; LA64-NEXT:  .LBB4_4: # %for.cond.cleanup +; LA64-NEXT:    vstelm.b $vr0, $s1, 0, 1 +; LA64-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload +; LA64-NEXT:    addi.d $sp, $sp, 48 +; LA64-NEXT:    ret +entry: +  %y = getelementptr inbounds %struct.S, ptr %a, i64 %k, i32 2 +  %cmp = icmp sgt i64 %n, 0 +  br i1 %cmp, label %for.body, label %for.cond.cleanup + +for.body:                                         ; preds = %entry, %for.body +  %i.0 = phi i64 [ 0, %entry ], [ %inc, %for.body ] +  %sum.0 = phi <16 x i8> [ zeroinitializer, %entry ], [ %addv, %for.body ] +  call void @f(ptr %a) +  %e = load i8, ptr %y +  %ins0 = insertelement <16 x i8> poison, i8 %e, i32 0 +  %v = shufflevector <16 x i8> %ins0, <16 x i8> poison, <16 x i32> zeroinitializer +  %addv = add <16 x i8> %v, %sum.0 +  %inc = add nuw nsw i64 %i.0, 1 +  %exitcond = icmp eq i64 %inc, %n +  br i1 %exitcond, label %for.cond.cleanup, label %for.body + +for.cond.cleanup:                                 ; preds = %for.body, %entry +  %sum.lcssa = phi <16 x i8> [ zeroinitializer, %entry ], [ %addv, %for.body ] +  %res = extractelement <16 x i8> %sum.lcssa, i32 1 +  store i8 %res, ptr %y +  ret void +} + +define void @sink_fold_extractf64(i64 %k, i64 %n, ptr %a) nounwind { +; LA32-LABEL: sink_fold_extractf64: +; LA32:       # %bb.0: # %entry +; LA32-NEXT:    addi.w $sp, $sp, -80 +; LA32-NEXT:    st.w $ra, $sp, 76 # 4-byte Folded Spill +; LA32-NEXT:    st.w $fp, $sp, 72 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s0, $sp, 68 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s1, $sp, 64 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s2, $sp, 60 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s3, $sp, 56 # 4-byte Folded Spill +; LA32-NEXT:    st.w $s4, $sp, 52 # 4-byte Folded Spill +; LA32-NEXT:    move $s0, $a3 +; LA32-NEXT:    move $s1, $a2 +; LA32-NEXT:    slli.w $a1, $a0, 4 +; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3 +; LA32-NEXT:    add.w $a0, $a4, $a0 +; LA32-NEXT:    sltui $a1, $a3, 1 +; LA32-NEXT:    slti $a2, $a3, 0 +; LA32-NEXT:    masknez $a2, $a2, $a1 +; LA32-NEXT:    sltui $a3, $s1, 1 +; LA32-NEXT:    maskeqz $a1, $a3, $a1 +; LA32-NEXT:    or $a1, $a1, $a2 +; LA32-NEXT:    addi.w $s2, $a0, 8 +; LA32-NEXT:    bnez $a1, .LBB5_3 +; LA32-NEXT:  # %bb.1: # %for.body.preheader +; LA32-NEXT:    move $fp, $a4 +; LA32-NEXT:    move $s3, $zero +; LA32-NEXT:    move $s4, $zero +; LA32-NEXT:    xvrepli.b $xr0, 0 +; LA32-NEXT:    .p2align 4, , 16 +; LA32-NEXT:  .LBB5_2: # %for.body +; LA32-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA32-NEXT:    xvst $xr0, $sp, 16 # 32-byte Folded Spill +; LA32-NEXT:    move $a0, $fp +; LA32-NEXT:    bl f +; LA32-NEXT:    xvldrepl.d $xr0, $s2, 0 +; LA32-NEXT:    addi.w $s3, $s3, 1 +; LA32-NEXT:    sltui $a0, $s3, 1 +; LA32-NEXT:    add.w $s4, $s4, $a0 +; LA32-NEXT:    xor $a0, $s3, $s1 +; LA32-NEXT:    xor $a1, $s4, $s0 +; LA32-NEXT:    or $a0, $a0, $a1 +; LA32-NEXT:    xvld $xr1, $sp, 16 # 32-byte Folded Reload +; LA32-NEXT:    xvfadd.d $xr1, $xr0, $xr1 +; LA32-NEXT:    xvst $xr1, $sp, 16 # 32-byte Folded Spill +; LA32-NEXT:    xvld $xr0, $sp, 16 # 32-byte Folded Reload +; LA32-NEXT:    bnez $a0, .LBB5_2 +; LA32-NEXT:    b .LBB5_4 +; LA32-NEXT:  .LBB5_3: +; LA32-NEXT:    xvrepli.b $xr0, 0 +; LA32-NEXT:  .LBB5_4: # %for.cond.cleanup +; LA32-NEXT:    xvstelm.d $xr0, $s2, 0, 1 +; LA32-NEXT:    ld.w $s4, $sp, 52 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s3, $sp, 56 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s2, $sp, 60 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s1, $sp, 64 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $s0, $sp, 68 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $fp, $sp, 72 # 4-byte Folded Reload +; LA32-NEXT:    ld.w $ra, $sp, 76 # 4-byte Folded Reload +; LA32-NEXT:    addi.w $sp, $sp, 80 +; LA32-NEXT:    ret +; +; LA64-LABEL: sink_fold_extractf64: +; LA64:       # %bb.0: # %entry +; LA64-NEXT:    addi.d $sp, $sp, -80 +; LA64-NEXT:    st.d $ra, $sp, 72 # 8-byte Folded Spill +; LA64-NEXT:    st.d $fp, $sp, 64 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s0, $sp, 56 # 8-byte Folded Spill +; LA64-NEXT:    st.d $s1, $sp, 48 # 8-byte Folded Spill +; LA64-NEXT:    move $s0, $a1 +; LA64-NEXT:    slli.d $a1, $a0, 4 +; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3 +; LA64-NEXT:    add.d $a0, $a2, $a0 +; LA64-NEXT:    addi.d $s1, $a0, 8 +; LA64-NEXT:    blez $s0, .LBB5_3 +; LA64-NEXT:  # %bb.1: # %for.body.preheader +; LA64-NEXT:    move $fp, $a2 +; LA64-NEXT:    xvrepli.b $xr0, 0 +; LA64-NEXT:    .p2align 4, , 16 +; LA64-NEXT:  .LBB5_2: # %for.body +; LA64-NEXT:    # =>This Inner Loop Header: Depth=1 +; LA64-NEXT:    xvst $xr0, $sp, 16 # 32-byte Folded Spill +; LA64-NEXT:    move $a0, $fp +; LA64-NEXT:    pcaddu18i $ra, %call36(f) +; LA64-NEXT:    jirl $ra, $ra, 0 +; LA64-NEXT:    xvldrepl.d $xr0, $s1, 0 +; LA64-NEXT:    addi.d $s0, $s0, -1 +; LA64-NEXT:    xvld $xr1, $sp, 16 # 32-byte Folded Reload +; LA64-NEXT:    xvfadd.d $xr1, $xr0, $xr1 +; LA64-NEXT:    xvst $xr1, $sp, 16 # 32-byte Folded Spill +; LA64-NEXT:    xvld $xr0, $sp, 16 # 32-byte Folded Reload +; LA64-NEXT:    bnez $s0, .LBB5_2 +; LA64-NEXT:    b .LBB5_4 +; LA64-NEXT:  .LBB5_3: +; LA64-NEXT:    xvrepli.b $xr0, 0 +; LA64-NEXT:  .LBB5_4: # %for.cond.cleanup +; LA64-NEXT:    xvstelm.d $xr0, $s1, 0, 1 +; LA64-NEXT:    ld.d $s1, $sp, 48 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $s0, $sp, 56 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $fp, $sp, 64 # 8-byte Folded Reload +; LA64-NEXT:    ld.d $ra, $sp, 72 # 8-byte Folded Reload +; LA64-NEXT:    addi.d $sp, $sp, 80 +; LA64-NEXT:    ret +entry: +  %y = getelementptr inbounds %struct.F, ptr %a, i64 %k, i32 1 +  %cmp = icmp sgt i64 %n, 0 +  br i1 %cmp, label %for.body, label %for.cond.cleanup + +for.body:                                         ; preds = %entry, %for.body +  %i.0 = phi i64 [ 0, %entry ], [ %inc, %for.body ] +  %sum.0 = phi <4 x double> [ zeroinitializer, %entry ], [ %addv, %for.body ] +  call void @f(ptr %a) +  %e = load double, ptr %y +  %ins0 = insertelement <4 x double> poison, double %e, i32 0 +  %v = shufflevector <4 x double> %ins0, <4 x double> poison, <4 x i32> zeroinitializer +  %addv = fadd <4 x double> %v, %sum.0 +  %inc = add nuw nsw i64 %i.0, 1 +  %exitcond = icmp eq i64 %inc, %n +  br i1 %exitcond, label %for.cond.cleanup, label %for.body + +for.cond.cleanup:                                 ; preds = %for.body, %entry +  %sum.lcssa = phi <4 x double> [ zeroinitializer, %entry ], [ %addv, %for.body ] +  %res = extractelement <4 x double> %sum.lcssa, i32 1 +  store double %res, ptr %y +  ret void +} + +declare void @f(ptr) diff --git a/llvm/test/CodeGen/MLRegAlloc/dev-mode-extra-features-logging.ll b/llvm/test/CodeGen/MLRegAlloc/dev-mode-extra-features-logging.ll index bd8d882..9dd402d 100644 --- a/llvm/test/CodeGen/MLRegAlloc/dev-mode-extra-features-logging.ll +++ b/llvm/test/CodeGen/MLRegAlloc/dev-mode-extra-features-logging.ll @@ -26,7 +26,7 @@  ; Also, the first eviction problem is significantly less than 300 instructions. Check  ; that there is a zero value.  ; Note: we're regex-ing some of the opcodes to avoid test flakyness. -; CHECK: instructions: 20,{{([0-9]{4})}},1{{([0-9]{3})}},2{{([0-9]{3})}},{{.*}},0, +; CHECK: instructions: 20,{{([0-9]{4})}},{{([0-9]{4})}},{{([0-9]{4})}},{{.*}},0,  ; Only the candidate virtreg and the 10th LR are included in this problem. Make  ; sure the other LRs have values of zero. There are 2700 0s followed by some 1s.  ; There's a limit to how many repetitions can be matched. diff --git a/llvm/test/CodeGen/NVPTX/cmpxchg-unsupported-syncscope.err.ll b/llvm/test/CodeGen/NVPTX/cmpxchg-unsupported-syncscope.err.ll new file mode 100644 index 0000000..d3853e2 --- /dev/null +++ b/llvm/test/CodeGen/NVPTX/cmpxchg-unsupported-syncscope.err.ll @@ -0,0 +1,11 @@ +; RUN: not llc -mcpu=sm_100a -mtriple=nvptx64 -mattr=+ptx86 %s 2>&1 | FileCheck %s + +; Test that we get a clear error message when using an unsupported syncscope. + +; CHECK: NVPTX backend does not support syncscope "agent" +; CHECK: Supported syncscopes are: singlethread, <empty string>, block, cluster, device +define i32 @cmpxchg_unsupported_syncscope_agent(ptr %addr, i32 %cmp, i32 %new) { +  %result = cmpxchg ptr %addr, i32 %cmp, i32 %new syncscope("agent") monotonic monotonic +  %value = extractvalue { i32, i1 } %result, 0 +  ret i32 %value +} diff --git a/llvm/test/CodeGen/NVPTX/f16-ex2.ll b/llvm/test/CodeGen/NVPTX/f16-ex2.ll index ee79f9d..af3fe67 100644 --- a/llvm/test/CodeGen/NVPTX/f16-ex2.ll +++ b/llvm/test/CodeGen/NVPTX/f16-ex2.ll @@ -1,12 +1,13 @@  ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 -; RUN: llc < %s -mcpu=sm_75 -mattr=+ptx70 | FileCheck --check-prefixes=CHECK-FP16 %s -; RUN: %if ptxas-sm_75 && ptxas-isa-7.0 %{ llc < %s -mcpu=sm_75 -mattr=+ptx70 | %ptxas-verify -arch=sm_75 %} +; RUN: llc < %s -mcpu=sm_90 -mattr=+ptx78 | FileCheck --check-prefixes=CHECK-FP16 %s +; RUN: %if ptxas-sm_90 && ptxas-isa-7.8 %{ llc < %s -mcpu=sm_90 -mattr=+ptx78 | %ptxas-verify -arch=sm_90 %}  target triple = "nvptx64-nvidia-cuda"  declare half @llvm.nvvm.ex2.approx.f16(half) -declare <2 x half> @llvm.nvvm.ex2.approx.f16x2(<2 x half>) +declare <2 x half> @llvm.nvvm.ex2.approx.v2f16(<2 x half>) +declare bfloat @llvm.nvvm.ex2.approx.ftz.bf16(bfloat) +declare <2 x bfloat> @llvm.nvvm.ex2.approx.ftz.v2bf16(<2 x bfloat>) -; CHECK-LABEL: ex2_half  define half @ex2_half(half %0) {  ; CHECK-FP16-LABEL: ex2_half(  ; CHECK-FP16:       { @@ -21,7 +22,6 @@ define half @ex2_half(half %0) {    ret half %res  } -; CHECK-LABEL: ex2_2xhalf  define <2 x half> @ex2_2xhalf(<2 x half> %0) {  ; CHECK-FP16-LABEL: ex2_2xhalf(  ; CHECK-FP16:       { @@ -32,6 +32,34 @@ define <2 x half> @ex2_2xhalf(<2 x half> %0) {  ; CHECK-FP16-NEXT:    ex2.approx.f16x2 %r2, %r1;  ; CHECK-FP16-NEXT:    st.param.b32 [func_retval0], %r2;  ; CHECK-FP16-NEXT:    ret; -  %res = call <2 x half> @llvm.nvvm.ex2.approx.f16x2(<2 x half> %0) +  %res = call <2 x half> @llvm.nvvm.ex2.approx.v2f16(<2 x half> %0)    ret <2 x half> %res  } + +define bfloat @ex2_bfloat(bfloat %0) { +; CHECK-FP16-LABEL: ex2_bfloat( +; CHECK-FP16:       { +; CHECK-FP16-NEXT:    .reg .b16 %rs<3>; +; CHECK-FP16-EMPTY: +; CHECK-FP16-NEXT:  // %bb.0: +; CHECK-FP16-NEXT:    ld.param.b16 %rs1, [ex2_bfloat_param_0]; +; CHECK-FP16-NEXT:    ex2.approx.ftz.bf16 %rs2, %rs1; +; CHECK-FP16-NEXT:    st.param.b16 [func_retval0], %rs2; +; CHECK-FP16-NEXT:    ret; +  %res = call bfloat @llvm.nvvm.ex2.approx.ftz.bf16(bfloat %0) +  ret bfloat %res +} + +define <2 x bfloat> @ex2_2xbfloat(<2 x bfloat> %0) { +; CHECK-FP16-LABEL: ex2_2xbfloat( +; CHECK-FP16:       { +; CHECK-FP16-NEXT:    .reg .b32 %r<3>; +; CHECK-FP16-EMPTY: +; CHECK-FP16-NEXT:  // %bb.0: +; CHECK-FP16-NEXT:    ld.param.b32 %r1, [ex2_2xbfloat_param_0]; +; CHECK-FP16-NEXT:    ex2.approx.ftz.bf16x2 %r2, %r1; +; CHECK-FP16-NEXT:    st.param.b32 [func_retval0], %r2; +; CHECK-FP16-NEXT:    ret; +  %res = call <2 x bfloat> @llvm.nvvm.ex2.approx.ftz.v2bf16(<2 x bfloat> %0) +  ret <2 x bfloat> %res +} diff --git a/llvm/test/CodeGen/NVPTX/f32-ex2.ll b/llvm/test/CodeGen/NVPTX/f32-ex2.ll index 796d80d..97b9d35 100644 --- a/llvm/test/CodeGen/NVPTX/f32-ex2.ll +++ b/llvm/test/CodeGen/NVPTX/f32-ex2.ll @@ -3,7 +3,8 @@  ; RUN: %if ptxas-sm_50 && ptxas-isa-3.2 %{ llc < %s -mtriple=nvptx64 -mcpu=sm_50 -mattr=+ptx32 | %ptxas-verify -arch=sm_50 %}  target triple = "nvptx-nvidia-cuda" -declare float @llvm.nvvm.ex2.approx.f(float) +declare float @llvm.nvvm.ex2.approx.f32(float) +declare float @llvm.nvvm.ex2.approx.ftz.f32(float)  ; CHECK-LABEL: ex2_float  define float @ex2_float(float %0) { @@ -16,7 +17,7 @@ define float @ex2_float(float %0) {  ; CHECK-NEXT:    ex2.approx.f32 %r2, %r1;  ; CHECK-NEXT:    st.param.b32 [func_retval0], %r2;  ; CHECK-NEXT:    ret; -  %res = call float @llvm.nvvm.ex2.approx.f(float %0) +  %res = call float @llvm.nvvm.ex2.approx.f32(float %0)    ret float %res  } @@ -31,6 +32,6 @@ define float @ex2_float_ftz(float %0) {  ; CHECK-NEXT:    ex2.approx.ftz.f32 %r2, %r1;  ; CHECK-NEXT:    st.param.b32 [func_retval0], %r2;  ; CHECK-NEXT:    ret; -  %res = call float @llvm.nvvm.ex2.approx.ftz.f(float %0) +  %res = call float @llvm.nvvm.ex2.approx.ftz.f32(float %0)    ret float %res  } diff --git a/llvm/test/CodeGen/RISCV/rv64-stackmap-fp.ll b/llvm/test/CodeGen/RISCV/rv64-stackmap-fp.ll new file mode 100644 index 0000000..bf0a2e5 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rv64-stackmap-fp.ll @@ -0,0 +1,41 @@ +; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh < %s | FileCheck %s + +; CHECK-LABEL:  .section	.llvm_stackmaps +; CHECK-NEXT:  __LLVM_StackMaps: +; Header +; CHECK-NEXT:   .byte   3 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   0 +; Num Functions +; CHECK-NEXT:   .word   1 +; Num LargeConstants +; CHECK-NEXT:   .word   0 +; Num Callsites +; CHECK-NEXT:   .word   1 + +; Functions and stack size +; CHECK-NEXT:   .quad   liveArgs +; CHECK-NEXT:   .quad   0 +; CHECK-NEXT:   .quad   1 + +; Spilled stack map values. +; +; Verify 3 stack map entries. +; +; CHECK-LABEL:  .word   .L{{.*}}-liveArgs +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .half   25 +; +; Check that at least one is a spilled entry from SP. +; Location: Indirect SP + ... +; CHECK:        .byte   3 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   2 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +define void @liveArgs(double %arg0, double %arg1, double %arg2, double %arg3, double %arg4, double %arg5, double %arg6, double %arg7, double %arg8, double %arg9, double %arg10, double %arg11, double %arg12, double %arg13, double %arg14, double %arg15, double %arg16, double %arg17, double %arg18, double %arg19, double %arg20, double %arg21, double %arg22, double %arg23, half %arg24, half %arg25, half %arg26, half %arg27, half %arg28, bfloat %arg29) { +entry: +  call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 11, i32 28, ptr null, i32 5, double %arg0, double %arg1, double %arg2, double %arg3, double %arg4, double %arg5, double %arg6, double %arg7, double %arg8, double %arg9, double %arg10, double %arg11, double %arg12, double %arg13, double %arg14, double %arg15, double %arg16, double %arg17, double %arg18, double %arg19, double %arg20, double %arg21, double %arg22, double %arg23, half %arg24, half %arg25, half %arg26, half %arg27, half %arg28, bfloat %arg29) +  ret void +} diff --git a/llvm/test/CodeGen/RISCV/rv64-stackmap.ll b/llvm/test/CodeGen/RISCV/rv64-stackmap.ll index 9aefa90..320a3aa 100644 --- a/llvm/test/CodeGen/RISCV/rv64-stackmap.ll +++ b/llvm/test/CodeGen/RISCV/rv64-stackmap.ll @@ -7,11 +7,11 @@  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .half   0  ; Num Functions -; CHECK-NEXT:   .word   12 +; CHECK-NEXT:   .word   13  ; Num LargeConstants -; CHECK-NEXT:   .word   2 +; CHECK-NEXT:   .word   3  ; Num Callsites -; CHECK-NEXT:   .word   16 +; CHECK-NEXT:   .word   17  ; Functions and stack size  ; CHECK-NEXT:   .quad   constantargs @@ -50,10 +50,14 @@  ; CHECK-NEXT:   .quad   needsStackRealignment  ; CHECK-NEXT:   .quad   -1  ; CHECK-NEXT:   .quad   1 +; CHECK-NEXT:   .quad   floats +; CHECK-NEXT:   .quad   32 +; CHECK-NEXT:   .quad   1  ; Num LargeConstants  ; CHECK-NEXT:   .quad   4294967295  ; CHECK-NEXT:   .quad   4294967296 +; CHECK-NEXT:   .quad   4609434218613702656  ; Constant arguments  ; @@ -282,8 +286,8 @@ define void @liveConstant() {  ; CHECK-NEXT:   .half   0  ; CHECK-NEXT:   .half   28  ; -; Check that at least one is a spilled entry from RBP. -; Location: Indirect RBP + ... +; Check that at least one is a spilled entry from SP. +; Location: Indirect SP + ...  ; CHECK:        .byte   3  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .half   8 @@ -303,7 +307,7 @@ entry:  ; CHECK-NEXT:   .half   0  ; 1 location  ; CHECK-NEXT:   .half   1 -; Loc 0: Direct RBP - ofs +; Loc 0: Direct SP + ofs  ; CHECK-NEXT:   .byte   2  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .half   8 @@ -316,14 +320,14 @@ entry:  ; CHECK-NEXT:   .half   0  ; 2 locations  ; CHECK-NEXT:   .half   2 -; Loc 0: Direct RBP - ofs +; Loc 0: Direct SP + ofs  ; CHECK-NEXT:   .byte   2  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .half   8  ; CHECK-NEXT:   .half   2  ; CHECK-NEXT:   .half   0  ; CHECK-NEXT:   .word -; Loc 1: Direct RBP - ofs +; Loc 1: Direct SP + ofs  ; CHECK-NEXT:   .byte   2  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .half   8 @@ -379,6 +383,104 @@ define void @needsStackRealignment() {  }  declare void @escape_values(...) +; CHECK-LABEL:  .word   .L{{.*}}-floats +; CHECK-NEXT:   .half   0 +; Num Locations +; CHECK-NEXT:   .half   12 +; Loc 0: constant float as constant integer +; CHECK-NEXT:   .byte   4 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 1: constant double as large constant integer +; CHECK-NEXT:   .byte   5 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 2: constant half as constant integer +; CHECK-NEXT:   .byte   4 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 3: constant bfloat as constant integer +; CHECK-NEXT:   .byte   4 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 4: float value in X register +; CHECK-NEXT:   .byte   1 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   10 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 5: double value in X register +; CHECK-NEXT:   .byte   1 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   11 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 6: half value in X register +; CHECK-NEXT:   .byte   1 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   12 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 7: bfloat value in X register +; CHECK-NEXT:   .byte   1 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   13 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 8: float on stack +; CHECK-NEXT:   .byte   2 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   2 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 9: double on stack +; CHECK-NEXT:   .byte   2 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   2 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 10: half on stack +; CHECK-NEXT:   .byte   2 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   2 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +; Loc 11: bfloat on stack +; CHECK-NEXT:   .byte   2 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   2 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +define void @floats(float %f, double %g, half %h, bfloat %i) { +  %ff = alloca float +  %gg = alloca double +  %hh = alloca half +  %ii = alloca bfloat +  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 888, i32 0, float 1.25, +    double 1.5, half 1.5, bfloat 1.5, float %f, double %g, half %h, bfloat %i, ptr %ff, ptr %gg, ptr %hh, ptr %ii) +  ret void +} +  declare void @llvm.experimental.stackmap(i64, i32, ...)  declare void @llvm.experimental.patchpoint.void(i64, i32, ptr, i32, ...)  declare i64 @llvm.experimental.patchpoint.i64(i64, i32, ptr, i32, ...) diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-masked-gather.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-masked-gather.ll index 4c35b25..7e6f2c7 100644 --- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-masked-gather.ll +++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-masked-gather.ll @@ -15265,6 +15265,259 @@ define <4 x i32> @masked_gather_widen_sew_negative_stride(ptr %base) {    ret <4 x i32> %x  } +define <7 x i8> @mgather_baseidx_v7i8(ptr %base, <7 x i8> %idxs, <7 x i1> %m, <7 x i8> %passthru) { +; RV32-LABEL: mgather_baseidx_v7i8: +; RV32:       # %bb.0: +; RV32-NEXT:    li a1, 127 +; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma +; RV32-NEXT:    vmv.s.x v10, a1 +; RV32-NEXT:    vmand.mm v0, v0, v10 +; RV32-NEXT:    vsext.vf4 v10, v8 +; RV32-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu +; RV32-NEXT:    vluxei32.v v9, (a0), v10, v0.t +; RV32-NEXT:    vmv1r.v v8, v9 +; RV32-NEXT:    ret +; +; RV64V-LABEL: mgather_baseidx_v7i8: +; RV64V:       # %bb.0: +; RV64V-NEXT:    li a1, 127 +; RV64V-NEXT:    vsetivli zero, 8, e64, m4, ta, ma +; RV64V-NEXT:    vmv.s.x v10, a1 +; RV64V-NEXT:    vmand.mm v0, v0, v10 +; RV64V-NEXT:    vsext.vf8 v12, v8 +; RV64V-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu +; RV64V-NEXT:    vluxei64.v v9, (a0), v12, v0.t +; RV64V-NEXT:    vmv1r.v v8, v9 +; RV64V-NEXT:    ret +; +; RV64ZVE32F-LABEL: mgather_baseidx_v7i8: +; RV64ZVE32F:       # %bb.0: +; RV64ZVE32F-NEXT:    addi sp, sp, -16 +; RV64ZVE32F-NEXT:    .cfi_def_cfa_offset 16 +; RV64ZVE32F-NEXT:    .cfi_remember_state +; RV64ZVE32F-NEXT:    li a1, 64 +; RV64ZVE32F-NEXT:    addi a2, sp, 8 +; RV64ZVE32F-NEXT:    vsetvli zero, a1, e8, m4, ta, ma +; RV64ZVE32F-NEXT:    vsm.v v0, (a2) +; RV64ZVE32F-NEXT:    ld a1, 8(sp) +; RV64ZVE32F-NEXT:    andi a2, a1, 1 +; RV64ZVE32F-NEXT:    beqz a2, .LBB132_2 +; RV64ZVE32F-NEXT:  # %bb.1: # %cond.load +; RV64ZVE32F-NEXT:    vmv.x.s a2, v8 +; RV64ZVE32F-NEXT:    add a2, a0, a2 +; RV64ZVE32F-NEXT:    lbu a2, 0(a2) +; RV64ZVE32F-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 1 +; RV64ZVE32F-NEXT:    vmv.v.x v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 2 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 3 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 4 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 5 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 6 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v9 +; RV64ZVE32F-NEXT:    vslide1down.vx v9, v10, a2 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 1 +; RV64ZVE32F-NEXT:  .LBB132_2: # %else +; RV64ZVE32F-NEXT:    andi a2, a1, 2 +; RV64ZVE32F-NEXT:    beqz a2, .LBB132_4 +; RV64ZVE32F-NEXT:  # %bb.3: # %cond.load1 +; RV64ZVE32F-NEXT:    vsetivli zero, 1, e8, mf4, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v8, 1 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v9 +; RV64ZVE32F-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 2 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v10 +; RV64ZVE32F-NEXT:    add a3, a0, a3 +; RV64ZVE32F-NEXT:    lbu a3, 0(a3) +; RV64ZVE32F-NEXT:    vmv.v.x v10, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v11 +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 3 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a3 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v11 +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 4 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v11 +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 5 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 6 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a3 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v11 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a2 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a3 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v9 +; RV64ZVE32F-NEXT:    vslide1down.vx v9, v10, a2 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 1 +; RV64ZVE32F-NEXT:  .LBB132_4: # %else2 +; RV64ZVE32F-NEXT:    andi a2, a1, 4 +; RV64ZVE32F-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v8, 2 +; RV64ZVE32F-NEXT:    beqz a2, .LBB132_6 +; RV64ZVE32F-NEXT:  # %bb.5: # %cond.load4 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 1 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v9 +; RV64ZVE32F-NEXT:    vslidedown.vi v12, v9, 3 +; RV64ZVE32F-NEXT:    vmv.x.s a4, v11 +; RV64ZVE32F-NEXT:    vmv.v.x v11, a3 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v12 +; RV64ZVE32F-NEXT:    vslidedown.vi v12, v9, 4 +; RV64ZVE32F-NEXT:    add a2, a0, a2 +; RV64ZVE32F-NEXT:    lbu a2, 0(a2) +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a4 +; RV64ZVE32F-NEXT:    vmv.x.s a4, v12 +; RV64ZVE32F-NEXT:    vslidedown.vi v12, v9, 5 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 6 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v12 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a3 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a4 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v9 +; RV64ZVE32F-NEXT:    vslide1down.vx v9, v11, a2 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 1 +; RV64ZVE32F-NEXT:  .LBB132_6: # %else5 +; RV64ZVE32F-NEXT:    andi a2, a1, 8 +; RV64ZVE32F-NEXT:    beqz a2, .LBB132_8 +; RV64ZVE32F-NEXT:  # %bb.7: # %cond.load7 +; RV64ZVE32F-NEXT:    vsetivli zero, 1, e8, mf4, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v10, 1 +; RV64ZVE32F-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 1 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v9 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 2 +; RV64ZVE32F-NEXT:    vmv.x.s a4, v11 +; RV64ZVE32F-NEXT:    vmv.v.x v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 4 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a4 +; RV64ZVE32F-NEXT:    vmv.x.s a4, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 5 +; RV64ZVE32F-NEXT:    add a3, a0, a3 +; RV64ZVE32F-NEXT:    lbu a3, 0(a3) +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 6 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v11, a3 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a4 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v9 +; RV64ZVE32F-NEXT:    vslide1down.vx v9, v10, a2 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 1 +; RV64ZVE32F-NEXT:  .LBB132_8: # %else8 +; RV64ZVE32F-NEXT:    andi a2, a1, 16 +; RV64ZVE32F-NEXT:    vsetivli zero, 4, e8, mf2, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v8, v8, 4 +; RV64ZVE32F-NEXT:    bnez a2, .LBB132_13 +; RV64ZVE32F-NEXT:  # %bb.9: # %else11 +; RV64ZVE32F-NEXT:    andi a2, a1, 32 +; RV64ZVE32F-NEXT:    bnez a2, .LBB132_14 +; RV64ZVE32F-NEXT:  .LBB132_10: # %else14 +; RV64ZVE32F-NEXT:    andi a1, a1, 64 +; RV64ZVE32F-NEXT:    beqz a1, .LBB132_12 +; RV64ZVE32F-NEXT:  .LBB132_11: # %cond.load16 +; RV64ZVE32F-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v8, v8, 2 +; RV64ZVE32F-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 1 +; RV64ZVE32F-NEXT:    vmv.x.s a1, v9 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v8 +; RV64ZVE32F-NEXT:    vmv.v.x v8, a1 +; RV64ZVE32F-NEXT:    vmv.x.s a1, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 2 +; RV64ZVE32F-NEXT:    add a0, a0, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 3 +; RV64ZVE32F-NEXT:    vslide1down.vx v8, v8, a1 +; RV64ZVE32F-NEXT:    vmv.x.s a1, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 4 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 5 +; RV64ZVE32F-NEXT:    vslide1down.vx v8, v8, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    lbu a0, 0(a0) +; RV64ZVE32F-NEXT:    vslide1down.vx v8, v8, a1 +; RV64ZVE32F-NEXT:    vslide1down.vx v8, v8, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a1, v9 +; RV64ZVE32F-NEXT:    vslide1down.vx v8, v8, a1 +; RV64ZVE32F-NEXT:    vslide1down.vx v8, v8, a0 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v8, 1 +; RV64ZVE32F-NEXT:  .LBB132_12: # %else17 +; RV64ZVE32F-NEXT:    vsetivli zero, 1, e8, m1, ta, ma +; RV64ZVE32F-NEXT:    vmv1r.v v8, v9 +; RV64ZVE32F-NEXT:    addi sp, sp, 16 +; RV64ZVE32F-NEXT:    .cfi_def_cfa_offset 0 +; RV64ZVE32F-NEXT:    ret +; RV64ZVE32F-NEXT:  .LBB132_13: # %cond.load10 +; RV64ZVE32F-NEXT:    .cfi_restore_state +; RV64ZVE32F-NEXT:    vmv.x.s a2, v8 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 1 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v9 +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 2 +; RV64ZVE32F-NEXT:    vmv.x.s a4, v10 +; RV64ZVE32F-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma +; RV64ZVE32F-NEXT:    vmv.v.x v10, a3 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v11 +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 3 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a4 +; RV64ZVE32F-NEXT:    vmv.x.s a4, v11 +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 5 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 6 +; RV64ZVE32F-NEXT:    add a2, a0, a2 +; RV64ZVE32F-NEXT:    lbu a2, 0(a2) +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a3 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v11 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a4 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a2 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a3 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v9 +; RV64ZVE32F-NEXT:    vslide1down.vx v9, v10, a2 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 1 +; RV64ZVE32F-NEXT:    andi a2, a1, 32 +; RV64ZVE32F-NEXT:    beqz a2, .LBB132_10 +; RV64ZVE32F-NEXT:  .LBB132_14: # %cond.load13 +; RV64ZVE32F-NEXT:    vsetivli zero, 1, e8, mf4, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v8, 1 +; RV64ZVE32F-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma +; RV64ZVE32F-NEXT:    vslidedown.vi v11, v9, 1 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v9 +; RV64ZVE32F-NEXT:    vmv.x.s a3, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 2 +; RV64ZVE32F-NEXT:    vmv.x.s a4, v11 +; RV64ZVE32F-NEXT:    vmv.v.x v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 3 +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a4 +; RV64ZVE32F-NEXT:    vmv.x.s a4, v10 +; RV64ZVE32F-NEXT:    vslidedown.vi v10, v9, 4 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 6 +; RV64ZVE32F-NEXT:    add a3, a0, a3 +; RV64ZVE32F-NEXT:    lbu a3, 0(a3) +; RV64ZVE32F-NEXT:    vslide1down.vx v11, v11, a2 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v10 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v11, a4 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a2 +; RV64ZVE32F-NEXT:    vslide1down.vx v10, v10, a3 +; RV64ZVE32F-NEXT:    vmv.x.s a2, v9 +; RV64ZVE32F-NEXT:    vslide1down.vx v9, v10, a2 +; RV64ZVE32F-NEXT:    vslidedown.vi v9, v9, 1 +; RV64ZVE32F-NEXT:    andi a1, a1, 64 +; RV64ZVE32F-NEXT:    bnez a1, .LBB132_11 +; RV64ZVE32F-NEXT:    j .LBB132_12 +  %ptrs = getelementptr inbounds i8, ptr %base, <7 x i8> %idxs +  %v = call <7 x i8> @llvm.masked.gather.v7i8.v7p0(<7 x ptr> %ptrs, i32 1, <7 x i1> %m, <7 x i8> %passthru) +  ret <7 x i8> %v +} +  ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:  ; RV32V-ZVFH: {{.*}}  ; RV32V-ZVFHMIN: {{.*}} diff --git a/llvm/test/CodeGen/RISCV/rvv/pr165232.ll b/llvm/test/CodeGen/RISCV/rvv/pr165232.ll new file mode 100644 index 0000000..bef53c6 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/pr165232.ll @@ -0,0 +1,244 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 +; RUN: llc < %s -mtriple=riscv64 -mattr=+v | FileCheck %s + +target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128" +target triple = "riscv64-unknown-linux-gnu" + +define i1 @main(ptr %var_117, ptr %arrayinit.element3045, ptr %arrayinit.element3047, ptr %arrayinit.element3049, ptr %arrayinit.element3051, ptr %arrayinit.element3053, ptr %arrayinit.element3055, ptr %arrayinit.element3057, ptr %arrayinit.element3059, ptr %arrayinit.element3061, ptr %arrayinit.element3063, ptr %arrayinit.element3065, ptr %arrayinit.element3067, i64 %var_94_i.07698, target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %0, target("riscv.vector.tuple", <vscale x 16 x i8>, 4) %1) { +; CHECK-LABEL: main: +; CHECK:       # %bb.0: # %entry +; CHECK-NEXT:    addi sp, sp, -16 +; CHECK-NEXT:    .cfi_def_cfa_offset 16 +; CHECK-NEXT:    csrr t0, vlenb +; CHECK-NEXT:    slli t0, t0, 3 +; CHECK-NEXT:    mv t1, t0 +; CHECK-NEXT:    slli t0, t0, 1 +; CHECK-NEXT:    add t0, t0, t1 +; CHECK-NEXT:    sub sp, sp, t0 +; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb +; CHECK-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill +; CHECK-NEXT:    sd a2, 0(sp) # 8-byte Folded Spill +; CHECK-NEXT:    csrr a1, vlenb +; CHECK-NEXT:    slli a1, a1, 4 +; CHECK-NEXT:    add a1, sp, a1 +; CHECK-NEXT:    addi a1, a1, 16 +; CHECK-NEXT:    vs4r.v v12, (a1) # vscale x 32-byte Folded Spill +; CHECK-NEXT:    csrr a2, vlenb +; CHECK-NEXT:    slli a2, a2, 2 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    vs4r.v v16, (a1) # vscale x 32-byte Folded Spill +; CHECK-NEXT:    csrr a1, vlenb +; CHECK-NEXT:    slli a1, a1, 2 +; CHECK-NEXT:    mv a2, a1 +; CHECK-NEXT:    slli a1, a1, 1 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    add a1, sp, a1 +; CHECK-NEXT:    addi a1, a1, 16 +; CHECK-NEXT:    vs4r.v v8, (a1) # vscale x 32-byte Folded Spill +; CHECK-NEXT:    csrr a1, vlenb +; CHECK-NEXT:    slli a1, a1, 3 +; CHECK-NEXT:    mv a2, a1 +; CHECK-NEXT:    slli a1, a1, 1 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    add a1, sp, a1 +; CHECK-NEXT:    ld t0, 56(a1) +; CHECK-NEXT:    csrr a1, vlenb +; CHECK-NEXT:    slli a1, a1, 3 +; CHECK-NEXT:    mv a2, a1 +; CHECK-NEXT:    slli a1, a1, 1 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    add a1, sp, a1 +; CHECK-NEXT:    ld t1, 48(a1) +; CHECK-NEXT:    vsetvli t2, zero, e8, m1, ta, ma +; CHECK-NEXT:    vmv.v.i v9, 0 +; CHECK-NEXT:    csrr a1, vlenb +; CHECK-NEXT:    slli a1, a1, 3 +; CHECK-NEXT:    mv a2, a1 +; CHECK-NEXT:    slli a1, a1, 1 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    add a1, sp, a1 +; CHECK-NEXT:    ld t2, 40(a1) +; CHECK-NEXT:    # kill: def $v10 killed $v9 killed $vtype +; CHECK-NEXT:    csrr a1, vlenb +; CHECK-NEXT:    slli a1, a1, 3 +; CHECK-NEXT:    mv a2, a1 +; CHECK-NEXT:    slli a1, a1, 1 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    add a1, sp, a1 +; CHECK-NEXT:    ld t3, 32(a1) +; CHECK-NEXT:    vmv.v.i v11, 0 +; CHECK-NEXT:    csrr a1, vlenb +; CHECK-NEXT:    slli a1, a1, 3 +; CHECK-NEXT:    mv a2, a1 +; CHECK-NEXT:    slli a1, a1, 1 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    add a1, sp, a1 +; CHECK-NEXT:    ld t4, 16(a1) +; CHECK-NEXT:    vmv.v.i v12, 0 +; CHECK-NEXT:    csrr a1, vlenb +; CHECK-NEXT:    slli a1, a1, 3 +; CHECK-NEXT:    mv a2, a1 +; CHECK-NEXT:    slli a1, a1, 1 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    add a1, sp, a1 +; CHECK-NEXT:    ld t5, 24(a1) +; CHECK-NEXT:    vmv.v.i v13, 0 +; CHECK-NEXT:    vsetvli t6, zero, e8, m2, ta, ma +; CHECK-NEXT:    vmv.v.i v22, 0 +; CHECK-NEXT:    vmv1r.v v14, v9 +; CHECK-NEXT:    sd zero, 0(a0) +; CHECK-NEXT:    vmv.v.i v24, 0 +; CHECK-NEXT:    vmv1r.v v15, v9 +; CHECK-NEXT:    vmv1r.v v18, v9 +; CHECK-NEXT:    li t6, 1023 +; CHECK-NEXT:    vmv.v.i v26, 0 +; CHECK-NEXT:    vmv1r.v v19, v9 +; CHECK-NEXT:    slli t6, t6, 52 +; CHECK-NEXT:    vmv.v.i v28, 0 +; CHECK-NEXT:    addi a1, sp, 16 +; CHECK-NEXT:    vs2r.v v22, (a1) # vscale x 16-byte Folded Spill +; CHECK-NEXT:    csrr a2, vlenb +; CHECK-NEXT:    slli a2, a2, 1 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    vs4r.v v24, (a1) # vscale x 32-byte Folded Spill +; CHECK-NEXT:    slli a2, a2, 1 +; CHECK-NEXT:    add a1, a1, a2 +; CHECK-NEXT:    ld a2, 0(sp) # 8-byte Folded Reload +; CHECK-NEXT:    vs2r.v v28, (a1) # vscale x 16-byte Folded Spill +; CHECK-NEXT:    ld a1, 8(sp) # 8-byte Folded Reload +; CHECK-NEXT:    vmv1r.v v20, v9 +; CHECK-NEXT:    sd t6, 0(t5) +; CHECK-NEXT:    vmv2r.v v16, v14 +; CHECK-NEXT:    vmv2r.v v14, v12 +; CHECK-NEXT:    vmv2r.v v12, v10 +; CHECK-NEXT:    vmv1r.v v11, v9 +; CHECK-NEXT:    vmv1r.v v21, v9 +; CHECK-NEXT:    csrr t5, vlenb +; CHECK-NEXT:    slli t5, t5, 3 +; CHECK-NEXT:    add t5, sp, t5 +; CHECK-NEXT:    addi t5, t5, 16 +; CHECK-NEXT:    vs2r.v v18, (t5) # vscale x 16-byte Folded Spill +; CHECK-NEXT:    csrr t6, vlenb +; CHECK-NEXT:    slli t6, t6, 1 +; CHECK-NEXT:    add t5, t5, t6 +; CHECK-NEXT:    vs2r.v v20, (t5) # vscale x 16-byte Folded Spill +; CHECK-NEXT:    vsetivli zero, 0, e32, m1, ta, ma +; CHECK-NEXT:    vmv.v.i v19, 0 +; CHECK-NEXT:    vmclr.m v10 +; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT:    vmv.v.i v6, 0 +; CHECK-NEXT:  .LBB0_1: # %for.body +; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1 +; CHECK-NEXT:    vmv1r.v v0, v10 +; CHECK-NEXT:    vmv1r.v v20, v19 +; CHECK-NEXT:    vmv1r.v v3, v19 +; CHECK-NEXT:    vmv1r.v v5, v19 +; CHECK-NEXT:    vmv1r.v v2, v19 +; CHECK-NEXT:    vmv1r.v v31, v19 +; CHECK-NEXT:    vmv1r.v v30, v19 +; CHECK-NEXT:    vmv1r.v v4, v19 +; CHECK-NEXT:    vmv2r.v v22, v10 +; CHECK-NEXT:    vmv4r.v v24, v12 +; CHECK-NEXT:    vmv2r.v v28, v16 +; CHECK-NEXT:    vmv2r.v v8, v6 +; CHECK-NEXT:    vmv1r.v v18, v19 +; CHECK-NEXT:    vmv1r.v v21, v10 +; CHECK-NEXT:    vsetvli zero, zero, e32, m1, tu, ma +; CHECK-NEXT:    vle32.v v20, (t4) +; CHECK-NEXT:    vle32.v v3, (t1) +; CHECK-NEXT:    vle32.v v30, (a7) +; CHECK-NEXT:    vle64.v v8, (a4) +; CHECK-NEXT:    vle32.v v5, (t2) +; CHECK-NEXT:    vle32.v v2, (t3) +; CHECK-NEXT:    vle32.v v31, (a6) +; CHECK-NEXT:    vmv1r.v v24, v30 +; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, mu +; CHECK-NEXT:    vmflt.vv v21, v8, v6, v0.t +; CHECK-NEXT:    vmv1r.v v8, v19 +; CHECK-NEXT:    vsetvli zero, zero, e32, m1, tu, mu +; CHECK-NEXT:    vle32.v v18, (a2) +; CHECK-NEXT:    vle32.v v8, (a3) +; CHECK-NEXT:    vle32.v v4, (a5) +; CHECK-NEXT:    vmv1r.v v22, v20 +; CHECK-NEXT:    csrr t5, vlenb +; CHECK-NEXT:    slli t5, t5, 3 +; CHECK-NEXT:    add t5, sp, t5 +; CHECK-NEXT:    addi t5, t5, 16 +; CHECK-NEXT:    vl1r.v v1, (t5) # vscale x 8-byte Folded Reload +; CHECK-NEXT:    csrr t6, vlenb +; CHECK-NEXT:    add t5, t5, t6 +; CHECK-NEXT:    vl2r.v v2, (t5) # vscale x 16-byte Folded Reload +; CHECK-NEXT:    slli t6, t6, 1 +; CHECK-NEXT:    add t5, t5, t6 +; CHECK-NEXT:    vl1r.v v4, (t5) # vscale x 8-byte Folded Reload +; CHECK-NEXT:    vsseg4e32.v v1, (zero) +; CHECK-NEXT:    vsseg8e32.v v22, (a1) +; CHECK-NEXT:    vmv1r.v v0, v21 +; CHECK-NEXT:    vssub.vv v8, v19, v18, v0.t +; CHECK-NEXT:    csrr t5, vlenb +; CHECK-NEXT:    slli t5, t5, 2 +; CHECK-NEXT:    mv t6, t5 +; CHECK-NEXT:    slli t5, t5, 1 +; CHECK-NEXT:    add t5, t5, t6 +; CHECK-NEXT:    add t5, sp, t5 +; CHECK-NEXT:    addi t5, t5, 16 +; CHECK-NEXT:    vl4r.v v20, (t5) # vscale x 32-byte Folded Reload +; CHECK-NEXT:    vsetvli zero, t0, e64, m2, ta, ma +; CHECK-NEXT:    vsseg2e64.v v20, (zero) +; CHECK-NEXT:    vmv1r.v v0, v10 +; CHECK-NEXT:    addi t5, sp, 16 +; CHECK-NEXT:    vl4r.v v20, (t5) # vscale x 32-byte Folded Reload +; CHECK-NEXT:    csrr t6, vlenb +; CHECK-NEXT:    slli t6, t6, 2 +; CHECK-NEXT:    add t5, t5, t6 +; CHECK-NEXT:    vl4r.v v24, (t5) # vscale x 32-byte Folded Reload +; CHECK-NEXT:    vsetivli zero, 0, e64, m2, ta, ma +; CHECK-NEXT:    vsseg4e64.v v20, (zero), v0.t +; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma +; CHECK-NEXT:    vsseg8e32.v v8, (a0) +; CHECK-NEXT:    csrr t5, vlenb +; CHECK-NEXT:    slli t5, t5, 4 +; CHECK-NEXT:    add t5, sp, t5 +; CHECK-NEXT:    addi t5, t5, 16 +; CHECK-NEXT:    vl4r.v v20, (t5) # vscale x 32-byte Folded Reload +; CHECK-NEXT:    csrr t6, vlenb +; CHECK-NEXT:    slli t6, t6, 2 +; CHECK-NEXT:    add t5, t5, t6 +; CHECK-NEXT:    vl4r.v v24, (t5) # vscale x 32-byte Folded Reload +; CHECK-NEXT:    vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT:    vsseg4e64.v v20, (zero) +; CHECK-NEXT:    j .LBB0_1 +entry: +  store double 0.000000e+00, ptr %var_117, align 8 +  store double 1.000000e+00, ptr %arrayinit.element3061, align 8 +  br label %for.body + +for.body:                                         ; preds = %for.body, %entry +  %2 = call <vscale x 2 x float> @llvm.riscv.vle.nxv2f32.p0.i64(<vscale x 2 x float> zeroinitializer, ptr %arrayinit.element3059, i64 0) +  %3 = call <vscale x 2 x float> @llvm.riscv.vle.nxv2f32.p0.i64(<vscale x 2 x float> zeroinitializer, ptr %arrayinit.element3067, i64 0) +  %4 = call <vscale x 2 x float> @llvm.riscv.vle.nxv2f32.p0.i64(<vscale x 2 x float> zeroinitializer, ptr %arrayinit.element3065, i64 0) +  %5 = call <vscale x 2 x float> @llvm.riscv.vle.nxv2f32.p0.i64(<vscale x 2 x float> zeroinitializer, ptr %arrayinit.element3063, i64 0) +  %6 = call <vscale x 2 x float> @llvm.riscv.vle.nxv2f32.p0.i64(<vscale x 2 x float> zeroinitializer, ptr %arrayinit.element3055, i64 0) +  %7 = call <vscale x 2 x float> @llvm.riscv.vle.nxv2f32.p0.i64(<vscale x 2 x float> zeroinitializer, ptr %arrayinit.element3057, i64 0) +  %8 = call <vscale x 2 x float> @llvm.riscv.vle.nxv2f32.p0.i64(<vscale x 2 x float> zeroinitializer, ptr %arrayinit.element3053, i64 0) +  %9 = call <vscale x 2 x double> @llvm.riscv.vle.nxv2f64.p0.i64(<vscale x 2 x double> zeroinitializer, ptr %arrayinit.element3051, i64 0) +  %10 = tail call <vscale x 2 x i32> @llvm.riscv.vle.nxv2i32.p0.i64(<vscale x 2 x i32> zeroinitializer, ptr %arrayinit.element3047, i64 0) +  %11 = tail call <vscale x 2 x i32> @llvm.riscv.vle.nxv2i32.p0.i64(<vscale x 2 x i32> zeroinitializer, ptr %arrayinit.element3049, i64 0) +  call void @llvm.riscv.vsseg4.triscv.vector.tuple_nxv8i8_4t.p0.i64(target("riscv.vector.tuple", <vscale x 8 x i8>, 4) zeroinitializer, ptr null, i64 0, i64 5) +  %12 = tail call target("riscv.vector.tuple", <vscale x 8 x i8>, 8) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv8i8_8t.nxv2f32(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) zeroinitializer, <vscale x 2 x float> %8, i32 0) +  %13 = tail call target("riscv.vector.tuple", <vscale x 8 x i8>, 8) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv8i8_8t.nxv2f32(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) %12, <vscale x 2 x float> %7, i32 2) +  %14 = tail call target("riscv.vector.tuple", <vscale x 8 x i8>, 8) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv8i8_8t.nxv2f32(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) %13, <vscale x 2 x float> %6, i32 0) +  %15 = tail call target("riscv.vector.tuple", <vscale x 8 x i8>, 8) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv8i8_8t.nxv2f32(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) %14, <vscale x 2 x float> %5, i32 0) +  %16 = tail call target("riscv.vector.tuple", <vscale x 8 x i8>, 8) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv8i8_8t.nxv2f32(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) %15, <vscale x 2 x float> %4, i32 0) +  %17 = tail call target("riscv.vector.tuple", <vscale x 8 x i8>, 8) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv8i8_8t.nxv2f32(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) %16, <vscale x 2 x float> %3, i32 0) +  %18 = tail call target("riscv.vector.tuple", <vscale x 8 x i8>, 8) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv8i8_8t.nxv2f32(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) %17, <vscale x 2 x float> %2, i32 0) +  call void @llvm.riscv.vsseg8.triscv.vector.tuple_nxv8i8_8t.p0.i64(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) %18, ptr %arrayinit.element3045, i64 0, i64 5) +  %19 = tail call <vscale x 2 x i1> @llvm.riscv.vmfgt.mask.nxv2f64.nxv2f64.i64(<vscale x 2 x i1> zeroinitializer, <vscale x 2 x double> zeroinitializer, <vscale x 2 x double> %9, <vscale x 2 x i1> zeroinitializer, i64 0) +  %20 = tail call <vscale x 2 x i32> @llvm.riscv.vssub.mask.nxv2i32.nxv2i32.i64(<vscale x 2 x i32> %11, <vscale x 2 x i32> zeroinitializer, <vscale x 2 x i32> %10, <vscale x 2 x i1> %19, i64 0, i64 0) +  call void @llvm.riscv.vsseg2.triscv.vector.tuple_nxv16i8_2t.p0.i64(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %0, ptr null, i64 %var_94_i.07698, i64 6) +  call void @llvm.riscv.vsseg4.mask.triscv.vector.tuple_nxv16i8_4t.p0.nxv2i1.i64(target("riscv.vector.tuple", <vscale x 16 x i8>, 4) zeroinitializer, ptr null, <vscale x 2 x i1> zeroinitializer, i64 0, i64 6) +  %21 = tail call target("riscv.vector.tuple", <vscale x 8 x i8>, 8) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv8i8_8t.nxv2i32(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) poison, <vscale x 2 x i32> %20, i32 0) +  call void @llvm.riscv.vsseg8.triscv.vector.tuple_nxv8i8_8t.p0.i64(target("riscv.vector.tuple", <vscale x 8 x i8>, 8) %21, ptr %var_117, i64 0, i64 5) +  call void @llvm.riscv.vsseg4.triscv.vector.tuple_nxv16i8_4t.p0.i64(target("riscv.vector.tuple", <vscale x 16 x i8>, 4) %1, ptr null, i64 0, i64 6) +  br label %for.body +} diff --git a/llvm/test/CodeGen/RISCV/rvv/zvlsseg-spill.mir b/llvm/test/CodeGen/RISCV/rvv/zvlsseg-spill.mir index dd9960d..9c2fa9d 100644 --- a/llvm/test/CodeGen/RISCV/rvv/zvlsseg-spill.mir +++ b/llvm/test/CodeGen/RISCV/rvv/zvlsseg-spill.mir @@ -32,10 +32,10 @@ body: |      ; CHECK-NEXT: $x11 = ADDI $x2, 16      ; CHECK-NEXT: VS4R_V $v0m4, $x11, implicit $v0_v1_v2_v3_v4_v5_v6 :: (store (<vscale x 1 x s256>) into %stack.0, align 8)      ; CHECK-NEXT: $x12 = PseudoReadVLENB -    ; CHECK-NEXT: $x13 = SLLI $x12, 2 -    ; CHECK-NEXT: $x11 = ADD killed $x11, killed $x13 +    ; CHECK-NEXT: $x12 = SLLI killed $x12, 2 +    ; CHECK-NEXT: $x11 = ADD killed $x11, $x12      ; CHECK-NEXT: VS2R_V $v4m2, $x11, implicit $v0_v1_v2_v3_v4_v5_v6 :: (store (<vscale x 1 x s128>) into %stack.0, align 8) -    ; CHECK-NEXT: $x12 = SLLI killed $x12, 1 +    ; CHECK-NEXT: $x12 = SRLI killed $x12, 1      ; CHECK-NEXT: $x11 = ADD killed $x11, killed $x12      ; CHECK-NEXT: VS1R_V $v6, killed $x11, implicit $v0_v1_v2_v3_v4_v5_v6 :: (store (<vscale x 1 x s64>) into %stack.0)      ; CHECK-NEXT: $x11 = ADDI $x2, 16 @@ -93,10 +93,10 @@ body: |      ; CHECK-NEXT: $x11 = ADDI $x2, 16      ; CHECK-NEXT: $v10m2 = VL2RE8_V $x11 :: (load (<vscale x 1 x s128>) from %stack.0, align 8)      ; CHECK-NEXT: $x12 = PseudoReadVLENB -    ; CHECK-NEXT: $x13 = SLLI $x12, 1 -    ; CHECK-NEXT: $x11 = ADD killed $x11, killed $x13 +    ; CHECK-NEXT: $x12 = SLLI killed $x12, 1 +    ; CHECK-NEXT: $x11 = ADD killed $x11, $x12      ; CHECK-NEXT: $v12m4 = VL4RE8_V $x11 :: (load (<vscale x 1 x s256>) from %stack.0, align 8) -    ; CHECK-NEXT: $x12 = SLLI killed $x12, 2 +    ; CHECK-NEXT: $x12 = SLLI killed $x12, 1      ; CHECK-NEXT: $x11 = ADD killed $x11, killed $x12      ; CHECK-NEXT: $v16 = VL1RE8_V killed $x11 :: (load (<vscale x 1 x s64>) from %stack.0)      ; CHECK-NEXT: VS1R_V killed $v10, killed renamable $x10 diff --git a/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll b/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll index 73c46b1..c9b2968 100644 --- a/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll +++ b/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll @@ -10,6 +10,7 @@  ; CHECK-DAG: %[[#Int8:]] = OpTypeInt 8 0  ; CHECK-DAG: %[[#Half:]] = OpTypeFloat 16 +; CHECK-DAG: %[[#Float:]] = OpTypeFloat 32  ; CHECK-DAG: %[[#Struct:]] = OpTypeStruct %[[#Half]]  ; CHECK-DAG: %[[#Void:]] = OpTypeVoid  ; CHECK-DAG: %[[#PtrInt8:]] = OpTypePointer CrossWorkgroup %[[#Int8:]] @@ -17,12 +18,20 @@  ; CHECK-DAG: %[[#Int64:]] = OpTypeInt 64 0  ; CHECK-DAG: %[[#PtrInt64:]] = OpTypePointer CrossWorkgroup %[[#Int64]]  ; CHECK-DAG: %[[#BarType:]] = OpTypeFunction %[[#Void]] %[[#PtrInt64]] %[[#Struct]] +; CHECK-DAG: %[[#BazType:]] = OpTypeFunction %[[#Void]] %[[#PtrInt8]] %[[#Struct]] %[[#Int8]] %[[#Struct]] %[[#Float]] %[[#Struct]]  ; CHECK: OpFunction %[[#Void]] None %[[#FooType]]  ; CHECK: OpFunctionParameter %[[#PtrInt8]]  ; CHECK: OpFunctionParameter %[[#Struct]]  ; CHECK: OpFunction %[[#Void]] None %[[#BarType]]  ; CHECK: OpFunctionParameter %[[#PtrInt64]]  ; CHECK: OpFunctionParameter %[[#Struct]] +; CHECK: OpFunction %[[#Void]] None %[[#BazType]] +; CHECK: OpFunctionParameter %[[#PtrInt8]] +; CHECK: OpFunctionParameter %[[#Struct]] +; CHECK: OpFunctionParameter %[[#Int8]] +; CHECK: OpFunctionParameter %[[#Struct]] +; CHECK: OpFunctionParameter %[[#Float]] +; CHECK: OpFunctionParameter %[[#Struct]]  %t_half = type { half } @@ -38,4 +47,9 @@ entry:    ret void  } +define spir_kernel void @baz(ptr addrspace(1) %a, %t_half %b, i8 %c, %t_half %d, float %e, %t_half %f) { +entry: +  ret void +} +  declare spir_func %t_half @_Z29__spirv_SpecConstantComposite(half) diff --git a/llvm/test/CodeGen/SystemZ/stackmap.ll b/llvm/test/CodeGen/SystemZ/stackmap.ll index 05b8de7..f414ea3 100644 --- a/llvm/test/CodeGen/SystemZ/stackmap.ll +++ b/llvm/test/CodeGen/SystemZ/stackmap.ll @@ -84,14 +84,14 @@  ; CHECK-NEXT:   .short  8  ; CHECK-NEXT:   .short  0  ; CHECK-NEXT:   .short  0 -; CHECK-NEXT:   .long   65535 +; CHECK-NEXT:   .long   -1  ; SmallConstant  ; CHECK-NEXT:   .byte   4  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .short  8  ; CHECK-NEXT:   .short  0  ; CHECK-NEXT:   .short  0 -; CHECK-NEXT:   .long   65535 +; CHECK-NEXT:   .long   -1  ; SmallConstant  ; CHECK-NEXT:   .byte   4  ; CHECK-NEXT:   .byte   0 diff --git a/llvm/test/CodeGen/X86/bittest-big-integer.ll b/llvm/test/CodeGen/X86/bittest-big-integer.ll index 5776c6c..c311ab8 100644 --- a/llvm/test/CodeGen/X86/bittest-big-integer.ll +++ b/llvm/test/CodeGen/X86/bittest-big-integer.ll @@ -2,8 +2,8 @@  ; RUN: llc < %s -mtriple=i686--                   | FileCheck %s --check-prefixes=X86  ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64    | FileCheck %s --check-prefixes=X64,SSE  ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=X64,SSE -; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=X64,AVX -; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=X64,AVX +; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=X64,AVX,AVX2 +; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=X64,AVX,AVX512  ; bt/btc/btr/bts patterns + 'init' to set single bit value in large integers @@ -356,20 +356,41 @@ define i1 @init_eq_i64(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx  ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT:    movl %ecx, %esi -; X86-NEXT:    andl $32, %esi -; X86-NEXT:    shrl $3, %esi -; X86-NEXT:    movl (%edx,%esi), %edi -; X86-NEXT:    btl %ecx, %edi +; X86-NEXT:    movl $1, %edx +; X86-NEXT:    xorl %esi, %esi +; X86-NEXT:    shldl %cl, %edx, %esi +; X86-NEXT:    shll %cl, %edx +; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax +; X86-NEXT:    xorl %edi, %edi +; X86-NEXT:    shldl %cl, %eax, %edi +; X86-NEXT:    shll %cl, %eax +; X86-NEXT:    testb $32, %cl +; X86-NEXT:    je .LBB9_2 +; X86-NEXT:  # %bb.1: +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    movl $0, %edx +; X86-NEXT:  .LBB9_2: +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx +; X86-NEXT:    notl %esi +; X86-NEXT:    notl %edx +; X86-NEXT:    je .LBB9_4 +; X86-NEXT:  # %bb.3: +; X86-NEXT:    movl %eax, %edi +; X86-NEXT:    xorl %eax, %eax +; X86-NEXT:  .LBB9_4: +; X86-NEXT:    andl 4(%ebx), %esi +; X86-NEXT:    orl %edi, %esi +; X86-NEXT:    andl (%ebx), %edx +; X86-NEXT:    orl %eax, %edx +; X86-NEXT:    movl %ecx, %eax +; X86-NEXT:    andl $32, %eax +; X86-NEXT:    shrl $3, %eax +; X86-NEXT:    movl (%ebx,%eax), %eax +; X86-NEXT:    btl %ecx, %eax  ; X86-NEXT:    setae %al -; X86-NEXT:    btrl %ecx, %edi -; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %ebx -; X86-NEXT:    orl %edi, %ebx -; X86-NEXT:    movl %ebx, (%edx,%esi) +; X86-NEXT:    movl %edx, (%ebx) +; X86-NEXT:    movl %esi, 4(%ebx)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi  ; X86-NEXT:    popl %ebx @@ -579,55 +600,208 @@ define i1 @set_ne_i128(ptr %word, i32 %position) nounwind {  define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-LABEL: init_eq_i128:  ; X86:       # %bb.0: +; X86-NEXT:    pushl %ebp +; X86-NEXT:    movl %esp, %ebp  ; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx -; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT:    movl %ecx, %esi -; X86-NEXT:    andl $96, %esi -; X86-NEXT:    shrl $3, %esi -; X86-NEXT:    movl (%edx,%esi), %edi -; X86-NEXT:    btl %ecx, %edi -; X86-NEXT:    setae %al -; X86-NEXT:    btrl %ecx, %edi -; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx +; X86-NEXT:    andl $-16, %esp +; X86-NEXT:    subl $96, %esp +; X86-NEXT:    movl 12(%ebp), %ecx +; X86-NEXT:    movzbl 16(%ebp), %ebx +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl %ecx, %eax +; X86-NEXT:    shrb $3, %al +; X86-NEXT:    andb $12, %al +; X86-NEXT:    negb %al +; X86-NEXT:    movsbl %al, %eax +; X86-NEXT:    movl 64(%esp,%eax), %edx +; X86-NEXT:    movl 68(%esp,%eax), %esi +; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl %eax, %esi +; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill +; X86-NEXT:    movzbl %bl, %eax +; X86-NEXT:    movl 72(%esp,%esi), %ebx +; X86-NEXT:    movl 76(%esp,%esi), %esi +; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp) +; X86-NEXT:    movl %ebx, %edi +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    shldl %cl, %eax, %edi +; X86-NEXT:    shldl %cl, %ebx, %esi +; X86-NEXT:    movl %edx, %ebx  ; X86-NEXT:    shll %cl, %ebx -; X86-NEXT:    orl %edi, %ebx -; X86-NEXT:    movl %ebx, (%edx,%esi) +; X86-NEXT:    # kill: def $cl killed $cl killed $ecx +; X86-NEXT:    shldl %cl, %edx, %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    notl %edi +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl (%esp), %ecx # 4-byte Reload +; X86-NEXT:    movl 36(%esp,%ecx), %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 40(%esp,%ecx), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 12(%ebp), %ecx +; X86-NEXT:    # kill: def $cl killed $cl killed $ecx +; X86-NEXT:    shldl %cl, %eax, %edx +; X86-NEXT:    movl 8(%ebp), %eax +; X86-NEXT:    andl 8(%eax), %edi +; X86-NEXT:    orl %edx, %edi +; X86-NEXT:    notl %esi +; X86-NEXT:    movl (%esp), %eax # 4-byte Reload +; X86-NEXT:    movl 44(%esp,%eax), %eax +; X86-NEXT:    movl 12(%ebp), %ecx +; X86-NEXT:    # kill: def $cl killed $cl killed $ecx +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload +; X86-NEXT:    shldl %cl, %edx, %eax +; X86-NEXT:    movl 8(%ebp), %ecx +; X86-NEXT:    andl 12(%ecx), %esi +; X86-NEXT:    orl %eax, %esi +; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl (%esp), %eax # 4-byte Reload +; X86-NEXT:    movl 32(%esp,%eax), %edx +; X86-NEXT:    movl %edx, (%esp) # 4-byte Spill +; X86-NEXT:    movl 12(%ebp), %ecx +; X86-NEXT:    shll %cl, %edx +; X86-NEXT:    movl 8(%ebp), %eax +; X86-NEXT:    andl (%eax), %ebx +; X86-NEXT:    orl %edx, %ebx +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload +; X86-NEXT:    notl %edx +; X86-NEXT:    # kill: def $cl killed $cl killed $ecx +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl (%esp), %esi # 4-byte Reload +; X86-NEXT:    shldl %cl, %esi, %eax +; X86-NEXT:    movl 8(%ebp), %ecx +; X86-NEXT:    andl 4(%ecx), %edx +; X86-NEXT:    orl %eax, %edx +; X86-NEXT:    movl 12(%ebp), %esi +; X86-NEXT:    movl %esi, %eax +; X86-NEXT:    andl $96, %eax +; X86-NEXT:    shrl $3, %eax +; X86-NEXT:    movl (%ecx,%eax), %eax +; X86-NEXT:    btl %esi, %eax +; X86-NEXT:    movl %ecx, %eax +; X86-NEXT:    movl %edi, 8(%ecx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload +; X86-NEXT:    movl %ecx, 12(%eax) +; X86-NEXT:    movl %ebx, (%eax) +; X86-NEXT:    movl %edx, 4(%eax) +; X86-NEXT:    setae %al +; X86-NEXT:    leal -12(%ebp), %esp  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi  ; X86-NEXT:    popl %ebx +; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ;  ; SSE-LABEL: init_eq_i128:  ; SSE:       # %bb.0:  ; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    andl $96, %esi -; SSE-NEXT:    shrl $3, %esi -; SSE-NEXT:    movl (%rdi,%rsi), %r8d -; SSE-NEXT:    btl %ecx, %r8d +; SSE-NEXT:    movl $1, %esi +; SSE-NEXT:    xorl %r8d, %r8d +; SSE-NEXT:    shldq %cl, %rsi, %r8 +; SSE-NEXT:    shlq %cl, %rsi +; SSE-NEXT:    movl %edx, %eax +; SSE-NEXT:    xorl %edx, %edx +; SSE-NEXT:    shldq %cl, %rax, %rdx +; SSE-NEXT:    shlq %cl, %rax +; SSE-NEXT:    xorl %r9d, %r9d +; SSE-NEXT:    testb $64, %cl +; SSE-NEXT:    cmovneq %rsi, %r8 +; SSE-NEXT:    cmovneq %r9, %rsi +; SSE-NEXT:    notq %r8 +; SSE-NEXT:    cmovneq %rax, %rdx +; SSE-NEXT:    cmovneq %r9, %rax +; SSE-NEXT:    notq %rsi +; SSE-NEXT:    andq 8(%rdi), %r8 +; SSE-NEXT:    orq %rdx, %r8 +; SSE-NEXT:    andq (%rdi), %rsi +; SSE-NEXT:    orq %rax, %rsi +; SSE-NEXT:    movl %ecx, %eax +; SSE-NEXT:    andl $96, %eax +; SSE-NEXT:    shrl $3, %eax +; SSE-NEXT:    movl (%rdi,%rax), %eax +; SSE-NEXT:    btl %ecx, %eax  ; SSE-NEXT:    setae %al -; SSE-NEXT:    shll %cl, %edx -; SSE-NEXT:    btrl %ecx, %r8d -; SSE-NEXT:    orl %r8d, %edx -; SSE-NEXT:    movl %edx, (%rdi,%rsi) +; SSE-NEXT:    movq %rsi, (%rdi) +; SSE-NEXT:    movq %r8, 8(%rdi)  ; SSE-NEXT:    retq  ; -; AVX-LABEL: init_eq_i128: -; AVX:       # %bb.0: -; AVX-NEXT:    movl %esi, %ecx -; AVX-NEXT:    andl $96, %ecx -; AVX-NEXT:    shrl $3, %ecx -; AVX-NEXT:    movl (%rdi,%rcx), %r8d -; AVX-NEXT:    btl %esi, %r8d -; AVX-NEXT:    setae %al -; AVX-NEXT:    btrl %esi, %r8d -; AVX-NEXT:    shlxl %esi, %edx, %edx -; AVX-NEXT:    orl %r8d, %edx -; AVX-NEXT:    movl %edx, (%rdi,%rcx) -; AVX-NEXT:    retq +; AVX2-LABEL: init_eq_i128: +; AVX2:       # %bb.0: +; AVX2-NEXT:    movl %esi, %ecx +; AVX2-NEXT:    movl $1, %eax +; AVX2-NEXT:    xorl %esi, %esi +; AVX2-NEXT:    shldq %cl, %rax, %rsi +; AVX2-NEXT:    movl %edx, %edx +; AVX2-NEXT:    xorl %r8d, %r8d +; AVX2-NEXT:    shldq %cl, %rdx, %r8 +; AVX2-NEXT:    xorl %r9d, %r9d +; AVX2-NEXT:    shlxq %rcx, %rax, %rax +; AVX2-NEXT:    testb $64, %cl +; AVX2-NEXT:    cmovneq %rax, %rsi +; AVX2-NEXT:    cmovneq %r9, %rax +; AVX2-NEXT:    shlxq %rcx, %rdx, %rdx +; AVX2-NEXT:    cmovneq %rdx, %r8 +; AVX2-NEXT:    cmovneq %r9, %rdx +; AVX2-NEXT:    andnq 8(%rdi), %rsi, %rsi +; AVX2-NEXT:    orq %r8, %rsi +; AVX2-NEXT:    andnq (%rdi), %rax, %r8 +; AVX2-NEXT:    orq %rdx, %r8 +; AVX2-NEXT:    movl %ecx, %eax +; AVX2-NEXT:    andl $96, %eax +; AVX2-NEXT:    shrl $3, %eax +; AVX2-NEXT:    movl (%rdi,%rax), %eax +; AVX2-NEXT:    btl %ecx, %eax +; AVX2-NEXT:    setae %al +; AVX2-NEXT:    movq %r8, (%rdi) +; AVX2-NEXT:    movq %rsi, 8(%rdi) +; AVX2-NEXT:    retq +; +; AVX512-LABEL: init_eq_i128: +; AVX512:       # %bb.0: +; AVX512-NEXT:    movl %esi, %ecx +; AVX512-NEXT:    movl $1, %eax +; AVX512-NEXT:    xorl %esi, %esi +; AVX512-NEXT:    shldq %cl, %rax, %rsi +; AVX512-NEXT:    xorl %r8d, %r8d +; AVX512-NEXT:    shlxq %rcx, %rax, %rax +; AVX512-NEXT:    movl %edx, %edx +; AVX512-NEXT:    xorl %r9d, %r9d +; AVX512-NEXT:    shldq %cl, %rdx, %r9 +; AVX512-NEXT:    testb $64, %cl +; AVX512-NEXT:    cmovneq %rax, %rsi +; AVX512-NEXT:    cmovneq %r8, %rax +; AVX512-NEXT:    shlxq %rcx, %rdx, %rdx +; AVX512-NEXT:    cmovneq %rdx, %r9 +; AVX512-NEXT:    cmovneq %r8, %rdx +; AVX512-NEXT:    andnq 8(%rdi), %rsi, %rsi +; AVX512-NEXT:    orq %r9, %rsi +; AVX512-NEXT:    andnq (%rdi), %rax, %r8 +; AVX512-NEXT:    orq %rdx, %r8 +; AVX512-NEXT:    movl %ecx, %eax +; AVX512-NEXT:    andl $96, %eax +; AVX512-NEXT:    shrl $3, %eax +; AVX512-NEXT:    movl (%rdi,%rax), %eax +; AVX512-NEXT:    btl %ecx, %eax +; AVX512-NEXT:    setae %al +; AVX512-NEXT:    movq %r8, (%rdi) +; AVX512-NEXT:    movq %rsi, 8(%rdi) +; AVX512-NEXT:    retq    %rem = and i32 %position, 127    %ofs = zext nneg i32 %rem to i128    %bit = shl nuw i128 1, %ofs @@ -803,55 +977,673 @@ define i1 @set_ne_i512(ptr %word, i32 %position) nounwind {  define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-LABEL: init_eq_i512:  ; X86:       # %bb.0: +; X86-NEXT:    pushl %ebp +; X86-NEXT:    movl %esp, %ebp  ; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx -; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT:    movl %ecx, %esi -; X86-NEXT:    shrl $3, %esi -; X86-NEXT:    andl $60, %esi -; X86-NEXT:    movl (%edx,%esi), %edi -; X86-NEXT:    btl %ecx, %edi -; X86-NEXT:    setae %al -; X86-NEXT:    btrl %ecx, %edi -; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ebx -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %ebx +; X86-NEXT:    andl $-16, %esp +; X86-NEXT:    subl $352, %esp # imm = 0x160 +; X86-NEXT:    movl 12(%ebp), %ecx +; X86-NEXT:    movl %ecx, %edx +; X86-NEXT:    shrl $3, %edx +; X86-NEXT:    andl $60, %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax +; X86-NEXT:    subl %edx, %eax +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl 56(%eax), %esi +; X86-NEXT:    movl 60(%eax), %ebx +; X86-NEXT:    movl 52(%eax), %edi +; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 48(%eax), %edi +; X86-NEXT:    movl 44(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 40(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 36(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 32(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 28(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 24(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 20(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 16(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 12(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 8(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl (%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 4(%eax), %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movzbl 16(%ebp), %eax +; X86-NEXT:    movzbl %al, %eax +; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp) +; X86-NEXT:    andl $31, %ecx +; X86-NEXT:    shldl %cl, %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    shldl %cl, %eax, %esi +; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    shldl %cl, %edi, %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    shldl %cl, %ebx, %edi +; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload +; X86-NEXT:    shldl %cl, %edx, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    shldl %cl, %eax, %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload +; X86-NEXT:    shldl %cl, %edx, %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    shldl %cl, %eax, %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload +; X86-NEXT:    shldl %cl, %edx, %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    shldl %cl, %eax, %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload +; X86-NEXT:    shldl %cl, %edx, %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    shldl %cl, %eax, %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload +; X86-NEXT:    shldl %cl, %edx, %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload +; X86-NEXT:    shldl %cl, %esi, %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    shldl %cl, %eax, %esi +; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    shll %cl, %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax +; X86-NEXT:    subl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) +; X86-NEXT:    movl 56(%eax), %esi +; X86-NEXT:    movl 60(%eax), %edi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    movl 8(%ebp), %edx +; X86-NEXT:    andl 60(%edx), %ebx  ; X86-NEXT:    orl %edi, %ebx -; X86-NEXT:    movl %ebx, (%edx,%esi) +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 52(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 56(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 48(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 52(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 44(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 48(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 40(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 44(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 36(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 40(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 32(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 36(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 28(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 32(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 24(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 28(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 20(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 24(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 16(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 20(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 12(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 16(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 8(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 12(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 4(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 8(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload +; X86-NEXT:    notl %esi +; X86-NEXT:    movl (%eax), %eax +; X86-NEXT:    shldl %cl, %eax, %edi +; X86-NEXT:    andl 4(%edx), %esi +; X86-NEXT:    orl %edi, %esi +; X86-NEXT:    movl %esi, %edi +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload +; X86-NEXT:    notl %esi +; X86-NEXT:    shll %cl, %eax +; X86-NEXT:    andl (%edx), %esi +; X86-NEXT:    orl %eax, %esi +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl (%edx,%eax), %eax +; X86-NEXT:    btl %ecx, %eax +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 60(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 56(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 52(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 48(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 44(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 40(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 36(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 32(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 28(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 24(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 20(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 16(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 12(%edx) +; X86-NEXT:    movl %ebx, 8(%edx) +; X86-NEXT:    movl %edi, 4(%edx) +; X86-NEXT:    movl %esi, (%edx) +; X86-NEXT:    setae %al +; X86-NEXT:    leal -12(%ebp), %esp  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi  ; X86-NEXT:    popl %ebx +; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ;  ; SSE-LABEL: init_eq_i512:  ; SSE:       # %bb.0: +; SSE-NEXT:    pushq %rbp +; SSE-NEXT:    pushq %r15 +; SSE-NEXT:    pushq %r14 +; SSE-NEXT:    pushq %r13 +; SSE-NEXT:    pushq %r12 +; SSE-NEXT:    pushq %rbx +; SSE-NEXT:    subq $168, %rsp +; SSE-NEXT:    movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill +; SSE-NEXT:    xorps %xmm0, %xmm0 +; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movq $0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movq $1, {{[0-9]+}}(%rsp)  ; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    shrl $3, %esi -; SSE-NEXT:    andl $60, %esi -; SSE-NEXT:    movl (%rdi,%rsi), %r8d -; SSE-NEXT:    btl %ecx, %r8d +; SSE-NEXT:    andl $63, %ecx +; SSE-NEXT:    movl %esi, %eax +; SSE-NEXT:    shrl $3, %eax +; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; SSE-NEXT:    # kill: def $eax killed $eax killed $rax +; SSE-NEXT:    andl $56, %eax +; SSE-NEXT:    negl %eax +; SSE-NEXT:    movslq %eax, %r12 +; SSE-NEXT:    movq 136(%rsp,%r12), %r9 +; SSE-NEXT:    movq 144(%rsp,%r12), %rax +; SSE-NEXT:    movq %rax, %rsi +; SSE-NEXT:    shldq %cl, %r9, %rsi +; SSE-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; SSE-NEXT:    movq 152(%rsp,%r12), %r11 +; SSE-NEXT:    shldq %cl, %rax, %r11 +; SSE-NEXT:    movq 120(%rsp,%r12), %r10 +; SSE-NEXT:    movq 128(%rsp,%r12), %rax +; SSE-NEXT:    movq %rax, %rbx +; SSE-NEXT:    shldq %cl, %r10, %rbx +; SSE-NEXT:    shldq %cl, %rax, %r9 +; SSE-NEXT:    movq 104(%rsp,%r12), %r14 +; SSE-NEXT:    movq 112(%rsp,%r12), %rax +; SSE-NEXT:    movq %rax, %r15 +; SSE-NEXT:    shldq %cl, %r14, %r15 +; SSE-NEXT:    shldq %cl, %rax, %r10 +; SSE-NEXT:    movq 96(%rsp,%r12), %rax +; SSE-NEXT:    movq %rax, %r13 +; SSE-NEXT:    shlq %cl, %r13 +; SSE-NEXT:    shldq %cl, %rax, %r14 +; SSE-NEXT:    movl %edx, %eax +; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) +; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) +; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) +; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) +; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) +; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) +; SSE-NEXT:    movq %rax, -{{[0-9]+}}(%rsp) +; SSE-NEXT:    movq $0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movq 8(%rsp,%r12), %r8 +; SSE-NEXT:    movq 16(%rsp,%r12), %rsi +; SSE-NEXT:    movq %rsi, %rbp +; SSE-NEXT:    shldq %cl, %r8, %rbp +; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload +; SSE-NEXT:    notq %rax +; SSE-NEXT:    andq 48(%rdi), %rax +; SSE-NEXT:    orq %rbp, %rax +; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; SSE-NEXT:    notq %rbx +; SSE-NEXT:    notq %r11 +; SSE-NEXT:    movq 24(%rsp,%r12), %rax +; SSE-NEXT:    shldq %cl, %rsi, %rax +; SSE-NEXT:    movq -8(%rsp,%r12), %rbp +; SSE-NEXT:    movq (%rsp,%r12), %rdx +; SSE-NEXT:    movq %rdx, %rsi +; SSE-NEXT:    shldq %cl, %rbp, %rsi +; SSE-NEXT:    andq 56(%rdi), %r11 +; SSE-NEXT:    andq 32(%rdi), %rbx +; SSE-NEXT:    orq %rax, %r11 +; SSE-NEXT:    orq %rsi, %rbx +; SSE-NEXT:    notq %r15 +; SSE-NEXT:    shldq %cl, %rdx, %r8 +; SSE-NEXT:    notq %r9 +; SSE-NEXT:    andq 40(%rdi), %r9 +; SSE-NEXT:    orq %r8, %r9 +; SSE-NEXT:    movq -24(%rsp,%r12), %rax +; SSE-NEXT:    movq -16(%rsp,%r12), %rdx +; SSE-NEXT:    movq %rdx, %rsi +; SSE-NEXT:    shldq %cl, %rax, %rsi +; SSE-NEXT:    andq 16(%rdi), %r15 +; SSE-NEXT:    orq %rsi, %r15 +; SSE-NEXT:    shldq %cl, %rdx, %rbp +; SSE-NEXT:    notq %r10 +; SSE-NEXT:    notq %r13 +; SSE-NEXT:    movq -32(%rsp,%r12), %rdx +; SSE-NEXT:    movq %rdx, %rsi +; SSE-NEXT:    shlq %cl, %rsi +; SSE-NEXT:    andq 24(%rdi), %r10 +; SSE-NEXT:    andq (%rdi), %r13 +; SSE-NEXT:    orq %rbp, %r10 +; SSE-NEXT:    orq %rsi, %r13 +; SSE-NEXT:    notq %r14 +; SSE-NEXT:    # kill: def $cl killed $cl killed $ecx +; SSE-NEXT:    shldq %cl, %rdx, %rax +; SSE-NEXT:    andq 8(%rdi), %r14 +; SSE-NEXT:    orq %rax, %r14 +; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload +; SSE-NEXT:    andl $60, %eax +; SSE-NEXT:    movl (%rdi,%rax), %eax +; SSE-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload +; SSE-NEXT:    btl %ecx, %eax +; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload +; SSE-NEXT:    movq %rax, 48(%rdi) +; SSE-NEXT:    movq %r11, 56(%rdi) +; SSE-NEXT:    movq %rbx, 32(%rdi) +; SSE-NEXT:    movq %r9, 40(%rdi) +; SSE-NEXT:    movq %r15, 16(%rdi) +; SSE-NEXT:    movq %r10, 24(%rdi) +; SSE-NEXT:    movq %r13, (%rdi) +; SSE-NEXT:    movq %r14, 8(%rdi)  ; SSE-NEXT:    setae %al -; SSE-NEXT:    shll %cl, %edx -; SSE-NEXT:    btrl %ecx, %r8d -; SSE-NEXT:    orl %r8d, %edx -; SSE-NEXT:    movl %edx, (%rdi,%rsi) +; SSE-NEXT:    addq $168, %rsp +; SSE-NEXT:    popq %rbx +; SSE-NEXT:    popq %r12 +; SSE-NEXT:    popq %r13 +; SSE-NEXT:    popq %r14 +; SSE-NEXT:    popq %r15 +; SSE-NEXT:    popq %rbp  ; SSE-NEXT:    retq  ; -; AVX-LABEL: init_eq_i512: -; AVX:       # %bb.0: -; AVX-NEXT:    movl %esi, %ecx -; AVX-NEXT:    shrl $3, %ecx -; AVX-NEXT:    andl $60, %ecx -; AVX-NEXT:    movl (%rdi,%rcx), %r8d -; AVX-NEXT:    btl %esi, %r8d -; AVX-NEXT:    setae %al -; AVX-NEXT:    btrl %esi, %r8d -; AVX-NEXT:    shlxl %esi, %edx, %edx -; AVX-NEXT:    orl %r8d, %edx -; AVX-NEXT:    movl %edx, (%rdi,%rcx) -; AVX-NEXT:    retq +; AVX2-LABEL: init_eq_i512: +; AVX2:       # %bb.0: +; AVX2-NEXT:    pushq %rbp +; AVX2-NEXT:    pushq %r15 +; AVX2-NEXT:    pushq %r14 +; AVX2-NEXT:    pushq %r13 +; AVX2-NEXT:    pushq %r12 +; AVX2-NEXT:    pushq %rbx +; AVX2-NEXT:    subq $184, %rsp +; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0 +; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) +; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) +; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) +; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = [1,0,0,0] +; AVX2-NEXT:    vmovups %ymm1, {{[0-9]+}}(%rsp) +; AVX2-NEXT:    movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill +; AVX2-NEXT:    movl %esi, %ecx +; AVX2-NEXT:    andl $63, %ecx +; AVX2-NEXT:    movl %esi, %ebx +; AVX2-NEXT:    shrl $3, %ebx +; AVX2-NEXT:    movl %ebx, %eax +; AVX2-NEXT:    andl $56, %eax +; AVX2-NEXT:    negl %eax +; AVX2-NEXT:    movslq %eax, %r11 +; AVX2-NEXT:    movq 128(%rsp,%r11), %r15 +; AVX2-NEXT:    movq 136(%rsp,%r11), %rax +; AVX2-NEXT:    movq %rax, %rsi +; AVX2-NEXT:    shldq %cl, %r15, %rsi +; AVX2-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; AVX2-NEXT:    movq 120(%rsp,%r11), %r8 +; AVX2-NEXT:    shldq %cl, %r8, %r15 +; AVX2-NEXT:    movq 144(%rsp,%r11), %r14 +; AVX2-NEXT:    movq 152(%rsp,%r11), %rsi +; AVX2-NEXT:    movq %rsi, %r9 +; AVX2-NEXT:    shldq %cl, %r14, %r9 +; AVX2-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; AVX2-NEXT:    shldq %cl, %rax, %r14 +; AVX2-NEXT:    movq 112(%rsp,%r11), %rax +; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; AVX2-NEXT:    movq 160(%rsp,%r11), %r13 +; AVX2-NEXT:    movq 168(%rsp,%r11), %r12 +; AVX2-NEXT:    shldq %cl, %r13, %r12 +; AVX2-NEXT:    shldq %cl, %rsi, %r13 +; AVX2-NEXT:    shldq %cl, %rax, %r8 +; AVX2-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; AVX2-NEXT:    movl %edx, %eax +; AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1 +; AVX2-NEXT:    vmovups %xmm1, {{[0-9]+}}(%rsp) +; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) +; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) +; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) +; AVX2-NEXT:    movq %rax, -{{[0-9]+}}(%rsp) +; AVX2-NEXT:    movq $0, {{[0-9]+}}(%rsp) +; AVX2-NEXT:    movq 24(%rsp,%r11), %rbp +; AVX2-NEXT:    movq 32(%rsp,%r11), %rdx +; AVX2-NEXT:    movq %rdx, %rax +; AVX2-NEXT:    shldq %cl, %rbp, %rax +; AVX2-NEXT:    movq 40(%rsp,%r11), %r10 +; AVX2-NEXT:    shldq %cl, %rdx, %r10 +; AVX2-NEXT:    movq 8(%rsp,%r11), %r9 +; AVX2-NEXT:    movq 16(%rsp,%r11), %rdx +; AVX2-NEXT:    movq %rdx, %r8 +; AVX2-NEXT:    shldq %cl, %r9, %r8 +; AVX2-NEXT:    shldq %cl, %rdx, %rbp +; AVX2-NEXT:    andnq 48(%rdi), %r13, %r13 +; AVX2-NEXT:    orq %rax, %r13 +; AVX2-NEXT:    movq -8(%rsp,%r11), %rax +; AVX2-NEXT:    movq (%rsp,%r11), %rdx +; AVX2-NEXT:    movq %rdx, %rsi +; AVX2-NEXT:    shldq %cl, %rax, %rsi +; AVX2-NEXT:    shldq %cl, %rdx, %r9 +; AVX2-NEXT:    andnq 56(%rdi), %r12, %r12 +; AVX2-NEXT:    andnq 32(%rdi), %r14, %r14 +; AVX2-NEXT:    orq %r10, %r12 +; AVX2-NEXT:    orq %r8, %r14 +; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload +; AVX2-NEXT:    andnq 40(%rdi), %rdx, %rdx +; AVX2-NEXT:    orq %rbp, %rdx +; AVX2-NEXT:    shlxq %rcx, {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload +; AVX2-NEXT:    movq -16(%rsp,%r11), %r10 +; AVX2-NEXT:    shlxq %rcx, %r10, %r11 +; AVX2-NEXT:    # kill: def $cl killed $cl killed $rcx +; AVX2-NEXT:    shldq %cl, %r10, %rax +; AVX2-NEXT:    andnq 16(%rdi), %r15, %rcx +; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload +; AVX2-NEXT:    andnq 24(%rdi), %r10, %r10 +; AVX2-NEXT:    orq %rsi, %rcx +; AVX2-NEXT:    orq %r9, %r10 +; AVX2-NEXT:    andnq (%rdi), %r8, %rsi +; AVX2-NEXT:    orq %r11, %rsi +; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload +; AVX2-NEXT:    andnq 8(%rdi), %r8, %r8 +; AVX2-NEXT:    orq %rax, %r8 +; AVX2-NEXT:    andl $60, %ebx +; AVX2-NEXT:    movl (%rdi,%rbx), %eax +; AVX2-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %r9d # 4-byte Reload +; AVX2-NEXT:    btl %r9d, %eax +; AVX2-NEXT:    movq %r13, 48(%rdi) +; AVX2-NEXT:    movq %r12, 56(%rdi) +; AVX2-NEXT:    movq %r14, 32(%rdi) +; AVX2-NEXT:    movq %rdx, 40(%rdi) +; AVX2-NEXT:    movq %rcx, 16(%rdi) +; AVX2-NEXT:    movq %r10, 24(%rdi) +; AVX2-NEXT:    movq %rsi, (%rdi) +; AVX2-NEXT:    movq %r8, 8(%rdi) +; AVX2-NEXT:    setae %al +; AVX2-NEXT:    addq $184, %rsp +; AVX2-NEXT:    popq %rbx +; AVX2-NEXT:    popq %r12 +; AVX2-NEXT:    popq %r13 +; AVX2-NEXT:    popq %r14 +; AVX2-NEXT:    popq %r15 +; AVX2-NEXT:    popq %rbp +; AVX2-NEXT:    vzeroupper +; AVX2-NEXT:    retq +; +; AVX512-LABEL: init_eq_i512: +; AVX512:       # %bb.0: +; AVX512-NEXT:    pushq %rbp +; AVX512-NEXT:    pushq %r15 +; AVX512-NEXT:    pushq %r14 +; AVX512-NEXT:    pushq %r13 +; AVX512-NEXT:    pushq %r12 +; AVX512-NEXT:    pushq %rbx +; AVX512-NEXT:    subq $168, %rsp +; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0 +; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) +; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) +; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) +; AVX512-NEXT:    vmovaps {{.*#+}} xmm1 = [1,0,0,0] +; AVX512-NEXT:    vmovups %ymm1, {{[0-9]+}}(%rsp) +; AVX512-NEXT:    movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill +; AVX512-NEXT:    movl %esi, %ecx +; AVX512-NEXT:    andl $63, %ecx +; AVX512-NEXT:    movl %esi, %r10d +; AVX512-NEXT:    shrl $3, %r10d +; AVX512-NEXT:    movl %r10d, %r8d +; AVX512-NEXT:    andl $56, %r8d +; AVX512-NEXT:    negl %r8d +; AVX512-NEXT:    movslq %r8d, %r9 +; AVX512-NEXT:    movq 112(%rsp,%r9), %r11 +; AVX512-NEXT:    movq 120(%rsp,%r9), %r14 +; AVX512-NEXT:    movq %r14, %rax +; AVX512-NEXT:    shldq %cl, %r11, %rax +; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; AVX512-NEXT:    movq 104(%rsp,%r9), %rax +; AVX512-NEXT:    shldq %cl, %rax, %r11 +; AVX512-NEXT:    movq 128(%rsp,%r9), %r15 +; AVX512-NEXT:    movq 136(%rsp,%r9), %rbp +; AVX512-NEXT:    movq %rbp, %rbx +; AVX512-NEXT:    shldq %cl, %r15, %rbx +; AVX512-NEXT:    shldq %cl, %r14, %r15 +; AVX512-NEXT:    movq 144(%rsp,%r9), %r13 +; AVX512-NEXT:    movq 152(%rsp,%r9), %r12 +; AVX512-NEXT:    shldq %cl, %r13, %r12 +; AVX512-NEXT:    movq 96(%rsp,%r9), %r14 +; AVX512-NEXT:    shldq %cl, %rbp, %r13 +; AVX512-NEXT:    shldq %cl, %r14, %rax +; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; AVX512-NEXT:    movl %edx, %edx +; AVX512-NEXT:    vxorps %xmm1, %xmm1, %xmm1 +; AVX512-NEXT:    vmovups %xmm1, {{[0-9]+}}(%rsp) +; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) +; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) +; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) +; AVX512-NEXT:    movq %rdx, -{{[0-9]+}}(%rsp) +; AVX512-NEXT:    movq $0, {{[0-9]+}}(%rsp) +; AVX512-NEXT:    movq 8(%rsp,%r9), %r8 +; AVX512-NEXT:    movq 16(%rsp,%r9), %rax +; AVX512-NEXT:    movq %rax, %rbp +; AVX512-NEXT:    shldq %cl, %r8, %rbp +; AVX512-NEXT:    andnq 48(%rdi), %r13, %r13 +; AVX512-NEXT:    orq %rbp, %r13 +; AVX512-NEXT:    movq 24(%rsp,%r9), %rbp +; AVX512-NEXT:    shldq %cl, %rax, %rbp +; AVX512-NEXT:    movq -8(%rsp,%r9), %rax +; AVX512-NEXT:    movq (%rsp,%r9), %rsi +; AVX512-NEXT:    movq %rsi, %rdx +; AVX512-NEXT:    shldq %cl, %rax, %rdx +; AVX512-NEXT:    andnq 56(%rdi), %r12, %r12 +; AVX512-NEXT:    orq %rbp, %r12 +; AVX512-NEXT:    andnq 32(%rdi), %r15, %r15 +; AVX512-NEXT:    orq %rdx, %r15 +; AVX512-NEXT:    shldq %cl, %rsi, %r8 +; AVX512-NEXT:    movq -24(%rsp,%r9), %rdx +; AVX512-NEXT:    movq -16(%rsp,%r9), %rsi +; AVX512-NEXT:    movq %rsi, %rbp +; AVX512-NEXT:    shldq %cl, %rdx, %rbp +; AVX512-NEXT:    andnq 40(%rdi), %rbx, %rbx +; AVX512-NEXT:    orq %r8, %rbx +; AVX512-NEXT:    andnq 16(%rdi), %r11, %r8 +; AVX512-NEXT:    orq %rbp, %r8 +; AVX512-NEXT:    shlxq %rcx, %r14, %r11 +; AVX512-NEXT:    movq -32(%rsp,%r9), %r9 +; AVX512-NEXT:    shldq %cl, %rsi, %rax +; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload +; AVX512-NEXT:    andnq 24(%rdi), %rsi, %rsi +; AVX512-NEXT:    orq %rax, %rsi +; AVX512-NEXT:    shlxq %rcx, %r9, %rax +; AVX512-NEXT:    # kill: def $cl killed $cl killed $rcx +; AVX512-NEXT:    shldq %cl, %r9, %rdx +; AVX512-NEXT:    andnq (%rdi), %r11, %rcx +; AVX512-NEXT:    orq %rax, %rcx +; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload +; AVX512-NEXT:    andnq 8(%rdi), %rax, %rax +; AVX512-NEXT:    orq %rdx, %rax +; AVX512-NEXT:    andl $60, %r10d +; AVX512-NEXT:    movl (%rdi,%r10), %edx +; AVX512-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %r9d # 4-byte Reload +; AVX512-NEXT:    btl %r9d, %edx +; AVX512-NEXT:    movq %r13, 48(%rdi) +; AVX512-NEXT:    movq %r12, 56(%rdi) +; AVX512-NEXT:    movq %r15, 32(%rdi) +; AVX512-NEXT:    movq %rbx, 40(%rdi) +; AVX512-NEXT:    movq %r8, 16(%rdi) +; AVX512-NEXT:    movq %rsi, 24(%rdi) +; AVX512-NEXT:    movq %rcx, (%rdi) +; AVX512-NEXT:    movq %rax, 8(%rdi) +; AVX512-NEXT:    setae %al +; AVX512-NEXT:    addq $168, %rsp +; AVX512-NEXT:    popq %rbx +; AVX512-NEXT:    popq %r12 +; AVX512-NEXT:    popq %r13 +; AVX512-NEXT:    popq %r14 +; AVX512-NEXT:    popq %r15 +; AVX512-NEXT:    popq %rbp +; AVX512-NEXT:    vzeroupper +; AVX512-NEXT:    retq    %rem = and i32 %position, 511    %ofs = zext nneg i32 %rem to i512    %bit = shl nuw i512 1, %ofs @@ -1049,40 +1841,33 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {  ; X86-NEXT:    shrb $3, %al  ; X86-NEXT:    andb $12, %al  ; X86-NEXT:    negb %al -; X86-NEXT:    movsbl %al, %edi -; X86-NEXT:    movl 36(%esp,%edi), %edx -; X86-NEXT:    movl 40(%esp,%edi), %ebx -; X86-NEXT:    movl %ebx, %esi +; X86-NEXT:    movsbl %al, %eax +; X86-NEXT:    movl 40(%esp,%eax), %edx +; X86-NEXT:    movl 44(%esp,%eax), %esi  ; X86-NEXT:    shldl %cl, %edx, %esi -; X86-NEXT:    movl 32(%esp,%edi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%esp,%edi), %edi -; X86-NEXT:    shldl %cl, %ebx, %edi -; X86-NEXT:    movl %eax, %ebx -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %ebx +; X86-NEXT:    movl 32(%esp,%eax), %edi +; X86-NEXT:    movl 36(%esp,%eax), %ebx +; X86-NEXT:    shldl %cl, %ebx, %edx +; X86-NEXT:    shldl %cl, %edi, %ebx  ; X86-NEXT:    notl %ebx  ; X86-NEXT:    movl 16(%ebp), %eax  ; X86-NEXT:    movl (%eax), %eax  ; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 12(%ebp), %eax -; X86-NEXT:    andl $96, %eax -; X86-NEXT:    shrl $3, %eax -; X86-NEXT:    movl 8(%ebp), %ecx -; X86-NEXT:    movl (%ecx,%eax), %eax -; X86-NEXT:    andl %ebx, (%ecx) -; X86-NEXT:    movl 12(%ebp), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    shldl %cl, %ebx, %edx -; X86-NEXT:    notl %edx -; X86-NEXT:    movl 8(%ebp), %ebx -; X86-NEXT:    andl %edx, 4(%ebx) -; X86-NEXT:    notl %esi -; X86-NEXT:    andl %esi, 8(%ebx) +; X86-NEXT:    movl 8(%ebp), %eax +; X86-NEXT:    andl %ebx, 4(%eax) +; X86-NEXT:    shll %cl, %edi  ; X86-NEXT:    notl %edi -; X86-NEXT:    andl %edi, 12(%ebx) -; X86-NEXT:    btl %ecx, %eax +; X86-NEXT:    movl %ecx, %ebx +; X86-NEXT:    andl $96, %ebx +; X86-NEXT:    shrl $3, %ebx +; X86-NEXT:    movl (%eax,%ebx), %ebx +; X86-NEXT:    andl %edi, (%eax) +; X86-NEXT:    notl %esi +; X86-NEXT:    andl %esi, 12(%eax) +; X86-NEXT:    notl %edx +; X86-NEXT:    andl %edx, 8(%eax)  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    btl %ecx, %ebx  ; X86-NEXT:    jae .LBB22_2  ; X86-NEXT:  # %bb.1:  ; X86-NEXT:    xorl %eax, %eax @@ -1116,8 +1901,8 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {  ; SSE-NEXT:  # %bb.1:  ; SSE-NEXT:    movl (%rdx), %eax  ; SSE-NEXT:  .LBB22_2: -; SSE-NEXT:    andq %r8, 8(%rdi)  ; SSE-NEXT:    andq %rsi, (%rdi) +; SSE-NEXT:    andq %r8, 8(%rdi)  ; SSE-NEXT:    # kill: def $eax killed $eax killed $rax  ; SSE-NEXT:    retq  ; @@ -1143,8 +1928,8 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {  ; AVX2-NEXT:  # %bb.1:  ; AVX2-NEXT:    movl (%rdx), %eax  ; AVX2-NEXT:  .LBB22_2: -; AVX2-NEXT:    andq %rsi, 8(%rdi)  ; AVX2-NEXT:    andq %r8, (%rdi) +; AVX2-NEXT:    andq %rsi, 8(%rdi)  ; AVX2-NEXT:    # kill: def $eax killed $eax killed $rax  ; AVX2-NEXT:    retq  ; @@ -1170,8 +1955,8 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {  ; AVX512-NEXT:  # %bb.1:  ; AVX512-NEXT:    movl (%rdx), %eax  ; AVX512-NEXT:  .LBB22_2: -; AVX512-NEXT:    andq %rsi, 8(%rdi)  ; AVX512-NEXT:    andq %r8, (%rdi) +; AVX512-NEXT:    andq %rsi, 8(%rdi)  ; AVX512-NEXT:    # kill: def $eax killed $eax killed $rax  ; AVX512-NEXT:    retq    %rem = and i32 %position, 127 diff --git a/llvm/test/CodeGen/X86/isel-llvm.sincos.ll b/llvm/test/CodeGen/X86/isel-llvm.sincos.ll index 065710f..8576f8f 100644 --- a/llvm/test/CodeGen/X86/isel-llvm.sincos.ll +++ b/llvm/test/CodeGen/X86/isel-llvm.sincos.ll @@ -3,6 +3,9 @@  ; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel  | FileCheck %s --check-prefixes=X64,FASTISEL-X64  ; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel=0 -fast-isel=0  | FileCheck %s --check-prefixes=X86,SDAG-X86  ; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel=0 -fast-isel=0  | FileCheck %s --check-prefixes=X64,SDAG-X64 +; RUN: llc < %s -mtriple=x86_64-apple-macosx10.9.0 -mcpu=core2 | FileCheck %s --check-prefix=MACOS-SINCOS-STRET +; RUN: llc < %s -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core2 | FileCheck %s --check-prefix=MACOS-NOSINCOS-STRET +  ; TODO: The below RUN line will fails GISEL selection and will fallback to DAG selection due to lack of support for loads/stores in i686 mode, support is expected soon enough, for this reason the llvm/test/CodeGen/X86/GlobalISel/llvm.sincos.mir test is added for now because of the lack of support for i686 in GlobalISel.  ; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel=1 -global-isel-abort=2 | FileCheck %s --check-prefixes=GISEL-X86  ; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel=1 -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X64 @@ -34,6 +37,29 @@ define { float, float } @test_sincos_f32(float %Val) nounwind {  ; X64-NEXT:    popq %rax  ; X64-NEXT:    retq  ; +; MACOS-SINCOS-STRET-LABEL: test_sincos_f32: +; MACOS-SINCOS-STRET:       ## %bb.0: +; MACOS-SINCOS-STRET-NEXT:    pushq %rax +; MACOS-SINCOS-STRET-NEXT:    callq ___sincosf_stret +; MACOS-SINCOS-STRET-NEXT:    movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] +; MACOS-SINCOS-STRET-NEXT:    popq %rax +; MACOS-SINCOS-STRET-NEXT:    retq +; +; MACOS-NOSINCOS-STRET-LABEL: test_sincos_f32: +; MACOS-NOSINCOS-STRET:       ## %bb.0: +; MACOS-NOSINCOS-STRET-NEXT:    pushq %rax +; MACOS-NOSINCOS-STRET-NEXT:    movss %xmm0, (%rsp) ## 4-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    callq _sinf +; MACOS-NOSINCOS-STRET-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movss (%rsp), %xmm0 ## 4-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm0 = mem[0],zero,zero,zero +; MACOS-NOSINCOS-STRET-NEXT:    callq _cosf +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, %xmm1 +; MACOS-NOSINCOS-STRET-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm0 = mem[0],zero,zero,zero +; MACOS-NOSINCOS-STRET-NEXT:    popq %rax +; MACOS-NOSINCOS-STRET-NEXT:    retq +;  ; GISEL-X86-LABEL: test_sincos_f32:  ; GISEL-X86:       # %bb.0:  ; GISEL-X86-NEXT:    subl $28, %esp @@ -93,6 +119,28 @@ define { double, double } @test_sincos_f64(double %Val) nounwind  {  ; X64-NEXT:    addq $24, %rsp  ; X64-NEXT:    retq  ; +; MACOS-SINCOS-STRET-LABEL: test_sincos_f64: +; MACOS-SINCOS-STRET:       ## %bb.0: +; MACOS-SINCOS-STRET-NEXT:    pushq %rax +; MACOS-SINCOS-STRET-NEXT:    callq ___sincos_stret +; MACOS-SINCOS-STRET-NEXT:    popq %rax +; MACOS-SINCOS-STRET-NEXT:    retq +; +; MACOS-NOSINCOS-STRET-LABEL: test_sincos_f64: +; MACOS-NOSINCOS-STRET:       ## %bb.0: +; MACOS-NOSINCOS-STRET-NEXT:    subq $24, %rsp +; MACOS-NOSINCOS-STRET-NEXT:    movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    callq _sin +; MACOS-NOSINCOS-STRET-NEXT:    movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 8-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm0 = mem[0],zero +; MACOS-NOSINCOS-STRET-NEXT:    callq _cos +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, %xmm1 +; MACOS-NOSINCOS-STRET-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 8-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm0 = mem[0],zero +; MACOS-NOSINCOS-STRET-NEXT:    addq $24, %rsp +; MACOS-NOSINCOS-STRET-NEXT:    retq +;  ; GISEL-X86-LABEL: test_sincos_f64:  ; GISEL-X86:       # %bb.0:  ; GISEL-X86-NEXT:    subl $44, %esp @@ -153,6 +201,40 @@ define { x86_fp80, x86_fp80 } @test_sincos_f80(x86_fp80 %Val) nounwind {  ; X64-NEXT:    addq $56, %rsp  ; X64-NEXT:    retq  ; +; MACOS-SINCOS-STRET-LABEL: test_sincos_f80: +; MACOS-SINCOS-STRET:       ## %bb.0: +; MACOS-SINCOS-STRET-NEXT:    subq $40, %rsp +; MACOS-SINCOS-STRET-NEXT:    fldt {{[0-9]+}}(%rsp) +; MACOS-SINCOS-STRET-NEXT:    fld %st(0) +; MACOS-SINCOS-STRET-NEXT:    fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill +; MACOS-SINCOS-STRET-NEXT:    fstpt (%rsp) +; MACOS-SINCOS-STRET-NEXT:    callq _cosl +; MACOS-SINCOS-STRET-NEXT:    fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill +; MACOS-SINCOS-STRET-NEXT:    fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload +; MACOS-SINCOS-STRET-NEXT:    fstpt (%rsp) +; MACOS-SINCOS-STRET-NEXT:    callq _sinl +; MACOS-SINCOS-STRET-NEXT:    fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload +; MACOS-SINCOS-STRET-NEXT:    fxch %st(1) +; MACOS-SINCOS-STRET-NEXT:    addq $40, %rsp +; MACOS-SINCOS-STRET-NEXT:    retq +; +; MACOS-NOSINCOS-STRET-LABEL: test_sincos_f80: +; MACOS-NOSINCOS-STRET:       ## %bb.0: +; MACOS-NOSINCOS-STRET-NEXT:    subq $40, %rsp +; MACOS-NOSINCOS-STRET-NEXT:    fldt {{[0-9]+}}(%rsp) +; MACOS-NOSINCOS-STRET-NEXT:    fld %st(0) +; MACOS-NOSINCOS-STRET-NEXT:    fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill +; MACOS-NOSINCOS-STRET-NEXT:    fstpt (%rsp) +; MACOS-NOSINCOS-STRET-NEXT:    callq _cosl +; MACOS-NOSINCOS-STRET-NEXT:    fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill +; MACOS-NOSINCOS-STRET-NEXT:    fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload +; MACOS-NOSINCOS-STRET-NEXT:    fstpt (%rsp) +; MACOS-NOSINCOS-STRET-NEXT:    callq _sinl +; MACOS-NOSINCOS-STRET-NEXT:    fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload +; MACOS-NOSINCOS-STRET-NEXT:    fxch %st(1) +; MACOS-NOSINCOS-STRET-NEXT:    addq $40, %rsp +; MACOS-NOSINCOS-STRET-NEXT:    retq +;  ; GISEL-X86-LABEL: test_sincos_f80:  ; GISEL-X86:       # %bb.0:  ; GISEL-X86-NEXT:    subl $60, %esp @@ -288,6 +370,57 @@ define void @can_fold_with_call_in_chain(float %x, ptr noalias %a, ptr noalias %  ; SDAG-X64-NEXT:    popq %r14  ; SDAG-X64-NEXT:    retq  ; +; MACOS-SINCOS-STRET-LABEL: can_fold_with_call_in_chain: +; MACOS-SINCOS-STRET:       ## %bb.0: ## %entry +; MACOS-SINCOS-STRET-NEXT:    pushq %r14 +; MACOS-SINCOS-STRET-NEXT:    pushq %rbx +; MACOS-SINCOS-STRET-NEXT:    subq $40, %rsp +; MACOS-SINCOS-STRET-NEXT:    movq %rsi, %rbx +; MACOS-SINCOS-STRET-NEXT:    movq %rdi, %r14 +; MACOS-SINCOS-STRET-NEXT:    callq ___sincosf_stret +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, (%rsp) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    movq %r14, %rdi +; MACOS-SINCOS-STRET-NEXT:    movq %rbx, %rsi +; MACOS-SINCOS-STRET-NEXT:    callq _foo +; MACOS-SINCOS-STRET-NEXT:    movaps (%rsp), %xmm0 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    movss %xmm0, (%r14) +; MACOS-SINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    movss %xmm0, (%rbx) +; MACOS-SINCOS-STRET-NEXT:    addq $40, %rsp +; MACOS-SINCOS-STRET-NEXT:    popq %rbx +; MACOS-SINCOS-STRET-NEXT:    popq %r14 +; MACOS-SINCOS-STRET-NEXT:    retq +; +; MACOS-NOSINCOS-STRET-LABEL: can_fold_with_call_in_chain: +; MACOS-NOSINCOS-STRET:       ## %bb.0: ## %entry +; MACOS-NOSINCOS-STRET-NEXT:    pushq %r14 +; MACOS-NOSINCOS-STRET-NEXT:    pushq %rbx +; MACOS-NOSINCOS-STRET-NEXT:    pushq %rax +; MACOS-NOSINCOS-STRET-NEXT:    movq %rsi, %rbx +; MACOS-NOSINCOS-STRET-NEXT:    movq %rdi, %r14 +; MACOS-NOSINCOS-STRET-NEXT:    movss %xmm0, (%rsp) ## 4-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    callq _sinf +; MACOS-NOSINCOS-STRET-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movss (%rsp), %xmm0 ## 4-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm0 = mem[0],zero,zero,zero +; MACOS-NOSINCOS-STRET-NEXT:    callq _cosf +; MACOS-NOSINCOS-STRET-NEXT:    movss %xmm0, (%rsp) ## 4-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movq %r14, %rdi +; MACOS-NOSINCOS-STRET-NEXT:    movq %rbx, %rsi +; MACOS-NOSINCOS-STRET-NEXT:    callq _foo +; MACOS-NOSINCOS-STRET-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm0 = mem[0],zero,zero,zero +; MACOS-NOSINCOS-STRET-NEXT:    movss %xmm0, (%r14) +; MACOS-NOSINCOS-STRET-NEXT:    movss (%rsp), %xmm0 ## 4-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm0 = mem[0],zero,zero,zero +; MACOS-NOSINCOS-STRET-NEXT:    movss %xmm0, (%rbx) +; MACOS-NOSINCOS-STRET-NEXT:    addq $8, %rsp +; MACOS-NOSINCOS-STRET-NEXT:    popq %rbx +; MACOS-NOSINCOS-STRET-NEXT:    popq %r14 +; MACOS-NOSINCOS-STRET-NEXT:    retq +;  ; GISEL-X86-LABEL: can_fold_with_call_in_chain:  ; GISEL-X86:       # %bb.0: # %entry  ; GISEL-X86-NEXT:    pushl %ebx diff --git a/llvm/test/CodeGen/X86/llvm.sincos.vec.ll b/llvm/test/CodeGen/X86/llvm.sincos.vec.ll index 834dd78..9b02438 100644 --- a/llvm/test/CodeGen/X86/llvm.sincos.vec.ll +++ b/llvm/test/CodeGen/X86/llvm.sincos.vec.ll @@ -1,59 +1,213 @@  ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp --version 5 -; RUN: llc < %s -mtriple=i386-unknown-linux-gnu  | FileCheck %s +; RUN: llc < %s -mtriple=i386-unknown-linux-gnu  | FileCheck -check-prefix=X86 %s +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu  | FileCheck -check-prefix=X64 %s +; RUN: llc < %s -mtriple=x86_64-apple-macosx10.9.0 | FileCheck --check-prefix=MACOS-SINCOS-STRET %s +; RUN: llc < %s -mtriple=x86_64-apple-macosx10.8.0 | FileCheck --check-prefix=MACOS-NOSINCOS-STRET %s  define void @test_sincos_v4f32(<4 x float> %x, ptr noalias %out_sin, ptr noalias %out_cos) nounwind { -; CHECK-LABEL: test_sincos_v4f32: -; CHECK:       # %bb.0: -; CHECK-NEXT:    pushl %edi -; CHECK-NEXT:    pushl %esi -; CHECK-NEXT:    subl $52, %esp -; CHECK-NEXT:    movl 84(%esp), %esi -; CHECK-NEXT:    flds 76(%esp) -; CHECK-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; CHECK-NEXT:    flds 64(%esp) -; CHECK-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; CHECK-NEXT:    flds 72(%esp) -; CHECK-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; CHECK-NEXT:    flds 68(%esp) -; CHECK-NEXT:    movl 80(%esp), %edi -; CHECK-NEXT:    leal 40(%esp), %eax -; CHECK-NEXT:    movl %eax, 8(%esp) -; CHECK-NEXT:    leal 4(%edi), %eax -; CHECK-NEXT:    movl %eax, 4(%esp) -; CHECK-NEXT:    fstps (%esp) -; CHECK-NEXT:    calll sincosf -; CHECK-NEXT:    leal 44(%esp), %eax -; CHECK-NEXT:    movl %eax, 8(%esp) -; CHECK-NEXT:    leal 8(%edi), %eax -; CHECK-NEXT:    movl %eax, 4(%esp) -; CHECK-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; CHECK-NEXT:    fstps (%esp) -; CHECK-NEXT:    calll sincosf -; CHECK-NEXT:    leal 36(%esp), %eax -; CHECK-NEXT:    movl %eax, 8(%esp) -; CHECK-NEXT:    movl %edi, 4(%esp) -; CHECK-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; CHECK-NEXT:    fstps (%esp) -; CHECK-NEXT:    calll sincosf -; CHECK-NEXT:    leal 48(%esp), %eax -; CHECK-NEXT:    movl %eax, 8(%esp) -; CHECK-NEXT:    addl $12, %edi -; CHECK-NEXT:    movl %edi, 4(%esp) -; CHECK-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; CHECK-NEXT:    fstps (%esp) -; CHECK-NEXT:    calll sincosf -; CHECK-NEXT:    flds 36(%esp) -; CHECK-NEXT:    flds 40(%esp) -; CHECK-NEXT:    flds 44(%esp) -; CHECK-NEXT:    flds 48(%esp) -; CHECK-NEXT:    fstps 12(%esi) -; CHECK-NEXT:    fstps 8(%esi) -; CHECK-NEXT:    fstps 4(%esi) -; CHECK-NEXT:    fstps (%esi) -; CHECK-NEXT:    addl $52, %esp -; CHECK-NEXT:    popl %esi -; CHECK-NEXT:    popl %edi -; CHECK-NEXT:    retl +; X86-LABEL: test_sincos_v4f32: +; X86:       # %bb.0: +; X86-NEXT:    pushl %edi +; X86-NEXT:    pushl %esi +; X86-NEXT:    subl $52, %esp +; X86-NEXT:    movl 84(%esp), %esi +; X86-NEXT:    flds 76(%esp) +; X86-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-NEXT:    flds 64(%esp) +; X86-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-NEXT:    flds 72(%esp) +; X86-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-NEXT:    flds 68(%esp) +; X86-NEXT:    movl 80(%esp), %edi +; X86-NEXT:    leal 40(%esp), %eax +; X86-NEXT:    movl %eax, 8(%esp) +; X86-NEXT:    leal 4(%edi), %eax +; X86-NEXT:    movl %eax, 4(%esp) +; X86-NEXT:    fstps (%esp) +; X86-NEXT:    calll sincosf +; X86-NEXT:    leal 44(%esp), %eax +; X86-NEXT:    movl %eax, 8(%esp) +; X86-NEXT:    leal 8(%edi), %eax +; X86-NEXT:    movl %eax, 4(%esp) +; X86-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-NEXT:    fstps (%esp) +; X86-NEXT:    calll sincosf +; X86-NEXT:    leal 36(%esp), %eax +; X86-NEXT:    movl %eax, 8(%esp) +; X86-NEXT:    movl %edi, 4(%esp) +; X86-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-NEXT:    fstps (%esp) +; X86-NEXT:    calll sincosf +; X86-NEXT:    leal 48(%esp), %eax +; X86-NEXT:    movl %eax, 8(%esp) +; X86-NEXT:    addl $12, %edi +; X86-NEXT:    movl %edi, 4(%esp) +; X86-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-NEXT:    fstps (%esp) +; X86-NEXT:    calll sincosf +; X86-NEXT:    flds 36(%esp) +; X86-NEXT:    flds 40(%esp) +; X86-NEXT:    flds 44(%esp) +; X86-NEXT:    flds 48(%esp) +; X86-NEXT:    fstps 12(%esi) +; X86-NEXT:    fstps 8(%esi) +; X86-NEXT:    fstps 4(%esi) +; X86-NEXT:    fstps (%esi) +; X86-NEXT:    addl $52, %esp +; X86-NEXT:    popl %esi +; X86-NEXT:    popl %edi +; X86-NEXT:    retl +; +; X64-LABEL: test_sincos_v4f32: +; X64:       # %bb.0: +; X64-NEXT:    pushq %r14 +; X64-NEXT:    pushq %rbx +; X64-NEXT:    subq $56, %rsp +; X64-NEXT:    movq %rsi, %rbx +; X64-NEXT:    movq %rdi, %r14 +; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill +; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] +; X64-NEXT:    leaq 4(%rsp), %rdi +; X64-NEXT:    movq %rsp, %rsi +; X64-NEXT:    callq sincosf@PLT +; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload +; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1] +; X64-NEXT:    leaq 12(%rsp), %rdi +; X64-NEXT:    leaq 8(%rsp), %rsi +; X64-NEXT:    callq sincosf@PLT +; X64-NEXT:    leaq 28(%rsp), %rdi +; X64-NEXT:    leaq 24(%rsp), %rsi +; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload +; X64-NEXT:    callq sincosf@PLT +; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload +; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] +; X64-NEXT:    leaq 20(%rsp), %rdi +; X64-NEXT:    leaq 16(%rsp), %rsi +; X64-NEXT:    callq sincosf@PLT +; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] +; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X64-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero +; X64-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] +; X64-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] +; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X64-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero +; X64-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] +; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X64-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] +; X64-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0] +; X64-NEXT:    movups %xmm1, (%r14) +; X64-NEXT:    movups %xmm0, (%rbx) +; X64-NEXT:    addq $56, %rsp +; X64-NEXT:    popq %rbx +; X64-NEXT:    popq %r14 +; X64-NEXT:    retq +; +; MACOS-SINCOS-STRET-LABEL: test_sincos_v4f32: +; MACOS-SINCOS-STRET:       ## %bb.0: +; MACOS-SINCOS-STRET-NEXT:    pushq %r14 +; MACOS-SINCOS-STRET-NEXT:    pushq %rbx +; MACOS-SINCOS-STRET-NEXT:    subq $104, %rsp +; MACOS-SINCOS-STRET-NEXT:    movq %rsi, %rbx +; MACOS-SINCOS-STRET-NEXT:    movq %rdi, %r14 +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] +; MACOS-SINCOS-STRET-NEXT:    callq ___sincosf_stret +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, (%rsp) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1] +; MACOS-SINCOS-STRET-NEXT:    callq ___sincosf_stret +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] +; MACOS-SINCOS-STRET-NEXT:    unpcklps (%rsp), %xmm0 ## 16-byte Folded Reload +; MACOS-SINCOS-STRET-NEXT:    ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, (%rsp) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    callq ___sincosf_stret +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, %xmm1 +; MACOS-SINCOS-STRET-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1] +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] +; MACOS-SINCOS-STRET-NEXT:    callq ___sincosf_stret +; MACOS-SINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] +; MACOS-SINCOS-STRET-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] +; MACOS-SINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1] +; MACOS-SINCOS-STRET-NEXT:    unpcklpd (%rsp), %xmm2 ## 16-byte Folded Reload +; MACOS-SINCOS-STRET-NEXT:    ## xmm2 = xmm2[0],mem[0] +; MACOS-SINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload +; MACOS-SINCOS-STRET-NEXT:    ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] +; MACOS-SINCOS-STRET-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0] +; MACOS-SINCOS-STRET-NEXT:    movups %xmm1, (%r14) +; MACOS-SINCOS-STRET-NEXT:    movups %xmm2, (%rbx) +; MACOS-SINCOS-STRET-NEXT:    addq $104, %rsp +; MACOS-SINCOS-STRET-NEXT:    popq %rbx +; MACOS-SINCOS-STRET-NEXT:    popq %r14 +; MACOS-SINCOS-STRET-NEXT:    retq +; +; MACOS-NOSINCOS-STRET-LABEL: test_sincos_v4f32: +; MACOS-NOSINCOS-STRET:       ## %bb.0: +; MACOS-NOSINCOS-STRET-NEXT:    pushq %r14 +; MACOS-NOSINCOS-STRET-NEXT:    pushq %rbx +; MACOS-NOSINCOS-STRET-NEXT:    subq $104, %rsp +; MACOS-NOSINCOS-STRET-NEXT:    movq %rsi, %rbx +; MACOS-NOSINCOS-STRET-NEXT:    movq %rdi, %r14 +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, (%rsp) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    callq _cosf +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps (%rsp), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1] +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    callq _cosf +; MACOS-NOSINCOS-STRET-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps (%rsp), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    callq _cosf +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps (%rsp), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    callq _cosf +; MACOS-NOSINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] +; MACOS-NOSINCOS-STRET-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Folded Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm1 = xmm1[0],mem[0] +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    callq _sinf +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    callq _sinf +; MACOS-NOSINCOS-STRET-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps (%rsp), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    callq _sinf +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, (%rsp) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    callq _sinf +; MACOS-NOSINCOS-STRET-NEXT:    movaps (%rsp), %xmm1 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] +; MACOS-NOSINCOS-STRET-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Folded Reload +; MACOS-NOSINCOS-STRET-NEXT:    ## xmm1 = xmm1[0],mem[0] +; MACOS-NOSINCOS-STRET-NEXT:    movups %xmm1, (%r14) +; MACOS-NOSINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    movups %xmm0, (%rbx) +; MACOS-NOSINCOS-STRET-NEXT:    addq $104, %rsp +; MACOS-NOSINCOS-STRET-NEXT:    popq %rbx +; MACOS-NOSINCOS-STRET-NEXT:    popq %r14 +; MACOS-NOSINCOS-STRET-NEXT:    retq    %result = call { <4 x float>, <4 x float> } @llvm.sincos.v4f32(<4 x float> %x)    %result.0 = extractvalue { <4 x float>, <4 x float> } %result, 0    %result.1 = extractvalue { <4 x float>, <4 x float> } %result, 1 @@ -63,36 +217,120 @@ define void @test_sincos_v4f32(<4 x float> %x, ptr noalias %out_sin, ptr noalias  }  define void @test_sincos_v2f64(<2 x double> %x, ptr noalias %out_sin, ptr noalias %out_cos) nounwind { -; CHECK-LABEL: test_sincos_v2f64: -; CHECK:       # %bb.0: -; CHECK-NEXT:    pushl %edi -; CHECK-NEXT:    pushl %esi -; CHECK-NEXT:    subl $52, %esp -; CHECK-NEXT:    movl 84(%esp), %esi -; CHECK-NEXT:    fldl 72(%esp) -; CHECK-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill -; CHECK-NEXT:    fldl 64(%esp) -; CHECK-NEXT:    movl 80(%esp), %edi -; CHECK-NEXT:    leal 24(%esp), %eax -; CHECK-NEXT:    movl %eax, 12(%esp) -; CHECK-NEXT:    movl %edi, 8(%esp) -; CHECK-NEXT:    fstpl (%esp) -; CHECK-NEXT:    calll sincos -; CHECK-NEXT:    leal 32(%esp), %eax -; CHECK-NEXT:    movl %eax, 12(%esp) -; CHECK-NEXT:    addl $8, %edi -; CHECK-NEXT:    movl %edi, 8(%esp) -; CHECK-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload -; CHECK-NEXT:    fstpl (%esp) -; CHECK-NEXT:    calll sincos -; CHECK-NEXT:    fldl 24(%esp) -; CHECK-NEXT:    fldl 32(%esp) -; CHECK-NEXT:    fstpl 8(%esi) -; CHECK-NEXT:    fstpl (%esi) -; CHECK-NEXT:    addl $52, %esp -; CHECK-NEXT:    popl %esi -; CHECK-NEXT:    popl %edi -; CHECK-NEXT:    retl +; X86-LABEL: test_sincos_v2f64: +; X86:       # %bb.0: +; X86-NEXT:    pushl %edi +; X86-NEXT:    pushl %esi +; X86-NEXT:    subl $52, %esp +; X86-NEXT:    movl 84(%esp), %esi +; X86-NEXT:    fldl 72(%esp) +; X86-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill +; X86-NEXT:    fldl 64(%esp) +; X86-NEXT:    movl 80(%esp), %edi +; X86-NEXT:    leal 24(%esp), %eax +; X86-NEXT:    movl %eax, 12(%esp) +; X86-NEXT:    movl %edi, 8(%esp) +; X86-NEXT:    fstpl (%esp) +; X86-NEXT:    calll sincos +; X86-NEXT:    leal 32(%esp), %eax +; X86-NEXT:    movl %eax, 12(%esp) +; X86-NEXT:    addl $8, %edi +; X86-NEXT:    movl %edi, 8(%esp) +; X86-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload +; X86-NEXT:    fstpl (%esp) +; X86-NEXT:    calll sincos +; X86-NEXT:    fldl 24(%esp) +; X86-NEXT:    fldl 32(%esp) +; X86-NEXT:    fstpl 8(%esi) +; X86-NEXT:    fstpl (%esi) +; X86-NEXT:    addl $52, %esp +; X86-NEXT:    popl %esi +; X86-NEXT:    popl %edi +; X86-NEXT:    retl +; +; X64-LABEL: test_sincos_v2f64: +; X64:       # %bb.0: +; X64-NEXT:    pushq %r14 +; X64-NEXT:    pushq %rbx +; X64-NEXT:    subq $56, %rsp +; X64-NEXT:    movq %rsi, %rbx +; X64-NEXT:    movq %rdi, %r14 +; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill +; X64-NEXT:    leaq 24(%rsp), %rdi +; X64-NEXT:    leaq 16(%rsp), %rsi +; X64-NEXT:    callq sincos@PLT +; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload +; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1] +; X64-NEXT:    leaq 8(%rsp), %rdi +; X64-NEXT:    movq %rsp, %rsi +; X64-NEXT:    callq sincos@PLT +; X64-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero +; X64-NEXT:    movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1] +; X64-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero +; X64-NEXT:    movhps {{.*#+}} xmm1 = xmm1[0,1],mem[0,1] +; X64-NEXT:    movups %xmm1, (%r14) +; X64-NEXT:    movups %xmm0, (%rbx) +; X64-NEXT:    addq $56, %rsp +; X64-NEXT:    popq %rbx +; X64-NEXT:    popq %r14 +; X64-NEXT:    retq +; +; MACOS-SINCOS-STRET-LABEL: test_sincos_v2f64: +; MACOS-SINCOS-STRET:       ## %bb.0: +; MACOS-SINCOS-STRET-NEXT:    pushq %r14 +; MACOS-SINCOS-STRET-NEXT:    pushq %rbx +; MACOS-SINCOS-STRET-NEXT:    subq $56, %rsp +; MACOS-SINCOS-STRET-NEXT:    movq %rsi, %rbx +; MACOS-SINCOS-STRET-NEXT:    movq %rdi, %r14 +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, (%rsp) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    callq ___sincos_stret +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-SINCOS-STRET-NEXT:    movaps (%rsp), %xmm0 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1] +; MACOS-SINCOS-STRET-NEXT:    callq ___sincos_stret +; MACOS-SINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    movlhps {{.*#+}} xmm2 = xmm2[0],xmm1[0] +; MACOS-SINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload +; MACOS-SINCOS-STRET-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0] +; MACOS-SINCOS-STRET-NEXT:    movups %xmm1, (%r14) +; MACOS-SINCOS-STRET-NEXT:    movups %xmm2, (%rbx) +; MACOS-SINCOS-STRET-NEXT:    addq $56, %rsp +; MACOS-SINCOS-STRET-NEXT:    popq %rbx +; MACOS-SINCOS-STRET-NEXT:    popq %r14 +; MACOS-SINCOS-STRET-NEXT:    retq +; +; MACOS-NOSINCOS-STRET-LABEL: test_sincos_v2f64: +; MACOS-NOSINCOS-STRET:       ## %bb.0: +; MACOS-NOSINCOS-STRET-NEXT:    pushq %r14 +; MACOS-NOSINCOS-STRET-NEXT:    pushq %rbx +; MACOS-NOSINCOS-STRET-NEXT:    subq $56, %rsp +; MACOS-NOSINCOS-STRET-NEXT:    movq %rsi, %rbx +; MACOS-NOSINCOS-STRET-NEXT:    movq %rdi, %r14 +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, (%rsp) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    callq _cos +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps (%rsp), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1] +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    callq _cos +; MACOS-NOSINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0] +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps (%rsp), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    callq _sin +; MACOS-NOSINCOS-STRET-NEXT:    movaps %xmm0, (%rsp) ## 16-byte Spill +; MACOS-NOSINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    callq _sin +; MACOS-NOSINCOS-STRET-NEXT:    movaps (%rsp), %xmm1 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0] +; MACOS-NOSINCOS-STRET-NEXT:    movups %xmm1, (%r14) +; MACOS-NOSINCOS-STRET-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload +; MACOS-NOSINCOS-STRET-NEXT:    movups %xmm0, (%rbx) +; MACOS-NOSINCOS-STRET-NEXT:    addq $56, %rsp +; MACOS-NOSINCOS-STRET-NEXT:    popq %rbx +; MACOS-NOSINCOS-STRET-NEXT:    popq %r14 +; MACOS-NOSINCOS-STRET-NEXT:    retq    %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %x)    %result.0 = extractvalue { <2 x double>, <2 x double> } %result, 0    %result.1 = extractvalue { <2 x double>, <2 x double> } %result, 1 diff --git a/llvm/test/DebugInfo/PDB/Native/pdb-native-index-overflow.test b/llvm/test/DebugInfo/PDB/Native/pdb-native-index-overflow.test new file mode 100755 index 0000000..aa3f6dc --- /dev/null +++ b/llvm/test/DebugInfo/PDB/Native/pdb-native-index-overflow.test @@ -0,0 +1,13 @@ +; Test that the native PDB reader isn't crashed by index value bigger than +; number of types in TPI or IPI stream +; RUN: llvm-pdbutil dump %p/../Inputs/empty.pdb --type-index=20000000\ +; RUN:   | FileCheck -check-prefixes=TYPES,NOT_FOUND %s +; RUN: llvm-pdbutil dump %p/../Inputs/empty.pdb --id-index=20000000\ +; RUN:   | FileCheck -check-prefixes=IDS,NOT_FOUND %s + +TYPES:                     Types (TPI Stream) +IDS:                       Types (IPI Stream) +NOT_FOUND:============================================================ +NOT_FOUND:  Showing 1 records. +NOT_FOUND:  Type 0x1312D00 doesn't exist in TPI stream + diff --git a/llvm/test/DebugInfo/debug-bool-const-value.ll b/llvm/test/DebugInfo/debug-bool-const-value.ll new file mode 100644 index 0000000..84cf993 --- /dev/null +++ b/llvm/test/DebugInfo/debug-bool-const-value.ll @@ -0,0 +1,29 @@ +; REQUIRES: object-emission +; RUN: %llc_dwarf %s -filetype=obj -o - | llvm-dwarfdump - | FileCheck %s + +; CHECK: {{.*}}DW_TAG_variable +; CHECK-NEXT: {{.*}} DW_AT_const_value     (1) +; CHECK-NEXT: {{.*}} DW_AT_name    ("arg") + +define void @test() !dbg !5 +{ +entry: +  call void @"llvm.dbg.value"(metadata i1 true, metadata !7, metadata !8), !dbg !6 +  ret void, !dbg !6 +} + +declare void @"llvm.dbg.value"(metadata %".1", metadata %".2", metadata %".3") + +!llvm.dbg.cu = !{ !2 } +!llvm.module.flags = !{ !9, !10 } + +!1 = !DIFile(directory: "", filename: "test") +!2 = distinct !DICompileUnit(emissionKind: FullDebug, file: !1, isOptimized: false, language: DW_LANG_C_plus_plus, runtimeVersion: 0) +!3 = !DIBasicType(encoding: DW_ATE_boolean, name: "bool", size: 8) +!4 = !DISubroutineType(types: !{null}) +!5 = distinct !DISubprogram(file: !1, isDefinition: true, isLocal: false, isOptimized: false, line: 5, linkageName: "test", name: "test", scope: !1, scopeLine: 5, type: !4, unit: !2) +!6 = !DILocation(column: 1, line: 5, scope: !5) +!7 = !DILocalVariable(arg: 0, file: !1, line: 5, name: "arg", scope: !5, type: !3) +!8 = !DIExpression() +!9 = !{ i32 2, !"Dwarf Version", i32 4 } +!10 = !{ i32 2, !"Debug Info Version", i32 3 } diff --git a/llvm/test/Instrumentation/TypeSanitizer/basic_outlined.ll b/llvm/test/Instrumentation/TypeSanitizer/basic_outlined.ll new file mode 100644 index 0000000..1d11856 --- /dev/null +++ b/llvm/test/Instrumentation/TypeSanitizer/basic_outlined.ll @@ -0,0 +1,68 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals +; Test basic type sanitizer instrumentation. +; +; RUN: opt -passes='tysan' -tysan-outline-instrumentation -S %s | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +;. +; CHECK: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @tysan.module_ctor, ptr null }] +; CHECK: @__tysan_v1_Simple_20C_2b_2b_20TBAA = linkonce_odr constant { i64, i64, [16 x i8] } { i64 2, i64 0, [16 x i8] c"Simple C++ TBAA\00" }, comdat +; CHECK: @__tysan_v1_omnipotent_20char = linkonce_odr constant { i64, i64, ptr, i64, [16 x i8] } { i64 2, i64 1, ptr @__tysan_v1_Simple_20C_2b_2b_20TBAA, i64 0, [16 x i8] c"omnipotent char\00" }, comdat +; CHECK: @__tysan_v1_int = linkonce_odr constant { i64, i64, ptr, i64, [4 x i8] } { i64 2, i64 1, ptr @__tysan_v1_omnipotent_20char, i64 0, [4 x i8] c"int\00" }, comdat +; CHECK: @__tysan_v1_int_o_0 = linkonce_odr constant { i64, ptr, ptr, i64 } { i64 1, ptr @__tysan_v1_int, ptr @__tysan_v1_int, i64 0 }, comdat +; CHECK: @__tysan_shadow_memory_address = external global i64 +; CHECK: @__tysan_app_memory_mask = external global i64 +; CHECK: @__tysan_v1___ZTS1x = linkonce_odr constant { i64, i64, ptr, i64, ptr, i64, [7 x i8] } { i64 2, i64 2, ptr @__tysan_v1_int, i64 0, ptr @__tysan_v1_int, i64 4, [7 x i8] c"_ZTS1x\00" }, comdat +; CHECK: @__tysan_v1___ZTS1v = linkonce_odr constant { i64, i64, ptr, i64, ptr, i64, ptr, i64, [7 x i8] } { i64 2, i64 3, ptr @__tysan_v1_int, i64 8, ptr @__tysan_v1_int, i64 12, ptr @__tysan_v1___ZTS1x, i64 16, [7 x i8] c"_ZTS1v\00" }, comdat +; CHECK: @__tysan_v1___ZTS1v_o_12 = linkonce_odr constant { i64, ptr, ptr, i64 } { i64 1, ptr @__tysan_v1___ZTS1v, ptr @__tysan_v1_int, i64 12 }, comdat +; CHECK: @llvm.used = appending global [8 x ptr] [ptr @tysan.module_ctor, ptr @__tysan_v1_Simple_20C_2b_2b_20TBAA, ptr @__tysan_v1_omnipotent_20char, ptr @__tysan_v1_int, ptr @__tysan_v1_int_o_0, ptr @__tysan_v1___ZTS1x, ptr @__tysan_v1___ZTS1v, ptr @__tysan_v1___ZTS1v_o_12], section "llvm.metadata" +;. +define i32 @test_load(ptr %a) sanitize_type { +; CHECK-LABEL: @test_load( +; CHECK-NEXT:  entry: +; CHECK-NEXT:    [[APP_MEM_MASK:%.*]] = load i64, ptr @__tysan_app_memory_mask, align 8 +; CHECK-NEXT:    [[SHADOW_BASE:%.*]] = load i64, ptr @__tysan_shadow_memory_address, align 8 +; CHECK-NEXT:    call void @__tysan_instrument_with_shadow_update(ptr [[A:%.*]], ptr @__tysan_v1_int_o_0, i1 true, i64 4, i32 1) +; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A]], align 4, !tbaa [[TBAA0:![0-9]+]] +; CHECK-NEXT:    ret i32 [[TMP1]] +; +entry: +  %tmp1 = load i32, ptr %a, align 4, !tbaa !3 +  ret i32 %tmp1 +} + +define void @test_store(ptr %a) sanitize_type { +; CHECK-LABEL: @test_store( +; CHECK-NEXT:  entry: +; CHECK-NEXT:    [[APP_MEM_MASK:%.*]] = load i64, ptr @__tysan_app_memory_mask, align 8 +; CHECK-NEXT:    [[SHADOW_BASE:%.*]] = load i64, ptr @__tysan_shadow_memory_address, align 8 +; CHECK-NEXT:    call void @__tysan_instrument_with_shadow_update(ptr [[A:%.*]], ptr @__tysan_v1___ZTS1v_o_12, i1 true, i64 4, i32 2) +; CHECK-NEXT:    store i32 42, ptr [[A]], align 4, !tbaa [[TBAA4:![0-9]+]] +; CHECK-NEXT:    ret void +; + +entry: +  store i32 42, ptr %a, align 4, !tbaa !6 +  ret void +} + +!0 = !{!"Simple C++ TBAA"} +!1 = !{!"omnipotent char", !0, i64 0} +!2 = !{!"int", !1, i64 0} +!3 = !{!2, !2, i64 0} +!4 = !{!"_ZTS1x", !2, i64 0, !2, i64 4} +!5 = !{!"_ZTS1v", !2, i64 8, !2, i64 12, !4, i64 16} +!6 = !{!5, !2, i64 12} +;. +; CHECK: attributes #[[ATTR0:[0-9]+]] = { sanitize_type } +; CHECK: attributes #[[ATTR1:[0-9]+]] = { nounwind } +;. +; CHECK: [[TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0} +; CHECK: [[META1]] = !{!"int", [[META2:![0-9]+]], i64 0} +; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]], i64 0} +; CHECK: [[META3]] = !{!"Simple C++ TBAA"} +; CHECK: [[TBAA4]] = !{[[META5:![0-9]+]], [[META1]], i64 12} +; CHECK: [[META5]] = !{!"_ZTS1v", [[META1]], i64 8, [[META1]], i64 12, [[META6:![0-9]+]], i64 16} +; CHECK: [[META6]] = !{!"_ZTS1x", [[META1]], i64 0, [[META1]], i64 4} +;. diff --git a/llvm/test/Instrumentation/TypeSanitizer/basic_verify_outlined.ll b/llvm/test/Instrumentation/TypeSanitizer/basic_verify_outlined.ll new file mode 100644 index 0000000..187a41e --- /dev/null +++ b/llvm/test/Instrumentation/TypeSanitizer/basic_verify_outlined.ll @@ -0,0 +1,736 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals +; Test basic type sanitizer instrumentation. +; +; RUN: opt -passes='tysan' -S -tysan-outline-instrumentation -tysan-verify-outlined-instrumentation -S %s | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +;. +; CHECK: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @tysan.module_ctor, ptr null }] +; CHECK: @__tysan_v1_Simple_20C_2b_2b_20TBAA = linkonce_odr constant { i64, i64, [16 x i8] } { i64 2, i64 0, [16 x i8] c"Simple C++ TBAA\00" }, comdat +; CHECK: @__tysan_v1_omnipotent_20char = linkonce_odr constant { i64, i64, ptr, i64, [16 x i8] } { i64 2, i64 1, ptr @__tysan_v1_Simple_20C_2b_2b_20TBAA, i64 0, [16 x i8] c"omnipotent char\00" }, comdat +; CHECK: @__tysan_v1_int = linkonce_odr constant { i64, i64, ptr, i64, [4 x i8] } { i64 2, i64 1, ptr @__tysan_v1_omnipotent_20char, i64 0, [4 x i8] c"int\00" }, comdat +; CHECK: @__tysan_v1_int_o_0 = linkonce_odr constant { i64, ptr, ptr, i64 } { i64 1, ptr @__tysan_v1_int, ptr @__tysan_v1_int, i64 0 }, comdat +; CHECK: @__tysan_shadow_memory_address = external global i64 +; CHECK: @__tysan_app_memory_mask = external global i64 +; CHECK: @__tysan_v1___ZTS1x = linkonce_odr constant { i64, i64, ptr, i64, ptr, i64, [7 x i8] } { i64 2, i64 2, ptr @__tysan_v1_int, i64 0, ptr @__tysan_v1_int, i64 4, [7 x i8] c"_ZTS1x\00" }, comdat +; CHECK: @__tysan_v1___ZTS1v = linkonce_odr constant { i64, i64, ptr, i64, ptr, i64, ptr, i64, [7 x i8] } { i64 2, i64 3, ptr @__tysan_v1_int, i64 8, ptr @__tysan_v1_int, i64 12, ptr @__tysan_v1___ZTS1x, i64 16, [7 x i8] c"_ZTS1v\00" }, comdat +; CHECK: @__tysan_v1___ZTS1v_o_12 = linkonce_odr constant { i64, ptr, ptr, i64 } { i64 1, ptr @__tysan_v1___ZTS1v, ptr @__tysan_v1_int, i64 12 }, comdat +; CHECK: @llvm.used = appending global [8 x ptr] [ptr @tysan.module_ctor, ptr @__tysan_v1_Simple_20C_2b_2b_20TBAA, ptr @__tysan_v1_omnipotent_20char, ptr @__tysan_v1_int, ptr @__tysan_v1_int_o_0, ptr @__tysan_v1___ZTS1x, ptr @__tysan_v1___ZTS1v, ptr @__tysan_v1___ZTS1v_o_12], section "llvm.metadata" +;. +define i32 @test_load(ptr %a) sanitize_type { +; CHECK-LABEL: @test_load( +; CHECK-NEXT:  entry: +; CHECK-NEXT:    [[APP_MEM_MASK2:%.*]] = load i64, ptr @__tysan_app_memory_mask, align 8 +; CHECK-NEXT:    [[SHADOW_BASE1:%.*]] = load i64, ptr @__tysan_shadow_memory_address, align 8 +; CHECK-NEXT:    [[APP_PTR_MASKED:%.*]] = and i64 ptrtoint (ptr @__tysan_app_memory_mask to i64), [[APP_MEM_MASK2]] +; CHECK-NEXT:    [[APP_PTR_SHIFTED:%.*]] = shl i64 [[APP_PTR_MASKED]], 3 +; CHECK-NEXT:    [[SHADOW_PTR_INT:%.*]] = add i64 [[APP_PTR_SHIFTED]], [[SHADOW_BASE1]] +; CHECK-NEXT:    [[SHADOW_PTR:%.*]] = inttoptr i64 [[SHADOW_PTR_INT]] to ptr +; CHECK-NEXT:    [[SHADOW_DESC:%.*]] = load ptr, ptr [[SHADOW_PTR]], align 8 +; CHECK-NEXT:    [[BAD_DESC:%.*]] = icmp ne ptr [[SHADOW_DESC]], null +; CHECK-NEXT:    br i1 [[BAD_DESC]], label [[TMP0:%.*]], label [[TMP42:%.*]], !prof [[PROF0:![0-9]+]] +; CHECK:       0: +; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq ptr [[SHADOW_DESC]], null +; CHECK-NEXT:    br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP40:%.*]] +; CHECK:       2: +; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[SHADOW_PTR_INT]], 8 +; CHECK-NEXT:    [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr +; CHECK-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 +; CHECK-NEXT:    [[TMP6:%.*]] = icmp ne ptr [[TMP5]], null +; CHECK-NEXT:    [[TMP7:%.*]] = or i1 false, [[TMP6]] +; CHECK-NEXT:    [[TMP8:%.*]] = add i64 [[SHADOW_PTR_INT]], 16 +; CHECK-NEXT:    [[TMP9:%.*]] = inttoptr i64 [[TMP8]] to ptr +; CHECK-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8 +; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne ptr [[TMP10]], null +; CHECK-NEXT:    [[TMP12:%.*]] = or i1 [[TMP7]], [[TMP11]] +; CHECK-NEXT:    [[TMP13:%.*]] = add i64 [[SHADOW_PTR_INT]], 24 +; CHECK-NEXT:    [[TMP14:%.*]] = inttoptr i64 [[TMP13]] to ptr +; CHECK-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 8 +; CHECK-NEXT:    [[TMP16:%.*]] = icmp ne ptr [[TMP15]], null +; CHECK-NEXT:    [[TMP17:%.*]] = or i1 [[TMP12]], [[TMP16]] +; CHECK-NEXT:    [[TMP18:%.*]] = add i64 [[SHADOW_PTR_INT]], 32 +; CHECK-NEXT:    [[TMP19:%.*]] = inttoptr i64 [[TMP18]] to ptr +; CHECK-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8 +; CHECK-NEXT:    [[TMP21:%.*]] = icmp ne ptr [[TMP20]], null +; CHECK-NEXT:    [[TMP22:%.*]] = or i1 [[TMP17]], [[TMP21]] +; CHECK-NEXT:    [[TMP23:%.*]] = add i64 [[SHADOW_PTR_INT]], 40 +; CHECK-NEXT:    [[TMP24:%.*]] = inttoptr i64 [[TMP23]] to ptr +; CHECK-NEXT:    [[TMP25:%.*]] = load ptr, ptr [[TMP24]], align 8 +; CHECK-NEXT:    [[TMP26:%.*]] = icmp ne ptr [[TMP25]], null +; CHECK-NEXT:    [[TMP27:%.*]] = or i1 [[TMP22]], [[TMP26]] +; CHECK-NEXT:    [[TMP28:%.*]] = add i64 [[SHADOW_PTR_INT]], 48 +; CHECK-NEXT:    [[TMP29:%.*]] = inttoptr i64 [[TMP28]] to ptr +; CHECK-NEXT:    [[TMP30:%.*]] = load ptr, ptr [[TMP29]], align 8 +; CHECK-NEXT:    [[TMP31:%.*]] = icmp ne ptr [[TMP30]], null +; CHECK-NEXT:    [[TMP32:%.*]] = or i1 [[TMP27]], [[TMP31]] +; CHECK-NEXT:    [[TMP33:%.*]] = add i64 [[SHADOW_PTR_INT]], 56 +; CHECK-NEXT:    [[TMP34:%.*]] = inttoptr i64 [[TMP33]] to ptr +; CHECK-NEXT:    [[TMP35:%.*]] = load ptr, ptr [[TMP34]], align 8 +; CHECK-NEXT:    [[TMP36:%.*]] = icmp ne ptr [[TMP35]], null +; CHECK-NEXT:    [[TMP37:%.*]] = or i1 [[TMP32]], [[TMP36]] +; CHECK-NEXT:    br i1 [[TMP37]], label [[TMP38:%.*]], label [[TMP39:%.*]], !prof [[PROF0]] +; CHECK:       38: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_app_memory_mask, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP39]] +; CHECK:       39: +; CHECK-NEXT:    store ptr null, ptr [[SHADOW_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_1_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -1 to ptr), ptr [[SHADOW_BYTE_1_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_2_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 16 +; CHECK-NEXT:    [[SHADOW_BYTE_2_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_2_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -2 to ptr), ptr [[SHADOW_BYTE_2_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_3_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 24 +; CHECK-NEXT:    [[SHADOW_BYTE_3_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_3_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -3 to ptr), ptr [[SHADOW_BYTE_3_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_4_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 32 +; CHECK-NEXT:    [[SHADOW_BYTE_4_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_4_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -4 to ptr), ptr [[SHADOW_BYTE_4_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_5_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 40 +; CHECK-NEXT:    [[SHADOW_BYTE_5_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_5_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -5 to ptr), ptr [[SHADOW_BYTE_5_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_6_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 48 +; CHECK-NEXT:    [[SHADOW_BYTE_6_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_6_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -6 to ptr), ptr [[SHADOW_BYTE_6_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_7_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 56 +; CHECK-NEXT:    [[SHADOW_BYTE_7_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_7_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -7 to ptr), ptr [[SHADOW_BYTE_7_PTR]], align 8 +; CHECK-NEXT:    br label [[TMP41:%.*]] +; CHECK:       40: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_app_memory_mask, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP41]] +; CHECK:       41: +; CHECK-NEXT:    br label [[TMP87:%.*]] +; CHECK:       42: +; CHECK-NEXT:    [[TMP43:%.*]] = add i64 [[SHADOW_PTR_INT]], 8 +; CHECK-NEXT:    [[TMP44:%.*]] = inttoptr i64 [[TMP43]] to ptr +; CHECK-NEXT:    [[TMP45:%.*]] = load ptr, ptr [[TMP44]], align 8 +; CHECK-NEXT:    [[TMP46:%.*]] = ptrtoint ptr [[TMP45]] to i64 +; CHECK-NEXT:    [[TMP47:%.*]] = icmp sge i64 [[TMP46]], 0 +; CHECK-NEXT:    [[TMP48:%.*]] = or i1 false, [[TMP47]] +; CHECK-NEXT:    [[TMP49:%.*]] = add i64 [[SHADOW_PTR_INT]], 16 +; CHECK-NEXT:    [[TMP50:%.*]] = inttoptr i64 [[TMP49]] to ptr +; CHECK-NEXT:    [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 8 +; CHECK-NEXT:    [[TMP52:%.*]] = ptrtoint ptr [[TMP51]] to i64 +; CHECK-NEXT:    [[TMP53:%.*]] = icmp sge i64 [[TMP52]], 0 +; CHECK-NEXT:    [[TMP54:%.*]] = or i1 [[TMP48]], [[TMP53]] +; CHECK-NEXT:    [[TMP55:%.*]] = add i64 [[SHADOW_PTR_INT]], 24 +; CHECK-NEXT:    [[TMP56:%.*]] = inttoptr i64 [[TMP55]] to ptr +; CHECK-NEXT:    [[TMP57:%.*]] = load ptr, ptr [[TMP56]], align 8 +; CHECK-NEXT:    [[TMP58:%.*]] = ptrtoint ptr [[TMP57]] to i64 +; CHECK-NEXT:    [[TMP59:%.*]] = icmp sge i64 [[TMP58]], 0 +; CHECK-NEXT:    [[TMP60:%.*]] = or i1 [[TMP54]], [[TMP59]] +; CHECK-NEXT:    [[TMP61:%.*]] = add i64 [[SHADOW_PTR_INT]], 32 +; CHECK-NEXT:    [[TMP62:%.*]] = inttoptr i64 [[TMP61]] to ptr +; CHECK-NEXT:    [[TMP63:%.*]] = load ptr, ptr [[TMP62]], align 8 +; CHECK-NEXT:    [[TMP64:%.*]] = ptrtoint ptr [[TMP63]] to i64 +; CHECK-NEXT:    [[TMP65:%.*]] = icmp sge i64 [[TMP64]], 0 +; CHECK-NEXT:    [[TMP66:%.*]] = or i1 [[TMP60]], [[TMP65]] +; CHECK-NEXT:    [[TMP67:%.*]] = add i64 [[SHADOW_PTR_INT]], 40 +; CHECK-NEXT:    [[TMP68:%.*]] = inttoptr i64 [[TMP67]] to ptr +; CHECK-NEXT:    [[TMP69:%.*]] = load ptr, ptr [[TMP68]], align 8 +; CHECK-NEXT:    [[TMP70:%.*]] = ptrtoint ptr [[TMP69]] to i64 +; CHECK-NEXT:    [[TMP71:%.*]] = icmp sge i64 [[TMP70]], 0 +; CHECK-NEXT:    [[TMP72:%.*]] = or i1 [[TMP66]], [[TMP71]] +; CHECK-NEXT:    [[TMP73:%.*]] = add i64 [[SHADOW_PTR_INT]], 48 +; CHECK-NEXT:    [[TMP74:%.*]] = inttoptr i64 [[TMP73]] to ptr +; CHECK-NEXT:    [[TMP75:%.*]] = load ptr, ptr [[TMP74]], align 8 +; CHECK-NEXT:    [[TMP76:%.*]] = ptrtoint ptr [[TMP75]] to i64 +; CHECK-NEXT:    [[TMP77:%.*]] = icmp sge i64 [[TMP76]], 0 +; CHECK-NEXT:    [[TMP78:%.*]] = or i1 [[TMP72]], [[TMP77]] +; CHECK-NEXT:    [[TMP79:%.*]] = add i64 [[SHADOW_PTR_INT]], 56 +; CHECK-NEXT:    [[TMP80:%.*]] = inttoptr i64 [[TMP79]] to ptr +; CHECK-NEXT:    [[TMP81:%.*]] = load ptr, ptr [[TMP80]], align 8 +; CHECK-NEXT:    [[TMP82:%.*]] = ptrtoint ptr [[TMP81]] to i64 +; CHECK-NEXT:    [[TMP83:%.*]] = icmp sge i64 [[TMP82]], 0 +; CHECK-NEXT:    [[TMP84:%.*]] = or i1 [[TMP78]], [[TMP83]] +; CHECK-NEXT:    br i1 [[TMP84]], label [[TMP85:%.*]], label [[TMP86:%.*]], !prof [[PROF0]] +; CHECK:       85: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_app_memory_mask, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP86]] +; CHECK:       86: +; CHECK-NEXT:    br label [[TMP87]] +; CHECK:       87: +; CHECK-NEXT:    [[APP_MEM_MASK:%.*]] = load i64, ptr @__tysan_app_memory_mask, align 8 +; CHECK-NEXT:    [[APP_PTR_MASKED3:%.*]] = and i64 ptrtoint (ptr @__tysan_shadow_memory_address to i64), [[APP_MEM_MASK2]] +; CHECK-NEXT:    [[APP_PTR_SHIFTED4:%.*]] = shl i64 [[APP_PTR_MASKED3]], 3 +; CHECK-NEXT:    [[SHADOW_PTR_INT5:%.*]] = add i64 [[APP_PTR_SHIFTED4]], [[SHADOW_BASE1]] +; CHECK-NEXT:    [[SHADOW_PTR6:%.*]] = inttoptr i64 [[SHADOW_PTR_INT5]] to ptr +; CHECK-NEXT:    [[SHADOW_DESC7:%.*]] = load ptr, ptr [[SHADOW_PTR6]], align 8 +; CHECK-NEXT:    [[BAD_DESC8:%.*]] = icmp ne ptr [[SHADOW_DESC7]], null +; CHECK-NEXT:    br i1 [[BAD_DESC8]], label [[TMP88:%.*]], label [[TMP130:%.*]], !prof [[PROF0]] +; CHECK:       88: +; CHECK-NEXT:    [[TMP89:%.*]] = icmp eq ptr [[SHADOW_DESC7]], null +; CHECK-NEXT:    br i1 [[TMP89]], label [[TMP90:%.*]], label [[TMP128:%.*]] +; CHECK:       90: +; CHECK-NEXT:    [[TMP91:%.*]] = add i64 [[SHADOW_PTR_INT5]], 8 +; CHECK-NEXT:    [[TMP92:%.*]] = inttoptr i64 [[TMP91]] to ptr +; CHECK-NEXT:    [[TMP93:%.*]] = load ptr, ptr [[TMP92]], align 8 +; CHECK-NEXT:    [[TMP94:%.*]] = icmp ne ptr [[TMP93]], null +; CHECK-NEXT:    [[TMP95:%.*]] = or i1 false, [[TMP94]] +; CHECK-NEXT:    [[TMP96:%.*]] = add i64 [[SHADOW_PTR_INT5]], 16 +; CHECK-NEXT:    [[TMP97:%.*]] = inttoptr i64 [[TMP96]] to ptr +; CHECK-NEXT:    [[TMP98:%.*]] = load ptr, ptr [[TMP97]], align 8 +; CHECK-NEXT:    [[TMP99:%.*]] = icmp ne ptr [[TMP98]], null +; CHECK-NEXT:    [[TMP100:%.*]] = or i1 [[TMP95]], [[TMP99]] +; CHECK-NEXT:    [[TMP101:%.*]] = add i64 [[SHADOW_PTR_INT5]], 24 +; CHECK-NEXT:    [[TMP102:%.*]] = inttoptr i64 [[TMP101]] to ptr +; CHECK-NEXT:    [[TMP103:%.*]] = load ptr, ptr [[TMP102]], align 8 +; CHECK-NEXT:    [[TMP104:%.*]] = icmp ne ptr [[TMP103]], null +; CHECK-NEXT:    [[TMP105:%.*]] = or i1 [[TMP100]], [[TMP104]] +; CHECK-NEXT:    [[TMP106:%.*]] = add i64 [[SHADOW_PTR_INT5]], 32 +; CHECK-NEXT:    [[TMP107:%.*]] = inttoptr i64 [[TMP106]] to ptr +; CHECK-NEXT:    [[TMP108:%.*]] = load ptr, ptr [[TMP107]], align 8 +; CHECK-NEXT:    [[TMP109:%.*]] = icmp ne ptr [[TMP108]], null +; CHECK-NEXT:    [[TMP110:%.*]] = or i1 [[TMP105]], [[TMP109]] +; CHECK-NEXT:    [[TMP111:%.*]] = add i64 [[SHADOW_PTR_INT5]], 40 +; CHECK-NEXT:    [[TMP112:%.*]] = inttoptr i64 [[TMP111]] to ptr +; CHECK-NEXT:    [[TMP113:%.*]] = load ptr, ptr [[TMP112]], align 8 +; CHECK-NEXT:    [[TMP114:%.*]] = icmp ne ptr [[TMP113]], null +; CHECK-NEXT:    [[TMP115:%.*]] = or i1 [[TMP110]], [[TMP114]] +; CHECK-NEXT:    [[TMP116:%.*]] = add i64 [[SHADOW_PTR_INT5]], 48 +; CHECK-NEXT:    [[TMP117:%.*]] = inttoptr i64 [[TMP116]] to ptr +; CHECK-NEXT:    [[TMP118:%.*]] = load ptr, ptr [[TMP117]], align 8 +; CHECK-NEXT:    [[TMP119:%.*]] = icmp ne ptr [[TMP118]], null +; CHECK-NEXT:    [[TMP120:%.*]] = or i1 [[TMP115]], [[TMP119]] +; CHECK-NEXT:    [[TMP121:%.*]] = add i64 [[SHADOW_PTR_INT5]], 56 +; CHECK-NEXT:    [[TMP122:%.*]] = inttoptr i64 [[TMP121]] to ptr +; CHECK-NEXT:    [[TMP123:%.*]] = load ptr, ptr [[TMP122]], align 8 +; CHECK-NEXT:    [[TMP124:%.*]] = icmp ne ptr [[TMP123]], null +; CHECK-NEXT:    [[TMP125:%.*]] = or i1 [[TMP120]], [[TMP124]] +; CHECK-NEXT:    br i1 [[TMP125]], label [[TMP126:%.*]], label [[TMP127:%.*]], !prof [[PROF0]] +; CHECK:       126: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_shadow_memory_address, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP127]] +; CHECK:       127: +; CHECK-NEXT:    store ptr null, ptr [[SHADOW_PTR6]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_OFFSET9:%.*]] = add i64 [[SHADOW_PTR_INT5]], 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_PTR10:%.*]] = inttoptr i64 [[SHADOW_BYTE_1_OFFSET9]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -1 to ptr), ptr [[SHADOW_BYTE_1_PTR10]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_2_OFFSET11:%.*]] = add i64 [[SHADOW_PTR_INT5]], 16 +; CHECK-NEXT:    [[SHADOW_BYTE_2_PTR12:%.*]] = inttoptr i64 [[SHADOW_BYTE_2_OFFSET11]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -2 to ptr), ptr [[SHADOW_BYTE_2_PTR12]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_3_OFFSET13:%.*]] = add i64 [[SHADOW_PTR_INT5]], 24 +; CHECK-NEXT:    [[SHADOW_BYTE_3_PTR14:%.*]] = inttoptr i64 [[SHADOW_BYTE_3_OFFSET13]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -3 to ptr), ptr [[SHADOW_BYTE_3_PTR14]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_4_OFFSET15:%.*]] = add i64 [[SHADOW_PTR_INT5]], 32 +; CHECK-NEXT:    [[SHADOW_BYTE_4_PTR16:%.*]] = inttoptr i64 [[SHADOW_BYTE_4_OFFSET15]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -4 to ptr), ptr [[SHADOW_BYTE_4_PTR16]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_5_OFFSET17:%.*]] = add i64 [[SHADOW_PTR_INT5]], 40 +; CHECK-NEXT:    [[SHADOW_BYTE_5_PTR18:%.*]] = inttoptr i64 [[SHADOW_BYTE_5_OFFSET17]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -5 to ptr), ptr [[SHADOW_BYTE_5_PTR18]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_6_OFFSET19:%.*]] = add i64 [[SHADOW_PTR_INT5]], 48 +; CHECK-NEXT:    [[SHADOW_BYTE_6_PTR20:%.*]] = inttoptr i64 [[SHADOW_BYTE_6_OFFSET19]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -6 to ptr), ptr [[SHADOW_BYTE_6_PTR20]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_7_OFFSET21:%.*]] = add i64 [[SHADOW_PTR_INT5]], 56 +; CHECK-NEXT:    [[SHADOW_BYTE_7_PTR22:%.*]] = inttoptr i64 [[SHADOW_BYTE_7_OFFSET21]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -7 to ptr), ptr [[SHADOW_BYTE_7_PTR22]], align 8 +; CHECK-NEXT:    br label [[TMP129:%.*]] +; CHECK:       128: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_shadow_memory_address, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP129]] +; CHECK:       129: +; CHECK-NEXT:    br label [[TMP175:%.*]] +; CHECK:       130: +; CHECK-NEXT:    [[TMP131:%.*]] = add i64 [[SHADOW_PTR_INT5]], 8 +; CHECK-NEXT:    [[TMP132:%.*]] = inttoptr i64 [[TMP131]] to ptr +; CHECK-NEXT:    [[TMP133:%.*]] = load ptr, ptr [[TMP132]], align 8 +; CHECK-NEXT:    [[TMP134:%.*]] = ptrtoint ptr [[TMP133]] to i64 +; CHECK-NEXT:    [[TMP135:%.*]] = icmp sge i64 [[TMP134]], 0 +; CHECK-NEXT:    [[TMP136:%.*]] = or i1 false, [[TMP135]] +; CHECK-NEXT:    [[TMP137:%.*]] = add i64 [[SHADOW_PTR_INT5]], 16 +; CHECK-NEXT:    [[TMP138:%.*]] = inttoptr i64 [[TMP137]] to ptr +; CHECK-NEXT:    [[TMP139:%.*]] = load ptr, ptr [[TMP138]], align 8 +; CHECK-NEXT:    [[TMP140:%.*]] = ptrtoint ptr [[TMP139]] to i64 +; CHECK-NEXT:    [[TMP141:%.*]] = icmp sge i64 [[TMP140]], 0 +; CHECK-NEXT:    [[TMP142:%.*]] = or i1 [[TMP136]], [[TMP141]] +; CHECK-NEXT:    [[TMP143:%.*]] = add i64 [[SHADOW_PTR_INT5]], 24 +; CHECK-NEXT:    [[TMP144:%.*]] = inttoptr i64 [[TMP143]] to ptr +; CHECK-NEXT:    [[TMP145:%.*]] = load ptr, ptr [[TMP144]], align 8 +; CHECK-NEXT:    [[TMP146:%.*]] = ptrtoint ptr [[TMP145]] to i64 +; CHECK-NEXT:    [[TMP147:%.*]] = icmp sge i64 [[TMP146]], 0 +; CHECK-NEXT:    [[TMP148:%.*]] = or i1 [[TMP142]], [[TMP147]] +; CHECK-NEXT:    [[TMP149:%.*]] = add i64 [[SHADOW_PTR_INT5]], 32 +; CHECK-NEXT:    [[TMP150:%.*]] = inttoptr i64 [[TMP149]] to ptr +; CHECK-NEXT:    [[TMP151:%.*]] = load ptr, ptr [[TMP150]], align 8 +; CHECK-NEXT:    [[TMP152:%.*]] = ptrtoint ptr [[TMP151]] to i64 +; CHECK-NEXT:    [[TMP153:%.*]] = icmp sge i64 [[TMP152]], 0 +; CHECK-NEXT:    [[TMP154:%.*]] = or i1 [[TMP148]], [[TMP153]] +; CHECK-NEXT:    [[TMP155:%.*]] = add i64 [[SHADOW_PTR_INT5]], 40 +; CHECK-NEXT:    [[TMP156:%.*]] = inttoptr i64 [[TMP155]] to ptr +; CHECK-NEXT:    [[TMP157:%.*]] = load ptr, ptr [[TMP156]], align 8 +; CHECK-NEXT:    [[TMP158:%.*]] = ptrtoint ptr [[TMP157]] to i64 +; CHECK-NEXT:    [[TMP159:%.*]] = icmp sge i64 [[TMP158]], 0 +; CHECK-NEXT:    [[TMP160:%.*]] = or i1 [[TMP154]], [[TMP159]] +; CHECK-NEXT:    [[TMP161:%.*]] = add i64 [[SHADOW_PTR_INT5]], 48 +; CHECK-NEXT:    [[TMP162:%.*]] = inttoptr i64 [[TMP161]] to ptr +; CHECK-NEXT:    [[TMP163:%.*]] = load ptr, ptr [[TMP162]], align 8 +; CHECK-NEXT:    [[TMP164:%.*]] = ptrtoint ptr [[TMP163]] to i64 +; CHECK-NEXT:    [[TMP165:%.*]] = icmp sge i64 [[TMP164]], 0 +; CHECK-NEXT:    [[TMP166:%.*]] = or i1 [[TMP160]], [[TMP165]] +; CHECK-NEXT:    [[TMP167:%.*]] = add i64 [[SHADOW_PTR_INT5]], 56 +; CHECK-NEXT:    [[TMP168:%.*]] = inttoptr i64 [[TMP167]] to ptr +; CHECK-NEXT:    [[TMP169:%.*]] = load ptr, ptr [[TMP168]], align 8 +; CHECK-NEXT:    [[TMP170:%.*]] = ptrtoint ptr [[TMP169]] to i64 +; CHECK-NEXT:    [[TMP171:%.*]] = icmp sge i64 [[TMP170]], 0 +; CHECK-NEXT:    [[TMP172:%.*]] = or i1 [[TMP166]], [[TMP171]] +; CHECK-NEXT:    br i1 [[TMP172]], label [[TMP173:%.*]], label [[TMP174:%.*]], !prof [[PROF0]] +; CHECK:       173: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_shadow_memory_address, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP174]] +; CHECK:       174: +; CHECK-NEXT:    br label [[TMP175]] +; CHECK:       175: +; CHECK-NEXT:    [[SHADOW_BASE:%.*]] = load i64, ptr @__tysan_shadow_memory_address, align 8 +; CHECK-NEXT:    call void @__tysan_instrument_with_shadow_update(ptr [[A:%.*]], ptr @__tysan_v1_int_o_0, i1 true, i64 4, i32 1) +; CHECK-NEXT:    [[APP_PTR_INT:%.*]] = ptrtoint ptr [[A]] to i64 +; CHECK-NEXT:    [[APP_PTR_MASKED23:%.*]] = and i64 [[APP_PTR_INT]], [[APP_MEM_MASK2]] +; CHECK-NEXT:    [[APP_PTR_SHIFTED24:%.*]] = shl i64 [[APP_PTR_MASKED23]], 3 +; CHECK-NEXT:    [[SHADOW_PTR_INT25:%.*]] = add i64 [[APP_PTR_SHIFTED24]], [[SHADOW_BASE1]] +; CHECK-NEXT:    [[SHADOW_PTR26:%.*]] = inttoptr i64 [[SHADOW_PTR_INT25]] to ptr +; CHECK-NEXT:    [[SHADOW_DESC27:%.*]] = load ptr, ptr [[SHADOW_PTR26]], align 8 +; CHECK-NEXT:    [[BAD_DESC28:%.*]] = icmp ne ptr [[SHADOW_DESC27]], @__tysan_v1_int_o_0 +; CHECK-NEXT:    br i1 [[BAD_DESC28]], label [[TMP176:%.*]], label [[TMP198:%.*]], !prof [[PROF0]] +; CHECK:       176: +; CHECK-NEXT:    [[TMP177:%.*]] = icmp eq ptr [[SHADOW_DESC27]], null +; CHECK-NEXT:    br i1 [[TMP177]], label [[TMP178:%.*]], label [[TMP196:%.*]] +; CHECK:       178: +; CHECK-NEXT:    [[TMP179:%.*]] = add i64 [[SHADOW_PTR_INT25]], 8 +; CHECK-NEXT:    [[TMP180:%.*]] = inttoptr i64 [[TMP179]] to ptr +; CHECK-NEXT:    [[TMP181:%.*]] = load ptr, ptr [[TMP180]], align 8 +; CHECK-NEXT:    [[TMP182:%.*]] = icmp ne ptr [[TMP181]], null +; CHECK-NEXT:    [[TMP183:%.*]] = or i1 false, [[TMP182]] +; CHECK-NEXT:    [[TMP184:%.*]] = add i64 [[SHADOW_PTR_INT25]], 16 +; CHECK-NEXT:    [[TMP185:%.*]] = inttoptr i64 [[TMP184]] to ptr +; CHECK-NEXT:    [[TMP186:%.*]] = load ptr, ptr [[TMP185]], align 8 +; CHECK-NEXT:    [[TMP187:%.*]] = icmp ne ptr [[TMP186]], null +; CHECK-NEXT:    [[TMP188:%.*]] = or i1 [[TMP183]], [[TMP187]] +; CHECK-NEXT:    [[TMP189:%.*]] = add i64 [[SHADOW_PTR_INT25]], 24 +; CHECK-NEXT:    [[TMP190:%.*]] = inttoptr i64 [[TMP189]] to ptr +; CHECK-NEXT:    [[TMP191:%.*]] = load ptr, ptr [[TMP190]], align 8 +; CHECK-NEXT:    [[TMP192:%.*]] = icmp ne ptr [[TMP191]], null +; CHECK-NEXT:    [[TMP193:%.*]] = or i1 [[TMP188]], [[TMP192]] +; CHECK-NEXT:    br i1 [[TMP193]], label [[TMP194:%.*]], label [[TMP195:%.*]], !prof [[PROF0]] +; CHECK:       194: +; CHECK-NEXT:    call void @__tysan_check(ptr [[A]], i32 4, ptr @__tysan_v1_int_o_0, i32 1) +; CHECK-NEXT:    br label [[TMP195]] +; CHECK:       195: +; CHECK-NEXT:    store ptr @__tysan_v1_int_o_0, ptr [[SHADOW_PTR26]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_OFFSET29:%.*]] = add i64 [[SHADOW_PTR_INT25]], 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_PTR30:%.*]] = inttoptr i64 [[SHADOW_BYTE_1_OFFSET29]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -1 to ptr), ptr [[SHADOW_BYTE_1_PTR30]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_2_OFFSET31:%.*]] = add i64 [[SHADOW_PTR_INT25]], 16 +; CHECK-NEXT:    [[SHADOW_BYTE_2_PTR32:%.*]] = inttoptr i64 [[SHADOW_BYTE_2_OFFSET31]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -2 to ptr), ptr [[SHADOW_BYTE_2_PTR32]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_3_OFFSET33:%.*]] = add i64 [[SHADOW_PTR_INT25]], 24 +; CHECK-NEXT:    [[SHADOW_BYTE_3_PTR34:%.*]] = inttoptr i64 [[SHADOW_BYTE_3_OFFSET33]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -3 to ptr), ptr [[SHADOW_BYTE_3_PTR34]], align 8 +; CHECK-NEXT:    br label [[TMP197:%.*]] +; CHECK:       196: +; CHECK-NEXT:    call void @__tysan_check(ptr [[A]], i32 4, ptr @__tysan_v1_int_o_0, i32 1) +; CHECK-NEXT:    br label [[TMP197]] +; CHECK:       197: +; CHECK-NEXT:    br label [[TMP219:%.*]] +; CHECK:       198: +; CHECK-NEXT:    [[TMP199:%.*]] = add i64 [[SHADOW_PTR_INT25]], 8 +; CHECK-NEXT:    [[TMP200:%.*]] = inttoptr i64 [[TMP199]] to ptr +; CHECK-NEXT:    [[TMP201:%.*]] = load ptr, ptr [[TMP200]], align 8 +; CHECK-NEXT:    [[TMP202:%.*]] = ptrtoint ptr [[TMP201]] to i64 +; CHECK-NEXT:    [[TMP203:%.*]] = icmp sge i64 [[TMP202]], 0 +; CHECK-NEXT:    [[TMP204:%.*]] = or i1 false, [[TMP203]] +; CHECK-NEXT:    [[TMP205:%.*]] = add i64 [[SHADOW_PTR_INT25]], 16 +; CHECK-NEXT:    [[TMP206:%.*]] = inttoptr i64 [[TMP205]] to ptr +; CHECK-NEXT:    [[TMP207:%.*]] = load ptr, ptr [[TMP206]], align 8 +; CHECK-NEXT:    [[TMP208:%.*]] = ptrtoint ptr [[TMP207]] to i64 +; CHECK-NEXT:    [[TMP209:%.*]] = icmp sge i64 [[TMP208]], 0 +; CHECK-NEXT:    [[TMP210:%.*]] = or i1 [[TMP204]], [[TMP209]] +; CHECK-NEXT:    [[TMP211:%.*]] = add i64 [[SHADOW_PTR_INT25]], 24 +; CHECK-NEXT:    [[TMP212:%.*]] = inttoptr i64 [[TMP211]] to ptr +; CHECK-NEXT:    [[TMP213:%.*]] = load ptr, ptr [[TMP212]], align 8 +; CHECK-NEXT:    [[TMP214:%.*]] = ptrtoint ptr [[TMP213]] to i64 +; CHECK-NEXT:    [[TMP215:%.*]] = icmp sge i64 [[TMP214]], 0 +; CHECK-NEXT:    [[TMP216:%.*]] = or i1 [[TMP210]], [[TMP215]] +; CHECK-NEXT:    br i1 [[TMP216]], label [[TMP217:%.*]], label [[TMP218:%.*]], !prof [[PROF0]] +; CHECK:       217: +; CHECK-NEXT:    call void @__tysan_check(ptr [[A]], i32 4, ptr @__tysan_v1_int_o_0, i32 1) +; CHECK-NEXT:    br label [[TMP218]] +; CHECK:       218: +; CHECK-NEXT:    br label [[TMP219]] +; CHECK:       219: +; CHECK-NEXT:    [[WAA:%.*]] = load i32, ptr [[A]], align 4, !tbaa [[TBAA1:![0-9]+]] +; CHECK-NEXT:    ret i32 [[WAA]] +; +entry: +  %WAA = load i32, ptr %a, align 4, !tbaa !3 +  ret i32 %WAA +} + +define void @test_store(ptr %a) sanitize_type { +; CHECK-LABEL: @test_store( +; CHECK-NEXT:  entry: +; CHECK-NEXT:    [[APP_MEM_MASK2:%.*]] = load i64, ptr @__tysan_app_memory_mask, align 8 +; CHECK-NEXT:    [[SHADOW_BASE1:%.*]] = load i64, ptr @__tysan_shadow_memory_address, align 8 +; CHECK-NEXT:    [[APP_PTR_MASKED:%.*]] = and i64 ptrtoint (ptr @__tysan_app_memory_mask to i64), [[APP_MEM_MASK2]] +; CHECK-NEXT:    [[APP_PTR_SHIFTED:%.*]] = shl i64 [[APP_PTR_MASKED]], 3 +; CHECK-NEXT:    [[SHADOW_PTR_INT:%.*]] = add i64 [[APP_PTR_SHIFTED]], [[SHADOW_BASE1]] +; CHECK-NEXT:    [[SHADOW_PTR:%.*]] = inttoptr i64 [[SHADOW_PTR_INT]] to ptr +; CHECK-NEXT:    [[SHADOW_DESC:%.*]] = load ptr, ptr [[SHADOW_PTR]], align 8 +; CHECK-NEXT:    [[BAD_DESC:%.*]] = icmp ne ptr [[SHADOW_DESC]], null +; CHECK-NEXT:    br i1 [[BAD_DESC]], label [[TMP0:%.*]], label [[TMP42:%.*]], !prof [[PROF0]] +; CHECK:       0: +; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq ptr [[SHADOW_DESC]], null +; CHECK-NEXT:    br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP40:%.*]] +; CHECK:       2: +; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[SHADOW_PTR_INT]], 8 +; CHECK-NEXT:    [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr +; CHECK-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 +; CHECK-NEXT:    [[TMP6:%.*]] = icmp ne ptr [[TMP5]], null +; CHECK-NEXT:    [[TMP7:%.*]] = or i1 false, [[TMP6]] +; CHECK-NEXT:    [[TMP8:%.*]] = add i64 [[SHADOW_PTR_INT]], 16 +; CHECK-NEXT:    [[TMP9:%.*]] = inttoptr i64 [[TMP8]] to ptr +; CHECK-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8 +; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne ptr [[TMP10]], null +; CHECK-NEXT:    [[TMP12:%.*]] = or i1 [[TMP7]], [[TMP11]] +; CHECK-NEXT:    [[TMP13:%.*]] = add i64 [[SHADOW_PTR_INT]], 24 +; CHECK-NEXT:    [[TMP14:%.*]] = inttoptr i64 [[TMP13]] to ptr +; CHECK-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 8 +; CHECK-NEXT:    [[TMP16:%.*]] = icmp ne ptr [[TMP15]], null +; CHECK-NEXT:    [[TMP17:%.*]] = or i1 [[TMP12]], [[TMP16]] +; CHECK-NEXT:    [[TMP18:%.*]] = add i64 [[SHADOW_PTR_INT]], 32 +; CHECK-NEXT:    [[TMP19:%.*]] = inttoptr i64 [[TMP18]] to ptr +; CHECK-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8 +; CHECK-NEXT:    [[TMP21:%.*]] = icmp ne ptr [[TMP20]], null +; CHECK-NEXT:    [[TMP22:%.*]] = or i1 [[TMP17]], [[TMP21]] +; CHECK-NEXT:    [[TMP23:%.*]] = add i64 [[SHADOW_PTR_INT]], 40 +; CHECK-NEXT:    [[TMP24:%.*]] = inttoptr i64 [[TMP23]] to ptr +; CHECK-NEXT:    [[TMP25:%.*]] = load ptr, ptr [[TMP24]], align 8 +; CHECK-NEXT:    [[TMP26:%.*]] = icmp ne ptr [[TMP25]], null +; CHECK-NEXT:    [[TMP27:%.*]] = or i1 [[TMP22]], [[TMP26]] +; CHECK-NEXT:    [[TMP28:%.*]] = add i64 [[SHADOW_PTR_INT]], 48 +; CHECK-NEXT:    [[TMP29:%.*]] = inttoptr i64 [[TMP28]] to ptr +; CHECK-NEXT:    [[TMP30:%.*]] = load ptr, ptr [[TMP29]], align 8 +; CHECK-NEXT:    [[TMP31:%.*]] = icmp ne ptr [[TMP30]], null +; CHECK-NEXT:    [[TMP32:%.*]] = or i1 [[TMP27]], [[TMP31]] +; CHECK-NEXT:    [[TMP33:%.*]] = add i64 [[SHADOW_PTR_INT]], 56 +; CHECK-NEXT:    [[TMP34:%.*]] = inttoptr i64 [[TMP33]] to ptr +; CHECK-NEXT:    [[TMP35:%.*]] = load ptr, ptr [[TMP34]], align 8 +; CHECK-NEXT:    [[TMP36:%.*]] = icmp ne ptr [[TMP35]], null +; CHECK-NEXT:    [[TMP37:%.*]] = or i1 [[TMP32]], [[TMP36]] +; CHECK-NEXT:    br i1 [[TMP37]], label [[TMP38:%.*]], label [[TMP39:%.*]], !prof [[PROF0]] +; CHECK:       38: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_app_memory_mask, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP39]] +; CHECK:       39: +; CHECK-NEXT:    store ptr null, ptr [[SHADOW_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_1_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -1 to ptr), ptr [[SHADOW_BYTE_1_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_2_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 16 +; CHECK-NEXT:    [[SHADOW_BYTE_2_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_2_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -2 to ptr), ptr [[SHADOW_BYTE_2_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_3_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 24 +; CHECK-NEXT:    [[SHADOW_BYTE_3_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_3_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -3 to ptr), ptr [[SHADOW_BYTE_3_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_4_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 32 +; CHECK-NEXT:    [[SHADOW_BYTE_4_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_4_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -4 to ptr), ptr [[SHADOW_BYTE_4_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_5_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 40 +; CHECK-NEXT:    [[SHADOW_BYTE_5_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_5_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -5 to ptr), ptr [[SHADOW_BYTE_5_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_6_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 48 +; CHECK-NEXT:    [[SHADOW_BYTE_6_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_6_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -6 to ptr), ptr [[SHADOW_BYTE_6_PTR]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_7_OFFSET:%.*]] = add i64 [[SHADOW_PTR_INT]], 56 +; CHECK-NEXT:    [[SHADOW_BYTE_7_PTR:%.*]] = inttoptr i64 [[SHADOW_BYTE_7_OFFSET]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -7 to ptr), ptr [[SHADOW_BYTE_7_PTR]], align 8 +; CHECK-NEXT:    br label [[TMP41:%.*]] +; CHECK:       40: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_app_memory_mask, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP41]] +; CHECK:       41: +; CHECK-NEXT:    br label [[TMP87:%.*]] +; CHECK:       42: +; CHECK-NEXT:    [[TMP43:%.*]] = add i64 [[SHADOW_PTR_INT]], 8 +; CHECK-NEXT:    [[TMP44:%.*]] = inttoptr i64 [[TMP43]] to ptr +; CHECK-NEXT:    [[TMP45:%.*]] = load ptr, ptr [[TMP44]], align 8 +; CHECK-NEXT:    [[TMP46:%.*]] = ptrtoint ptr [[TMP45]] to i64 +; CHECK-NEXT:    [[TMP47:%.*]] = icmp sge i64 [[TMP46]], 0 +; CHECK-NEXT:    [[TMP48:%.*]] = or i1 false, [[TMP47]] +; CHECK-NEXT:    [[TMP49:%.*]] = add i64 [[SHADOW_PTR_INT]], 16 +; CHECK-NEXT:    [[TMP50:%.*]] = inttoptr i64 [[TMP49]] to ptr +; CHECK-NEXT:    [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 8 +; CHECK-NEXT:    [[TMP52:%.*]] = ptrtoint ptr [[TMP51]] to i64 +; CHECK-NEXT:    [[TMP53:%.*]] = icmp sge i64 [[TMP52]], 0 +; CHECK-NEXT:    [[TMP54:%.*]] = or i1 [[TMP48]], [[TMP53]] +; CHECK-NEXT:    [[TMP55:%.*]] = add i64 [[SHADOW_PTR_INT]], 24 +; CHECK-NEXT:    [[TMP56:%.*]] = inttoptr i64 [[TMP55]] to ptr +; CHECK-NEXT:    [[TMP57:%.*]] = load ptr, ptr [[TMP56]], align 8 +; CHECK-NEXT:    [[TMP58:%.*]] = ptrtoint ptr [[TMP57]] to i64 +; CHECK-NEXT:    [[TMP59:%.*]] = icmp sge i64 [[TMP58]], 0 +; CHECK-NEXT:    [[TMP60:%.*]] = or i1 [[TMP54]], [[TMP59]] +; CHECK-NEXT:    [[TMP61:%.*]] = add i64 [[SHADOW_PTR_INT]], 32 +; CHECK-NEXT:    [[TMP62:%.*]] = inttoptr i64 [[TMP61]] to ptr +; CHECK-NEXT:    [[TMP63:%.*]] = load ptr, ptr [[TMP62]], align 8 +; CHECK-NEXT:    [[TMP64:%.*]] = ptrtoint ptr [[TMP63]] to i64 +; CHECK-NEXT:    [[TMP65:%.*]] = icmp sge i64 [[TMP64]], 0 +; CHECK-NEXT:    [[TMP66:%.*]] = or i1 [[TMP60]], [[TMP65]] +; CHECK-NEXT:    [[TMP67:%.*]] = add i64 [[SHADOW_PTR_INT]], 40 +; CHECK-NEXT:    [[TMP68:%.*]] = inttoptr i64 [[TMP67]] to ptr +; CHECK-NEXT:    [[TMP69:%.*]] = load ptr, ptr [[TMP68]], align 8 +; CHECK-NEXT:    [[TMP70:%.*]] = ptrtoint ptr [[TMP69]] to i64 +; CHECK-NEXT:    [[TMP71:%.*]] = icmp sge i64 [[TMP70]], 0 +; CHECK-NEXT:    [[TMP72:%.*]] = or i1 [[TMP66]], [[TMP71]] +; CHECK-NEXT:    [[TMP73:%.*]] = add i64 [[SHADOW_PTR_INT]], 48 +; CHECK-NEXT:    [[TMP74:%.*]] = inttoptr i64 [[TMP73]] to ptr +; CHECK-NEXT:    [[TMP75:%.*]] = load ptr, ptr [[TMP74]], align 8 +; CHECK-NEXT:    [[TMP76:%.*]] = ptrtoint ptr [[TMP75]] to i64 +; CHECK-NEXT:    [[TMP77:%.*]] = icmp sge i64 [[TMP76]], 0 +; CHECK-NEXT:    [[TMP78:%.*]] = or i1 [[TMP72]], [[TMP77]] +; CHECK-NEXT:    [[TMP79:%.*]] = add i64 [[SHADOW_PTR_INT]], 56 +; CHECK-NEXT:    [[TMP80:%.*]] = inttoptr i64 [[TMP79]] to ptr +; CHECK-NEXT:    [[TMP81:%.*]] = load ptr, ptr [[TMP80]], align 8 +; CHECK-NEXT:    [[TMP82:%.*]] = ptrtoint ptr [[TMP81]] to i64 +; CHECK-NEXT:    [[TMP83:%.*]] = icmp sge i64 [[TMP82]], 0 +; CHECK-NEXT:    [[TMP84:%.*]] = or i1 [[TMP78]], [[TMP83]] +; CHECK-NEXT:    br i1 [[TMP84]], label [[TMP85:%.*]], label [[TMP86:%.*]], !prof [[PROF0]] +; CHECK:       85: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_app_memory_mask, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP86]] +; CHECK:       86: +; CHECK-NEXT:    br label [[TMP87]] +; CHECK:       87: +; CHECK-NEXT:    [[APP_MEM_MASK:%.*]] = load i64, ptr @__tysan_app_memory_mask, align 8 +; CHECK-NEXT:    [[APP_PTR_MASKED3:%.*]] = and i64 ptrtoint (ptr @__tysan_shadow_memory_address to i64), [[APP_MEM_MASK2]] +; CHECK-NEXT:    [[APP_PTR_SHIFTED4:%.*]] = shl i64 [[APP_PTR_MASKED3]], 3 +; CHECK-NEXT:    [[SHADOW_PTR_INT5:%.*]] = add i64 [[APP_PTR_SHIFTED4]], [[SHADOW_BASE1]] +; CHECK-NEXT:    [[SHADOW_PTR6:%.*]] = inttoptr i64 [[SHADOW_PTR_INT5]] to ptr +; CHECK-NEXT:    [[SHADOW_DESC7:%.*]] = load ptr, ptr [[SHADOW_PTR6]], align 8 +; CHECK-NEXT:    [[BAD_DESC8:%.*]] = icmp ne ptr [[SHADOW_DESC7]], null +; CHECK-NEXT:    br i1 [[BAD_DESC8]], label [[TMP88:%.*]], label [[TMP130:%.*]], !prof [[PROF0]] +; CHECK:       88: +; CHECK-NEXT:    [[TMP89:%.*]] = icmp eq ptr [[SHADOW_DESC7]], null +; CHECK-NEXT:    br i1 [[TMP89]], label [[TMP90:%.*]], label [[TMP128:%.*]] +; CHECK:       90: +; CHECK-NEXT:    [[TMP91:%.*]] = add i64 [[SHADOW_PTR_INT5]], 8 +; CHECK-NEXT:    [[TMP92:%.*]] = inttoptr i64 [[TMP91]] to ptr +; CHECK-NEXT:    [[TMP93:%.*]] = load ptr, ptr [[TMP92]], align 8 +; CHECK-NEXT:    [[TMP94:%.*]] = icmp ne ptr [[TMP93]], null +; CHECK-NEXT:    [[TMP95:%.*]] = or i1 false, [[TMP94]] +; CHECK-NEXT:    [[TMP96:%.*]] = add i64 [[SHADOW_PTR_INT5]], 16 +; CHECK-NEXT:    [[TMP97:%.*]] = inttoptr i64 [[TMP96]] to ptr +; CHECK-NEXT:    [[TMP98:%.*]] = load ptr, ptr [[TMP97]], align 8 +; CHECK-NEXT:    [[TMP99:%.*]] = icmp ne ptr [[TMP98]], null +; CHECK-NEXT:    [[TMP100:%.*]] = or i1 [[TMP95]], [[TMP99]] +; CHECK-NEXT:    [[TMP101:%.*]] = add i64 [[SHADOW_PTR_INT5]], 24 +; CHECK-NEXT:    [[TMP102:%.*]] = inttoptr i64 [[TMP101]] to ptr +; CHECK-NEXT:    [[TMP103:%.*]] = load ptr, ptr [[TMP102]], align 8 +; CHECK-NEXT:    [[TMP104:%.*]] = icmp ne ptr [[TMP103]], null +; CHECK-NEXT:    [[TMP105:%.*]] = or i1 [[TMP100]], [[TMP104]] +; CHECK-NEXT:    [[TMP106:%.*]] = add i64 [[SHADOW_PTR_INT5]], 32 +; CHECK-NEXT:    [[TMP107:%.*]] = inttoptr i64 [[TMP106]] to ptr +; CHECK-NEXT:    [[TMP108:%.*]] = load ptr, ptr [[TMP107]], align 8 +; CHECK-NEXT:    [[TMP109:%.*]] = icmp ne ptr [[TMP108]], null +; CHECK-NEXT:    [[TMP110:%.*]] = or i1 [[TMP105]], [[TMP109]] +; CHECK-NEXT:    [[TMP111:%.*]] = add i64 [[SHADOW_PTR_INT5]], 40 +; CHECK-NEXT:    [[TMP112:%.*]] = inttoptr i64 [[TMP111]] to ptr +; CHECK-NEXT:    [[TMP113:%.*]] = load ptr, ptr [[TMP112]], align 8 +; CHECK-NEXT:    [[TMP114:%.*]] = icmp ne ptr [[TMP113]], null +; CHECK-NEXT:    [[TMP115:%.*]] = or i1 [[TMP110]], [[TMP114]] +; CHECK-NEXT:    [[TMP116:%.*]] = add i64 [[SHADOW_PTR_INT5]], 48 +; CHECK-NEXT:    [[TMP117:%.*]] = inttoptr i64 [[TMP116]] to ptr +; CHECK-NEXT:    [[TMP118:%.*]] = load ptr, ptr [[TMP117]], align 8 +; CHECK-NEXT:    [[TMP119:%.*]] = icmp ne ptr [[TMP118]], null +; CHECK-NEXT:    [[TMP120:%.*]] = or i1 [[TMP115]], [[TMP119]] +; CHECK-NEXT:    [[TMP121:%.*]] = add i64 [[SHADOW_PTR_INT5]], 56 +; CHECK-NEXT:    [[TMP122:%.*]] = inttoptr i64 [[TMP121]] to ptr +; CHECK-NEXT:    [[TMP123:%.*]] = load ptr, ptr [[TMP122]], align 8 +; CHECK-NEXT:    [[TMP124:%.*]] = icmp ne ptr [[TMP123]], null +; CHECK-NEXT:    [[TMP125:%.*]] = or i1 [[TMP120]], [[TMP124]] +; CHECK-NEXT:    br i1 [[TMP125]], label [[TMP126:%.*]], label [[TMP127:%.*]], !prof [[PROF0]] +; CHECK:       126: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_shadow_memory_address, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP127]] +; CHECK:       127: +; CHECK-NEXT:    store ptr null, ptr [[SHADOW_PTR6]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_OFFSET9:%.*]] = add i64 [[SHADOW_PTR_INT5]], 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_PTR10:%.*]] = inttoptr i64 [[SHADOW_BYTE_1_OFFSET9]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -1 to ptr), ptr [[SHADOW_BYTE_1_PTR10]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_2_OFFSET11:%.*]] = add i64 [[SHADOW_PTR_INT5]], 16 +; CHECK-NEXT:    [[SHADOW_BYTE_2_PTR12:%.*]] = inttoptr i64 [[SHADOW_BYTE_2_OFFSET11]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -2 to ptr), ptr [[SHADOW_BYTE_2_PTR12]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_3_OFFSET13:%.*]] = add i64 [[SHADOW_PTR_INT5]], 24 +; CHECK-NEXT:    [[SHADOW_BYTE_3_PTR14:%.*]] = inttoptr i64 [[SHADOW_BYTE_3_OFFSET13]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -3 to ptr), ptr [[SHADOW_BYTE_3_PTR14]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_4_OFFSET15:%.*]] = add i64 [[SHADOW_PTR_INT5]], 32 +; CHECK-NEXT:    [[SHADOW_BYTE_4_PTR16:%.*]] = inttoptr i64 [[SHADOW_BYTE_4_OFFSET15]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -4 to ptr), ptr [[SHADOW_BYTE_4_PTR16]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_5_OFFSET17:%.*]] = add i64 [[SHADOW_PTR_INT5]], 40 +; CHECK-NEXT:    [[SHADOW_BYTE_5_PTR18:%.*]] = inttoptr i64 [[SHADOW_BYTE_5_OFFSET17]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -5 to ptr), ptr [[SHADOW_BYTE_5_PTR18]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_6_OFFSET19:%.*]] = add i64 [[SHADOW_PTR_INT5]], 48 +; CHECK-NEXT:    [[SHADOW_BYTE_6_PTR20:%.*]] = inttoptr i64 [[SHADOW_BYTE_6_OFFSET19]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -6 to ptr), ptr [[SHADOW_BYTE_6_PTR20]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_7_OFFSET21:%.*]] = add i64 [[SHADOW_PTR_INT5]], 56 +; CHECK-NEXT:    [[SHADOW_BYTE_7_PTR22:%.*]] = inttoptr i64 [[SHADOW_BYTE_7_OFFSET21]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -7 to ptr), ptr [[SHADOW_BYTE_7_PTR22]], align 8 +; CHECK-NEXT:    br label [[TMP129:%.*]] +; CHECK:       128: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_shadow_memory_address, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP129]] +; CHECK:       129: +; CHECK-NEXT:    br label [[TMP175:%.*]] +; CHECK:       130: +; CHECK-NEXT:    [[TMP131:%.*]] = add i64 [[SHADOW_PTR_INT5]], 8 +; CHECK-NEXT:    [[TMP132:%.*]] = inttoptr i64 [[TMP131]] to ptr +; CHECK-NEXT:    [[TMP133:%.*]] = load ptr, ptr [[TMP132]], align 8 +; CHECK-NEXT:    [[TMP134:%.*]] = ptrtoint ptr [[TMP133]] to i64 +; CHECK-NEXT:    [[TMP135:%.*]] = icmp sge i64 [[TMP134]], 0 +; CHECK-NEXT:    [[TMP136:%.*]] = or i1 false, [[TMP135]] +; CHECK-NEXT:    [[TMP137:%.*]] = add i64 [[SHADOW_PTR_INT5]], 16 +; CHECK-NEXT:    [[TMP138:%.*]] = inttoptr i64 [[TMP137]] to ptr +; CHECK-NEXT:    [[TMP139:%.*]] = load ptr, ptr [[TMP138]], align 8 +; CHECK-NEXT:    [[TMP140:%.*]] = ptrtoint ptr [[TMP139]] to i64 +; CHECK-NEXT:    [[TMP141:%.*]] = icmp sge i64 [[TMP140]], 0 +; CHECK-NEXT:    [[TMP142:%.*]] = or i1 [[TMP136]], [[TMP141]] +; CHECK-NEXT:    [[TMP143:%.*]] = add i64 [[SHADOW_PTR_INT5]], 24 +; CHECK-NEXT:    [[TMP144:%.*]] = inttoptr i64 [[TMP143]] to ptr +; CHECK-NEXT:    [[TMP145:%.*]] = load ptr, ptr [[TMP144]], align 8 +; CHECK-NEXT:    [[TMP146:%.*]] = ptrtoint ptr [[TMP145]] to i64 +; CHECK-NEXT:    [[TMP147:%.*]] = icmp sge i64 [[TMP146]], 0 +; CHECK-NEXT:    [[TMP148:%.*]] = or i1 [[TMP142]], [[TMP147]] +; CHECK-NEXT:    [[TMP149:%.*]] = add i64 [[SHADOW_PTR_INT5]], 32 +; CHECK-NEXT:    [[TMP150:%.*]] = inttoptr i64 [[TMP149]] to ptr +; CHECK-NEXT:    [[TMP151:%.*]] = load ptr, ptr [[TMP150]], align 8 +; CHECK-NEXT:    [[TMP152:%.*]] = ptrtoint ptr [[TMP151]] to i64 +; CHECK-NEXT:    [[TMP153:%.*]] = icmp sge i64 [[TMP152]], 0 +; CHECK-NEXT:    [[TMP154:%.*]] = or i1 [[TMP148]], [[TMP153]] +; CHECK-NEXT:    [[TMP155:%.*]] = add i64 [[SHADOW_PTR_INT5]], 40 +; CHECK-NEXT:    [[TMP156:%.*]] = inttoptr i64 [[TMP155]] to ptr +; CHECK-NEXT:    [[TMP157:%.*]] = load ptr, ptr [[TMP156]], align 8 +; CHECK-NEXT:    [[TMP158:%.*]] = ptrtoint ptr [[TMP157]] to i64 +; CHECK-NEXT:    [[TMP159:%.*]] = icmp sge i64 [[TMP158]], 0 +; CHECK-NEXT:    [[TMP160:%.*]] = or i1 [[TMP154]], [[TMP159]] +; CHECK-NEXT:    [[TMP161:%.*]] = add i64 [[SHADOW_PTR_INT5]], 48 +; CHECK-NEXT:    [[TMP162:%.*]] = inttoptr i64 [[TMP161]] to ptr +; CHECK-NEXT:    [[TMP163:%.*]] = load ptr, ptr [[TMP162]], align 8 +; CHECK-NEXT:    [[TMP164:%.*]] = ptrtoint ptr [[TMP163]] to i64 +; CHECK-NEXT:    [[TMP165:%.*]] = icmp sge i64 [[TMP164]], 0 +; CHECK-NEXT:    [[TMP166:%.*]] = or i1 [[TMP160]], [[TMP165]] +; CHECK-NEXT:    [[TMP167:%.*]] = add i64 [[SHADOW_PTR_INT5]], 56 +; CHECK-NEXT:    [[TMP168:%.*]] = inttoptr i64 [[TMP167]] to ptr +; CHECK-NEXT:    [[TMP169:%.*]] = load ptr, ptr [[TMP168]], align 8 +; CHECK-NEXT:    [[TMP170:%.*]] = ptrtoint ptr [[TMP169]] to i64 +; CHECK-NEXT:    [[TMP171:%.*]] = icmp sge i64 [[TMP170]], 0 +; CHECK-NEXT:    [[TMP172:%.*]] = or i1 [[TMP166]], [[TMP171]] +; CHECK-NEXT:    br i1 [[TMP172]], label [[TMP173:%.*]], label [[TMP174:%.*]], !prof [[PROF0]] +; CHECK:       173: +; CHECK-NEXT:    call void @__tysan_check(ptr @__tysan_shadow_memory_address, i32 8, ptr null, i32 1) +; CHECK-NEXT:    br label [[TMP174]] +; CHECK:       174: +; CHECK-NEXT:    br label [[TMP175]] +; CHECK:       175: +; CHECK-NEXT:    [[SHADOW_BASE:%.*]] = load i64, ptr @__tysan_shadow_memory_address, align 8 +; CHECK-NEXT:    call void @__tysan_instrument_with_shadow_update(ptr [[A:%.*]], ptr @__tysan_v1___ZTS1v_o_12, i1 true, i64 4, i32 2) +; CHECK-NEXT:    [[APP_PTR_INT:%.*]] = ptrtoint ptr [[A]] to i64 +; CHECK-NEXT:    [[APP_PTR_MASKED23:%.*]] = and i64 [[APP_PTR_INT]], [[APP_MEM_MASK2]] +; CHECK-NEXT:    [[APP_PTR_SHIFTED24:%.*]] = shl i64 [[APP_PTR_MASKED23]], 3 +; CHECK-NEXT:    [[SHADOW_PTR_INT25:%.*]] = add i64 [[APP_PTR_SHIFTED24]], [[SHADOW_BASE1]] +; CHECK-NEXT:    [[SHADOW_PTR26:%.*]] = inttoptr i64 [[SHADOW_PTR_INT25]] to ptr +; CHECK-NEXT:    [[SHADOW_DESC27:%.*]] = load ptr, ptr [[SHADOW_PTR26]], align 8 +; CHECK-NEXT:    [[BAD_DESC28:%.*]] = icmp ne ptr [[SHADOW_DESC27]], @__tysan_v1___ZTS1v_o_12 +; CHECK-NEXT:    br i1 [[BAD_DESC28]], label [[TMP176:%.*]], label [[TMP198:%.*]], !prof [[PROF0]] +; CHECK:       176: +; CHECK-NEXT:    [[TMP177:%.*]] = icmp eq ptr [[SHADOW_DESC27]], null +; CHECK-NEXT:    br i1 [[TMP177]], label [[TMP178:%.*]], label [[TMP196:%.*]] +; CHECK:       178: +; CHECK-NEXT:    [[TMP179:%.*]] = add i64 [[SHADOW_PTR_INT25]], 8 +; CHECK-NEXT:    [[TMP180:%.*]] = inttoptr i64 [[TMP179]] to ptr +; CHECK-NEXT:    [[TMP181:%.*]] = load ptr, ptr [[TMP180]], align 8 +; CHECK-NEXT:    [[TMP182:%.*]] = icmp ne ptr [[TMP181]], null +; CHECK-NEXT:    [[TMP183:%.*]] = or i1 false, [[TMP182]] +; CHECK-NEXT:    [[TMP184:%.*]] = add i64 [[SHADOW_PTR_INT25]], 16 +; CHECK-NEXT:    [[TMP185:%.*]] = inttoptr i64 [[TMP184]] to ptr +; CHECK-NEXT:    [[TMP186:%.*]] = load ptr, ptr [[TMP185]], align 8 +; CHECK-NEXT:    [[TMP187:%.*]] = icmp ne ptr [[TMP186]], null +; CHECK-NEXT:    [[TMP188:%.*]] = or i1 [[TMP183]], [[TMP187]] +; CHECK-NEXT:    [[TMP189:%.*]] = add i64 [[SHADOW_PTR_INT25]], 24 +; CHECK-NEXT:    [[TMP190:%.*]] = inttoptr i64 [[TMP189]] to ptr +; CHECK-NEXT:    [[TMP191:%.*]] = load ptr, ptr [[TMP190]], align 8 +; CHECK-NEXT:    [[TMP192:%.*]] = icmp ne ptr [[TMP191]], null +; CHECK-NEXT:    [[TMP193:%.*]] = or i1 [[TMP188]], [[TMP192]] +; CHECK-NEXT:    br i1 [[TMP193]], label [[TMP194:%.*]], label [[TMP195:%.*]], !prof [[PROF0]] +; CHECK:       194: +; CHECK-NEXT:    call void @__tysan_check(ptr [[A]], i32 4, ptr @__tysan_v1___ZTS1v_o_12, i32 2) +; CHECK-NEXT:    br label [[TMP195]] +; CHECK:       195: +; CHECK-NEXT:    store ptr @__tysan_v1___ZTS1v_o_12, ptr [[SHADOW_PTR26]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_OFFSET29:%.*]] = add i64 [[SHADOW_PTR_INT25]], 8 +; CHECK-NEXT:    [[SHADOW_BYTE_1_PTR30:%.*]] = inttoptr i64 [[SHADOW_BYTE_1_OFFSET29]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -1 to ptr), ptr [[SHADOW_BYTE_1_PTR30]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_2_OFFSET31:%.*]] = add i64 [[SHADOW_PTR_INT25]], 16 +; CHECK-NEXT:    [[SHADOW_BYTE_2_PTR32:%.*]] = inttoptr i64 [[SHADOW_BYTE_2_OFFSET31]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -2 to ptr), ptr [[SHADOW_BYTE_2_PTR32]], align 8 +; CHECK-NEXT:    [[SHADOW_BYTE_3_OFFSET33:%.*]] = add i64 [[SHADOW_PTR_INT25]], 24 +; CHECK-NEXT:    [[SHADOW_BYTE_3_PTR34:%.*]] = inttoptr i64 [[SHADOW_BYTE_3_OFFSET33]] to ptr +; CHECK-NEXT:    store ptr inttoptr (i64 -3 to ptr), ptr [[SHADOW_BYTE_3_PTR34]], align 8 +; CHECK-NEXT:    br label [[TMP197:%.*]] +; CHECK:       196: +; CHECK-NEXT:    call void @__tysan_check(ptr [[A]], i32 4, ptr @__tysan_v1___ZTS1v_o_12, i32 2) +; CHECK-NEXT:    br label [[TMP197]] +; CHECK:       197: +; CHECK-NEXT:    br label [[TMP219:%.*]] +; CHECK:       198: +; CHECK-NEXT:    [[TMP199:%.*]] = add i64 [[SHADOW_PTR_INT25]], 8 +; CHECK-NEXT:    [[TMP200:%.*]] = inttoptr i64 [[TMP199]] to ptr +; CHECK-NEXT:    [[TMP201:%.*]] = load ptr, ptr [[TMP200]], align 8 +; CHECK-NEXT:    [[TMP202:%.*]] = ptrtoint ptr [[TMP201]] to i64 +; CHECK-NEXT:    [[TMP203:%.*]] = icmp sge i64 [[TMP202]], 0 +; CHECK-NEXT:    [[TMP204:%.*]] = or i1 false, [[TMP203]] +; CHECK-NEXT:    [[TMP205:%.*]] = add i64 [[SHADOW_PTR_INT25]], 16 +; CHECK-NEXT:    [[TMP206:%.*]] = inttoptr i64 [[TMP205]] to ptr +; CHECK-NEXT:    [[TMP207:%.*]] = load ptr, ptr [[TMP206]], align 8 +; CHECK-NEXT:    [[TMP208:%.*]] = ptrtoint ptr [[TMP207]] to i64 +; CHECK-NEXT:    [[TMP209:%.*]] = icmp sge i64 [[TMP208]], 0 +; CHECK-NEXT:    [[TMP210:%.*]] = or i1 [[TMP204]], [[TMP209]] +; CHECK-NEXT:    [[TMP211:%.*]] = add i64 [[SHADOW_PTR_INT25]], 24 +; CHECK-NEXT:    [[TMP212:%.*]] = inttoptr i64 [[TMP211]] to ptr +; CHECK-NEXT:    [[TMP213:%.*]] = load ptr, ptr [[TMP212]], align 8 +; CHECK-NEXT:    [[TMP214:%.*]] = ptrtoint ptr [[TMP213]] to i64 +; CHECK-NEXT:    [[TMP215:%.*]] = icmp sge i64 [[TMP214]], 0 +; CHECK-NEXT:    [[TMP216:%.*]] = or i1 [[TMP210]], [[TMP215]] +; CHECK-NEXT:    br i1 [[TMP216]], label [[TMP217:%.*]], label [[TMP218:%.*]], !prof [[PROF0]] +; CHECK:       217: +; CHECK-NEXT:    call void @__tysan_check(ptr [[A]], i32 4, ptr @__tysan_v1___ZTS1v_o_12, i32 2) +; CHECK-NEXT:    br label [[TMP218]] +; CHECK:       218: +; CHECK-NEXT:    br label [[TMP219]] +; CHECK:       219: +; CHECK-NEXT:    store i32 42, ptr [[A]], align 4, !tbaa [[TBAA5:![0-9]+]] +; CHECK-NEXT:    ret void +; +entry: +  store i32 42, ptr %a, align 4, !tbaa !6 +  ret void +} + +!0 = !{!"Simple C++ TBAA"} +!1 = !{!"omnipotent char", !0, i64 0} +!2 = !{!"int", !1, i64 0} +!3 = !{!2, !2, i64 0} +!4 = !{!"_ZTS1x", !2, i64 0, !2, i64 4} +!5 = !{!"_ZTS1v", !2, i64 8, !2, i64 12, !4, i64 16} +!6 = !{!5, !2, i64 12} +;. +; CHECK: attributes #[[ATTR0:[0-9]+]] = { sanitize_type } +; CHECK: attributes #[[ATTR1:[0-9]+]] = { nounwind } +;. +; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 100000} +; CHECK: [[TBAA1]] = !{[[META2:![0-9]+]], [[META2]], i64 0} +; CHECK: [[META2]] = !{!"int", [[META3:![0-9]+]], i64 0} +; CHECK: [[META3]] = !{!"omnipotent char", [[META4:![0-9]+]], i64 0} +; CHECK: [[META4]] = !{!"Simple C++ TBAA"} +; CHECK: [[TBAA5]] = !{[[META6:![0-9]+]], [[META2]], i64 12} +; CHECK: [[META6]] = !{!"_ZTS1v", [[META2]], i64 8, [[META2]], i64 12, [[META7:![0-9]+]], i64 16} +; CHECK: [[META7]] = !{!"_ZTS1x", [[META2]], i64 0, [[META2]], i64 4} +;. diff --git a/llvm/test/Instrumentation/TypeSanitizer/globals_outlined.ll b/llvm/test/Instrumentation/TypeSanitizer/globals_outlined.ll new file mode 100644 index 0000000..0bd7940 --- /dev/null +++ b/llvm/test/Instrumentation/TypeSanitizer/globals_outlined.ll @@ -0,0 +1,24 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --include-generated-funcs +; RUN: opt -passes='tysan' -tysan-outline-instrumentation -S %s | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +@global1 = global i32 0, align 4 +@global2 = global i32 0, align 4 + + +; CHECK-LABEL: define internal void @__tysan_set_globals_types( +; CHECK-NEXT:     %app.mem.mask = load i64, ptr @__tysan_app_memory_mask, align 8 +; CHECK-NEXT:     %shadow.base = load i64, ptr @__tysan_shadow_memory_address, align 8 +; CHECK-NEXT:     call void @__tysan_set_shadow_type(ptr @global1, ptr @__tysan_v1_int, i64 4) +; CHECK-NEXT:     call void @__tysan_set_shadow_type(ptr @global1, ptr @__tysan_v1_int, i64 4) +; CHECK-NEXT:     ret void +; CHECK-NEXT:   } + +!llvm.tysan.globals = !{!13, !14} + +!0 = !{!"Simple C++ TBAA"} +!1 = !{!"omnipotent char", !0, i64 0} +!2 = !{!"int", !1, i64 0} +!13 = !{ptr @global1, !2} +!14 = !{ptr @global1, !2} diff --git a/llvm/test/MC/AMDGPU/gfx1250_asm_vimage.s b/llvm/test/MC/AMDGPU/gfx1250_asm_vimage.s index fec8ba1..0a480a7 100644 --- a/llvm/test/MC/AMDGPU/gfx1250_asm_vimage.s +++ b/llvm/test/MC/AMDGPU/gfx1250_asm_vimage.s @@ -2,33 +2,33 @@  ; RUN: not llvm-mc -triple=amdgcn -mcpu=gfx1200 -show-encoding %s 2>&1 | FileCheck --check-prefix=GFX12-ERR --implicit-check-not=error: --strict-whitespace %s  tensor_load_to_lds s[0:3], s[4:11] -// GFX1250: tensor_load_to_lds s[0:3], s[4:11] ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x7c,0x7c] +// GFX1250: tensor_load_to_lds s[0:3], s[4:11] ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x7c,0x7c]  // GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU  tensor_load_to_lds s[0:3], s[4:11] th:TH_LOAD_BYPASS scope:SCOPE_SYS -// GFX1250: tensor_load_to_lds s[0:3], s[4:11] th:TH_LOAD_BYPASS scope:SCOPE_SYS ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x3c,0x00,0x00,0x04,0x7c,0x7c] +// GFX1250: tensor_load_to_lds s[0:3], s[4:11] th:TH_LOAD_BYPASS scope:SCOPE_SYS ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x3c,0x7c,0x00,0x04,0x7c,0x7c]  // GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU  tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] -// GFX1250: tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x10] +// GFX1250: tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x0c,0x10]  // GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU  tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_LOAD_NT_HT scope:SCOPE_DEV -// GFX1250: tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_LOAD_NT_HT scope:SCOPE_DEV ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x68,0x00,0x00,0x04,0x0c,0x10] +// GFX1250: tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_LOAD_NT_HT scope:SCOPE_DEV ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x68,0x7c,0x00,0x04,0x0c,0x10]  // GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU  tensor_store_from_lds s[0:3], s[4:11] -// GFX1250: tensor_store_from_lds s[0:3], s[4:11] ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x7c,0x7c] +// GFX1250: tensor_store_from_lds s[0:3], s[4:11] ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x7c,0x7c]  // GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU  tensor_store_from_lds s[0:3], s[4:11] th:TH_STORE_BYPASS scope:SCOPE_SYS -// GFX1250: tensor_store_from_lds s[0:3], s[4:11] th:TH_STORE_BYPASS scope:SCOPE_SYS ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x3c,0x00,0x00,0x04,0x7c,0x7c] +// GFX1250: tensor_store_from_lds s[0:3], s[4:11] th:TH_STORE_BYPASS scope:SCOPE_SYS ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x3c,0x7c,0x00,0x04,0x7c,0x7c]  // GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU  tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] -// GFX1250: tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x10] +// GFX1250: tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x0c,0x10]  // GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU  tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_STORE_NT_HT scope:SCOPE_DEV -// GFX1250: tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_STORE_NT_HT scope:SCOPE_DEV ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x68,0x00,0x00,0x04,0x0c,0x10] +// GFX1250: tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_STORE_NT_HT scope:SCOPE_DEV ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x68,0x7c,0x00,0x04,0x0c,0x10]  // GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU diff --git a/llvm/test/MC/Disassembler/AMDGPU/gfx1250_dasm_vimage.txt b/llvm/test/MC/Disassembler/AMDGPU/gfx1250_dasm_vimage.txt index 9afaa07..8005793 100644 --- a/llvm/test/MC/Disassembler/AMDGPU/gfx1250_dasm_vimage.txt +++ b/llvm/test/MC/Disassembler/AMDGPU/gfx1250_dasm_vimage.txt @@ -1,25 +1,25 @@  # RUN: llvm-mc -disassemble -triple=amdgcn -mcpu=gfx1250 -show-encoding %s | FileCheck --check-prefix=GFX1250 %s -# GFX1250: tensor_load_to_lds s[0:3], s[4:11] ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x7c,0x7c] -0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x7c,0x7c +# GFX1250: tensor_load_to_lds s[0:3], s[4:11] ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x7c,0x7c] +0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x7c,0x7c -# GFX1250: tensor_load_to_lds s[0:3], s[4:11] th:TH_LOAD_BYPASS scope:SCOPE_SYS ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x3c,0x00,0x00,0x04,0x7c,0x7c] -0x01,0x00,0x71,0xd0,0x00,0x00,0x3c,0x00,0x00,0x04,0x7c,0x7c +# GFX1250: tensor_load_to_lds s[0:3], s[4:11] th:TH_LOAD_BYPASS scope:SCOPE_SYS ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x3c,0x7c,0x00,0x04,0x7c,0x7c] +0x01,0x00,0x71,0xd0,0x00,0x00,0x3c,0x7c,0x00,0x04,0x7c,0x7c -# GFX1250: tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x10] -0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x10 +# GFX1250: tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x0c,0x10] +0x01,0x00,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x0c,0x10 -# GFX1250: tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_LOAD_NT_HT scope:SCOPE_DEV ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x68,0x00,0x00,0x04,0x0c,0x10] -0x01,0x00,0x71,0xd0,0x00,0x00,0x68,0x00,0x00,0x04,0x0c,0x10 +# GFX1250: tensor_load_to_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_LOAD_NT_HT scope:SCOPE_DEV ; encoding: [0x01,0x00,0x71,0xd0,0x00,0x00,0x68,0x7c,0x00,0x04,0x0c,0x10] +0x01,0x00,0x71,0xd0,0x00,0x00,0x68,0x7c,0x00,0x04,0x0c,0x10 -# GFX1250: tensor_store_from_lds s[0:3], s[4:11] ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x7c,0x7c] -0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x7c,0x7c +# GFX1250: tensor_store_from_lds s[0:3], s[4:11] ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x7c,0x7c] +0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x7c,0x7c -# GFX1250: tensor_store_from_lds s[0:3], s[4:11] th:TH_STORE_BYPASS scope:SCOPE_SYS ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x3c,0x00,0x00,0x04,0x7c,0x7c] -0x01,0x40,0x71,0xd0,0x00,0x00,0x3c,0x00,0x00,0x04,0x7c,0x7c +# GFX1250: tensor_store_from_lds s[0:3], s[4:11] th:TH_STORE_BYPASS scope:SCOPE_SYS ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x3c,0x7c,0x00,0x04,0x7c,0x7c] +0x01,0x40,0x71,0xd0,0x00,0x00,0x3c,0x7c,0x00,0x04,0x7c,0x7c -# GFX1250: tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x10] -0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x10 +# GFX1250: tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x0c,0x10] +0x01,0x40,0x71,0xd0,0x00,0x00,0x00,0x7c,0x00,0x04,0x0c,0x10 -# GFX1250: tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_STORE_NT_HT scope:SCOPE_DEV ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x68,0x00,0x00,0x04,0x0c,0x10] -0x01,0x40,0x71,0xd0,0x00,0x00,0x68,0x00,0x00,0x04,0x0c,0x10 +# GFX1250: tensor_store_from_lds s[0:3], s[4:11], s[12:15], s[16:19] th:TH_STORE_NT_HT scope:SCOPE_DEV ; encoding: [0x01,0x40,0x71,0xd0,0x00,0x00,0x68,0x7c,0x00,0x04,0x0c,0x10] +0x01,0x40,0x71,0xd0,0x00,0x00,0x68,0x7c,0x00,0x04,0x0c,0x10 diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt b/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt index f5cb4b7..2661ed5 100644 --- a/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt +++ b/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt @@ -82,12 +82,18 @@  #CHECK: lxvprll 6, 2, 1  0x7c 0xc2 0x0c 0xda +#CHECK: lxvpb32x 2, 15, 16 +0x7c,0x4f,0x86,0xda +  #CHECK: stxvprl 0, 1, 2  0x7c 0x01 0x15 0x9a  #CHECK: stxvprll 6, 0, 1  0x7c 0xc0 0x0d 0xda +#CHECK: stxvpb32x 2, 15, 16 +0x7c,0x4f,0x87,0xda +  #CHECK: dmxvi8gerx4 1, 2, 4  0xec,0x82,0x20,0x58 diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt b/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt index f0df8ce..7fb8254 100644 --- a/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt +++ b/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt @@ -76,12 +76,18 @@  #CHECK: lxvprll 6, 2, 1  0xda 0x0c 0xc2 0x7c +#CHECK: lxvpb32x 2, 15, 16 +0xda,0x86,0x4f,0x7c +  #CHECK: stxvprl 0, 1, 2  0x9a 0x15 0x01 0x7c  #CHECK: stxvprll 6, 0, 1  0xda 0x0d 0xc0 0x7c +#CHECK: stxvpb32x 2, 15, 16 +0xda,0x87,0x4f,0x7c +  #CHECK: dmxvi8gerx4 1, 2, 4  0x58,0x20,0x82,0xec diff --git a/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s b/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s index bc0683e..40059c4 100644 --- a/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s +++ b/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s @@ -105,6 +105,10 @@  # CHECK-LE: lxvprll 6, 2, 1               # encoding: [0xda,0x0c,0xc2,0x7c]              lxvprll 6, 2, 1 +           lxvpb32x 2, 15, 16 +#CHECK-BE: lxvpb32x 2, 15, 16            # encoding: [0x7c,0x4f,0x86,0xda] +#CHECK-LE: lxvpb32x 2, 15, 16            # encoding: [0xda,0x86,0x4f,0x7c] +  # CHECK-BE: stxvprl 0, 1, 2               # encoding: [0x7c,0x01,0x15,0x9a]  # CHECK-LE: stxvprl 0, 1, 2               # encoding: [0x9a,0x15,0x01,0x7c]              stxvprl 0, 1, 2 @@ -113,6 +117,10 @@  # CHECK-LE: stxvprll 6, 0, 1              # encoding: [0xda,0x0d,0xc0,0x7c]              stxvprll 6, 0, 1 +           stxvpb32x 2, 15, 16 +#CHECK-BE: stxvpb32x 2, 15, 16            # encoding: [0x7c,0x4f,0x87,0xda] +#CHECK-LE: stxvpb32x 2, 15, 16            # encoding: [0xda,0x87,0x4f,0x7c] +              dmxvi8gerx4 1, 2, 4  # CHECK-BE: dmxvi8gerx4 1, 2, 4                     # encoding: [0xec,0x82,0x20,0x58]  # CHECK-LE: dmxvi8gerx4 1, 2, 4                     # encoding: [0x58,0x20,0x82,0xec] diff --git a/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll b/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll index 8a6f60b..87aed77 100644 --- a/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll +++ b/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll @@ -184,6 +184,18 @@ define void @type_test(ptr %x) {    ret void  } +define void @public_type_test(ptr %x) { +; CHECK-LABEL: define void @public_type_test( +; CHECK-SAME: ptr [[X:%.*]]) { +; CHECK-NEXT:    [[TEST:%.*]] = call i1 @llvm.public.type.test(ptr [[X]], metadata !"typeid") +; CHECK-NEXT:    call void @llvm.assume(i1 [[TEST]]) +; CHECK-NEXT:    ret void +; +  %test = call i1 @llvm.public.type.test(ptr %x, metadata !"typeid") +  call void @llvm.assume(i1 %test) +  ret void +} +  define void @multiple_dead_conds(i32 %x) {  ; CHECK-LABEL: define void @multiple_dead_conds(  ; CHECK-SAME: i32 [[X:%.*]]) { diff --git a/llvm/test/Transforms/IndVarSimplify/loop-guard-order.ll b/llvm/test/Transforms/IndVarSimplify/loop-guard-order.ll index 14ee00d..2763860 100644 --- a/llvm/test/Transforms/IndVarSimplify/loop-guard-order.ll +++ b/llvm/test/Transforms/IndVarSimplify/loop-guard-order.ll @@ -114,7 +114,7 @@ define i32 @urem_order1(i32 %n) {  ; CHECK:       [[LOOP]]:  ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[LOOP_PREHEADER]] ]  ; CHECK-NEXT:    call void @foo() -; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 3 +; CHECK-NEXT:    [[IV_NEXT]] = add nuw i32 [[IV]], 3  ; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]]  ; CHECK-NEXT:    br i1 [[EC]], label %[[EXIT_LOOPEXIT:.*]], label %[[LOOP]]  ; CHECK:       [[EXIT_LOOPEXIT]]: @@ -205,13 +205,12 @@ define i64 @test_loop_with_div_order_1(i64 %n) {  ; CHECK-NEXT:    [[PARITY_CHECK:%.*]] = icmp eq i64 [[IS_ODD]], 0  ; CHECK-NEXT:    br i1 [[PARITY_CHECK]], label %[[LOOP_PREHEADER:.*]], label %[[EXIT]]  ; CHECK:       [[LOOP_PREHEADER]]: -; CHECK-NEXT:    [[UMAX:%.*]] = call i64 @llvm.umax.i64(i64 [[UPPER_BOUND]], i64 1)  ; CHECK-NEXT:    br label %[[LOOP:.*]]  ; CHECK:       [[LOOP]]:  ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[LOOP_PREHEADER]] ]  ; CHECK-NEXT:    [[DUMMY:%.*]] = load volatile i64, ptr null, align 8  ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 -; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[UMAX]] +; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[UPPER_BOUND]]  ; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[LOOP]], label %[[EXIT_LOOPEXIT:.*]]  ; CHECK:       [[EXIT_LOOPEXIT]]:  ; CHECK-NEXT:    br label %[[EXIT]] diff --git a/llvm/test/Transforms/InstCombine/or.ll b/llvm/test/Transforms/InstCombine/or.ll index 6b090e9..f61a197 100644 --- a/llvm/test/Transforms/InstCombine/or.ll +++ b/llvm/test/Transforms/InstCombine/or.ll @@ -2113,3 +2113,98 @@ define <4 x i32> @or_zext_nneg_minus_constant_splat(<4 x i8> %a) {    %or = or <4 x i32> %zext, splat (i32 -9)    ret <4 x i32> %or  } + +define i8 @or_positive_minus_non_positive_to_abs(i8 %a){ +; CHECK-LABEL: @or_positive_minus_non_positive_to_abs( +; CHECK-NEXT:    [[TMP2:%.*]] = call i8 @llvm.abs.i8(i8 [[A:%.*]], i1 false) +; CHECK-NEXT:    ret i8 [[TMP2]] +; +  %b = icmp sgt i8 %a, 0 +  %mask = sext i1 %b to i8 +  %neg = sub i8 0, %a +  %mask_inv = xor i8 %mask, -1 +  %c = and i8 %neg, %mask_inv +  %d = and i8 %a, %mask +  %or = or i8 %c, %d +  ret i8 %or +} + +; TODO: Fold to smax https://alive2.llvm.org/ce/z/wDiDh2 +define i8 @or_select_smax_neg_to_abs(i8 %a){ +; CHECK-LABEL: @or_select_smax_neg_to_abs( +; CHECK-NEXT:    [[SGT0:%.*]] = icmp sgt i8 [[A:%.*]], 0 +; CHECK-NEXT:    [[NEG:%.*]] = sub nsw i8 0, [[A]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[SGT0]], i8 0, i8 [[NEG]] +; CHECK-NEXT:    ret i8 [[OR]] +; +  %sgt0 = icmp sgt i8 %a, 0 +  %neg = sub nsw i8 0, %a +  %sel = select i1 %sgt0, i8 0, i8 %neg +  ret i8 %sel +} + +; TODO: Fold to abs https://alive2.llvm.org/ce/z/DybfHG +define i8 @or_select_smax_smax_to_abs(i8 %a){ +; CHECK-LABEL: @or_select_smax_smax_to_abs( +; CHECK-NEXT:    [[NEG:%.*]] = sub nsw i8 0, [[A:%.*]] +; CHECK-NEXT:    [[SEL:%.*]] = call i8 @llvm.smax.i8(i8 [[NEG]], i8 0) +; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[A]], i8 0) +; CHECK-NEXT:    [[OR:%.*]] = or i8 [[SEL]], [[MAX]] +; CHECK-NEXT:    ret i8 [[OR]] +; +  %neg = sub nsw i8 0, %a +  %sel = call i8 @llvm.smax.i8(i8 %neg, i8 0) +  %max = call i8 @llvm.smax.i8(i8 %a, i8 0) +  %or = or i8 %sel, %max +  ret i8 %or +} + +declare i8 @llvm.abs.i8(i8, i1) +declare <2 x i8> @llvm.abs.v2i8(<2 x i8>, i1) + +define <2 x i8> @or_sgt_select_smax_to_abs(<2 x i8> %a){ +; CHECK-LABEL: @or_sgt_select_smax_to_abs( +; CHECK-NEXT:    [[OR:%.*]] = call <2 x i8> @llvm.abs.v2i8(<2 x i8> [[A:%.*]], i1 false) +; CHECK-NEXT:    ret <2 x i8> [[OR]] +; +  %sgt0 = icmp sgt <2 x i8> %a, zeroinitializer +  %neg = sub <2 x i8> zeroinitializer, %a +  %sel = select <2 x i1> %sgt0, <2 x i8> zeroinitializer, <2 x i8> %neg +  %max = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer) +  %or = or <2 x i8> %sel, %max +  ret <2 x i8> %or +} + +define <2 x i8> @or_slt_select_smax_to_abs(<2 x i8> %a){ +; CHECK-LABEL: @or_slt_select_smax_to_abs( +; CHECK-NEXT:    [[OR:%.*]] = call <2 x i8> @llvm.abs.v2i8(<2 x i8> [[A:%.*]], i1 false) +; CHECK-NEXT:    ret <2 x i8> [[OR]] +; +  %slt0 = icmp slt <2 x i8> %a, zeroinitializer +  %neg = sub <2 x i8> zeroinitializer, %a +  %sel = select <2 x i1> %slt0, <2 x i8> %neg, <2 x i8> zeroinitializer +  %max = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer) +  %or = or <2 x i8> %sel, %max +  ret <2 x i8> %or +} + +; negative test - %d has multiple uses. %or is not folded to abs. + +define <2 x i8> @or_select_smax_multi_uses(<2 x i8> %a){ +; CHECK-LABEL: @or_select_smax_multi_uses( +; CHECK-NEXT:    [[B:%.*]] = icmp sgt <2 x i8> [[A:%.*]], zeroinitializer +; CHECK-NEXT:    [[NEG:%.*]] = sub <2 x i8> zeroinitializer, [[A]] +; CHECK-NEXT:    [[C:%.*]] = select <2 x i1> [[B]], <2 x i8> zeroinitializer, <2 x i8> [[NEG]] +; CHECK-NEXT:    [[D:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[A]], <2 x i8> zeroinitializer) +; CHECK-NEXT:    [[OR1:%.*]] = or <2 x i8> [[C]], [[D]] +; CHECK-NEXT:    [[OR:%.*]] = add <2 x i8> [[OR1]], [[D]] +; CHECK-NEXT:    ret <2 x i8> [[OR]] +; +  %sgt0 = icmp sgt <2 x i8> %a, zeroinitializer +  %neg = sub <2 x i8> zeroinitializer, %a +  %sel = select <2 x i1> %sgt0, <2 x i8> zeroinitializer, <2 x i8> %neg +  %max = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer) +  %or = or <2 x i8> %sel, %max +  %add = add <2 x i8> %or, %max +  ret <2 x i8> %add +} diff --git a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll index 3d97048..8b3c050 100644 --- a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll +++ b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll @@ -256,27 +256,27 @@ define <2 x i1> @not_logical_or2(i1 %b, <2 x i32> %a) {    ret <2 x i1> %and  } -define i1 @bools_logical_commute0(i1 %a, i1 %b, i1 %c) { +define i1 @bools_logical_commute0(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools_logical_commute0( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]], !prof [[PROF2]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1 -  %and1 = select i1 %not, i1 %a, i1 false -  %and2 = select i1 %c, i1 %b, i1 false -  %or = select i1 %and1, i1 true, i1 %and2 +  %and1 = select i1 %not, i1 %a, i1 false, !prof!1 +  %and2 = select i1 %c, i1 %b, i1 false, !prof !2 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !3    ret i1 %or  } -define i1 @bools_logical_commute0_and1(i1 %a, i1 %b, i1 %c) { +define i1 @bools_logical_commute0_and1(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools_logical_commute0_and1( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]], !prof [[PROF1]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1    %and1 = and i1 %not, %a -  %and2 = select i1 %c, i1 %b, i1 false -  %or = select i1 %and1, i1 true, i1 %and2 +  %and2 = select i1 %c, i1 %b, i1 false, !prof !1 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !2    ret i1 %or  } @@ -292,15 +292,15 @@ define i1 @bools_logical_commute0_and2(i1 %a, i1 %b, i1 %c) {    ret i1 %or  } -define i1 @bools_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) { +define i1 @bools_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools_logical_commute0_and1_and2( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]], !prof [[PROF3:![0-9]+]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1    %and1 = and i1 %not, %a    %and2 = and i1 %c, %b -  %or = select i1 %and1, i1 true, i1 %and2 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !1    ret i1 %or  } @@ -457,27 +457,27 @@ define i1 @bools_logical_commute3_and1_and2(i1 %b, i1 %c) {    ret i1 %or  } -define i1 @bools2_logical_commute0(i1 %a, i1 %b, i1 %c) { +define i1 @bools2_logical_commute0(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools2_logical_commute0( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]], !prof [[PROF1]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1 -  %and1 = select i1 %c, i1 %a, i1 false -  %and2 = select i1 %not, i1 %b, i1 false -  %or = select i1 %and1, i1 true, i1 %and2 +  %and1 = select i1 %c, i1 %a, i1 false, !prof !1 +  %and2 = select i1 %not, i1 %b, i1 false, !prof !2 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !3    ret i1 %or  } -define i1 @bools2_logical_commute0_and1(i1 %a, i1 %b, i1 %c) { +define i1 @bools2_logical_commute0_and1(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools2_logical_commute0_and1( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]], !prof [[PROF2]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1    %and1 = and i1 %c, %a -  %and2 = select i1 %not, i1 %b, i1 false -  %or = select i1 %and1, i1 true, i1 %and2 +  %and2 = select i1 %not, i1 %b, i1 false, !prof !1 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !2    ret i1 %or  } @@ -493,15 +493,15 @@ define i1 @bools2_logical_commute0_and2(i1 %a, i1 %b, i1 %c) {    ret i1 %or  } -define i1 @bools2_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) { +define i1 @bools2_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools2_logical_commute0_and1_and2( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]], !prof [[PROF3]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1    %and1 = and i1 %c, %a    %and2 = and i1 %not, %b -  %or = select i1 %and1, i1 true, i1 %and2 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !1    ret i1 %or  } @@ -799,8 +799,11 @@ define <2 x i1> @not_logical_and2(i1 %b, <2 x i32> %a) {  !0 = !{!"function_entry_count", i64 1000}  !1 = !{!"branch_weights", i32 2, i32 3} +!2 = !{!"branch_weights", i32 5, i32 7} +!3 = !{!"branch_weights", i32 11, i32 13}  ;.  ; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1000}  ; CHECK: [[PROF1]] = !{!"branch_weights", i32 2, i32 3}  ; CHECK: [[PROF2]] = !{!"branch_weights", i32 3, i32 2} +; CHECK: [[PROF3]] = !{!"unknown", !"instcombine"}  ;. diff --git a/llvm/test/Transforms/InstCombine/vec_extract_var_elt-inseltpoison.ll b/llvm/test/Transforms/InstCombine/vec_extract_var_elt-inseltpoison.ll deleted file mode 100644 index 9fcac80..0000000 --- a/llvm/test/Transforms/InstCombine/vec_extract_var_elt-inseltpoison.ll +++ /dev/null @@ -1,26 +0,0 @@ -; RUN: opt < %s -passes=instcombine -S | FileCheck %s - -define void @test (float %b, ptr %p)  { -; CHECK: extractelement -; CHECK: fptosi -  %1 = load <8 x float> , ptr %p -  %2 = bitcast <8 x float> %1 to <8 x i32> -  %3 = bitcast <8 x i32> %2 to <8 x float> -  %a = fptosi <8 x float> %3 to <8 x i32> -  %4 = fptosi float %b to i32 -  %5 = add i32 %4, -2 -  %6 = extractelement <8 x i32> %a, i32 %5 -  %7 = insertelement <8 x i32> poison, i32 %6, i32 7 -  %8 = sitofp <8 x i32> %7 to <8 x float> -  store <8 x float> %8, ptr %p -  ret void     -} - -; PR18600 -define i32 @test2(i32 %i) { -  %e = extractelement <4 x i32> bitcast (<2 x i64> <i64 1, i64 2> to <4 x i32>), i32 %i -  ret i32 %e - -; CHECK-LABEL: @test2 -; CHECK: extractelement -} diff --git a/llvm/test/Transforms/InstCombine/vec_extract_var_elt.ll b/llvm/test/Transforms/InstCombine/vec_extract_var_elt.ll index 32bf4da..205b4b8 100644 --- a/llvm/test/Transforms/InstCombine/vec_extract_var_elt.ll +++ b/llvm/test/Transforms/InstCombine/vec_extract_var_elt.ll @@ -1,26 +1,81 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6  ; RUN: opt < %s -passes=instcombine -S | FileCheck %s -define void @test (float %b, ptr %p)  { -; CHECK: extractelement -; CHECK: fptosi -  %1 = load <8 x float> , ptr %p +define void @test_poison(float %b, ptr %p) { +; CHECK-LABEL: define void @test_poison( +; CHECK-SAME: float [[B:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x float>, ptr [[P]], align 32 +; CHECK-NEXT:    [[TMP2:%.*]] = fptosi float [[B]] to i32 +; CHECK-NEXT:    [[TMP3:%.*]] = add i32 [[TMP2]], -2 +; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x float> [[TMP1]], i32 [[TMP3]] +; CHECK-NEXT:    [[TMP5:%.*]] = fptosi float [[TMP4]] to i32 +; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <8 x i32> poison, i32 [[TMP5]], i64 7 +; CHECK-NEXT:    [[TMP7:%.*]] = sitofp <8 x i32> [[TMP6]] to <8 x float> +; CHECK-NEXT:    store <8 x float> [[TMP7]], ptr [[P]], align 32 +; CHECK-NEXT:    ret void +; +  %1 = load <8 x float>, ptr %p    %2 = bitcast <8 x float> %1 to <8 x i32>    %3 = bitcast <8 x i32> %2 to <8 x float>    %a = fptosi <8 x float> %3 to <8 x i32>    %4 = fptosi float %b to i32    %5 = add i32 %4, -2    %6 = extractelement <8 x i32> %a, i32 %5 -  %7 = insertelement <8 x i32> undef, i32 %6, i32 7 +  %7 = insertelement <8 x i32> poison, i32 %6, i32 7    %8 = sitofp <8 x i32> %7 to <8 x float>    store <8 x float> %8, ptr %p -  ret void     +  ret void  }  ; PR18600 -define i32 @test2(i32 %i) { +define i32 @test_bitcast(i32 %i) { +; CHECK-LABEL: define i32 @test_bitcast( +; CHECK-SAME: i32 [[I:%.*]]) { +; CHECK-NEXT:    [[E:%.*]] = extractelement <4 x i32> <i32 1, i32 0, i32 2, i32 0>, i32 [[I]] +; CHECK-NEXT:    ret i32 [[E]] +;    %e = extractelement <4 x i32> bitcast (<2 x i64> <i64 1, i64 2> to <4 x i32>), i32 %i    ret i32 %e +} + +declare void @use(i32) -; CHECK-LABEL: @test2 -; CHECK: extractelement +define void @test_loop(<4 x float> %in) { +; CHECK-LABEL: define void @test_loop( +; CHECK-SAME: <4 x float> [[IN:%.*]]) { +; CHECK-NEXT:  [[ENTRY:.*]]: +; CHECK-NEXT:    [[R:%.*]] = call <4 x float> @llvm.x86.sse41.round.ps(<4 x float> [[IN]], i32 9) +; CHECK-NEXT:    br label %[[LOOP:.*]] +; CHECK:       [[LOOP]]: +; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[NEXT:%.*]], %[[LATCH:.*]] ] +; CHECK-NEXT:    [[COND:%.*]] = icmp samesign ult i32 [[I]], 4 +; CHECK-NEXT:    br i1 [[COND]], label %[[BODY:.*]], label %[[DONE:.*]] +; CHECK:       [[BODY]]: +; CHECK-NEXT:    [[TMP0:%.*]] = extractelement <4 x float> [[R]], i32 [[I]] +; CHECK-NEXT:    [[ELEM:%.*]] = fptosi float [[TMP0]] to i32 +; CHECK-NEXT:    call void @use(i32 [[ELEM]]) +; CHECK-NEXT:    br label %[[LATCH]] +; CHECK:       [[LATCH]]: +; CHECK-NEXT:    [[NEXT]] = add nuw nsw i32 [[I]], 1 +; CHECK-NEXT:    br label %[[LOOP]] +; CHECK:       [[DONE]]: +; CHECK-NEXT:    ret void +; +entry: +  %r = call <4 x float> @llvm.x86.sse41.round.ps(<4 x float> %in, i32 9) +  %vi = fptosi <4 x float> %r to <4 x i32> +  br label %loop +loop: +  %i = phi i32 [ 0, %entry ], [ %next, %latch ] +  %cond = icmp ult i32 %i, 4 +  br i1 %cond, label %body, label %done +body: +  %elem = extractelement <4 x i32> %vi, i32 %i +  call void @use(i32 %elem) +  br label %latch +latch: +  %next = add i32 %i, 1 +  br label %loop +done: +  ret void  } diff --git a/llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll b/llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll new file mode 100644 index 0000000..4d378b0 --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll @@ -0,0 +1,30 @@ +; Check that zeroed branch weights do not crash or otherwise break basic +; LoopUnroll behavior when it tries to compute a probability from them. + +; RUN: opt < %s -S -unroll-count=2 -passes='loop-unroll' 2>&1 | FileCheck %s + +define void @test() { +entry: +  br label %loop + +loop: +  br i1 false, label %end, label %loop, !prof !0 + +end: +  ret void +} + +!0 = !{!"branch_weights", i32 0, i32 0} + +; CHECK: define void @test() { +; CHECK: entry: +; CHECK:   br label %loop +; CHECK: loop: +; CHECK:   br i1 false, label %end, label %loop.1, !prof !0 +; CHECK: loop.1: +; CHECK:   br i1 false, label %end, label %loop, !prof !0, !llvm.loop !1 +; CHECK-NOT: loop.2 +; CHECK: end: +; CHECK:   ret void +; CHECK: } +; CHECK: !0 = !{!"branch_weights", i32 0, i32 0} diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/force-target-instruction-cost.ll b/llvm/test/Transforms/LoopVectorize/AArch64/force-target-instruction-cost.ll index bfee39ea..068f82c 100644 --- a/llvm/test/Transforms/LoopVectorize/AArch64/force-target-instruction-cost.ll +++ b/llvm/test/Transforms/LoopVectorize/AArch64/force-target-instruction-cost.ll @@ -365,8 +365,8 @@ define void @invalid_legacy_cost(i64 %N, ptr %x) #0 {  ; CHECK:       [[VECTOR_BODY]]:  ; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]  ; CHECK-NEXT:    [[TMP6:%.*]] = alloca i8, i64 0, align 16 -; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <2 x ptr> poison, ptr [[TMP6]], i32 0 -; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <2 x ptr> [[TMP7]], ptr [[TMP6]], i32 1 +; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x ptr> poison, ptr [[TMP6]], i64 0 +; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <2 x ptr> [[BROADCAST_SPLATINSERT]], <2 x ptr> poison, <2 x i32> zeroinitializer  ; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr ptr, ptr [[X]], i64 [[INDEX]]  ; CHECK-NEXT:    store <2 x ptr> [[TMP8]], ptr [[TMP9]], align 8  ; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2 diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/licm-calls.ll b/llvm/test/Transforms/LoopVectorize/AArch64/licm-calls.ll index ea01489..0a9494e 100644 --- a/llvm/test/Transforms/LoopVectorize/AArch64/licm-calls.ll +++ b/llvm/test/Transforms/LoopVectorize/AArch64/licm-calls.ll @@ -10,8 +10,8 @@ define void @licm_replicate_call(double %x, ptr %dst) {  ; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]  ; CHECK:       [[VECTOR_PH]]:  ; CHECK-NEXT:    [[TMP1:%.*]] = tail call double @llvm.pow.f64(double [[X]], double 3.000000e+00) -; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[TMP1]], i32 0 -; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x double> [[TMP2]], double [[TMP1]], i32 1 +; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x double> poison, double [[TMP1]], i64 0 +; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <2 x double> [[BROADCAST_SPLATINSERT]], <2 x double> poison, <2 x i32> zeroinitializer  ; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]  ; CHECK:       [[VECTOR_BODY]]:  ; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ] diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/masked-call-scalarize.ll b/llvm/test/Transforms/LoopVectorize/AArch64/masked-call-scalarize.ll index 157b787..3558957 100644 --- a/llvm/test/Transforms/LoopVectorize/AArch64/masked-call-scalarize.ll +++ b/llvm/test/Transforms/LoopVectorize/AArch64/masked-call-scalarize.ll @@ -64,9 +64,9 @@ define void @test_widen_exp_v2(ptr noalias %p2, ptr noalias %p, i64 %n) #5 {  ; TFCOMMON-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE6:%.*]] ]  ; TFCOMMON-NEXT:    [[ACTIVE_LANE_MASK:%.*]] = phi <2 x i1> [ [[ACTIVE_LANE_MASK_ENTRY]], [[ENTRY]] ], [ [[ACTIVE_LANE_MASK_NEXT:%.*]], [[PRED_STORE_CONTINUE6]] ]  ; TFCOMMON-NEXT:    [[LD:%.*]] = load double, ptr [[P2:%.*]], align 8 -; TFCOMMON-NEXT:    [[TMP5:%.*]] = tail call double @llvm.exp.f64(double [[LD]]) #[[ATTR3:[0-9]+]] -; TFCOMMON-NEXT:    [[TMP7:%.*]] = insertelement <2 x double> poison, double [[TMP5]], i32 0 -; TFCOMMON-NEXT:    [[TMP8:%.*]] = insertelement <2 x double> [[TMP7]], double [[TMP5]], i32 1 +; TFCOMMON-NEXT:    [[TMP5:%.*]] = tail call double @llvm.exp.f64(double [[LD]]) #[[ATTR2:[0-9]+]] +; TFCOMMON-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x double> poison, double [[TMP5]], i64 0 +; TFCOMMON-NEXT:    [[TMP8:%.*]] = shufflevector <2 x double> [[BROADCAST_SPLATINSERT]], <2 x double> poison, <2 x i32> zeroinitializer  ; TFCOMMON-NEXT:    [[TMP9:%.*]] = fcmp ogt <2 x double> [[TMP8]], zeroinitializer  ; TFCOMMON-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP9]], <2 x double> zeroinitializer, <2 x double> splat (double 1.000000e+00)  ; TFCOMMON-NEXT:    [[TMP16:%.*]] = extractelement <2 x i1> [[ACTIVE_LANE_MASK]], i32 0 @@ -79,7 +79,7 @@ define void @test_widen_exp_v2(ptr noalias %p2, ptr noalias %p, i64 %n) #5 {  ; TFCOMMON-NEXT:    [[TMP14:%.*]] = extractelement <2 x i1> [[ACTIVE_LANE_MASK]], i32 1  ; TFCOMMON-NEXT:    br i1 [[TMP14]], label [[PRED_STORE_IF1:%.*]], label [[PRED_STORE_CONTINUE6]]  ; TFCOMMON:       pred.store.if1: -; TFCOMMON-NEXT:    [[TMP19:%.*]] = extractelement <2 x double> [[PREDPHI]], i32 1 +; TFCOMMON-NEXT:    [[TMP19:%.*]] = extractelement <2 x double> [[PREDPHI]], i32 0  ; TFCOMMON-NEXT:    store double [[TMP19]], ptr [[P]], align 8  ; TFCOMMON-NEXT:    br label [[PRED_STORE_CONTINUE6]]  ; TFCOMMON:       pred.store.continue2: @@ -105,9 +105,9 @@ define void @test_widen_exp_v2(ptr noalias %p2, ptr noalias %p, i64 %n) #5 {  ; TFA_INTERLEAVE-NEXT:    [[ACTIVE_LANE_MASK:%.*]] = phi <2 x i1> [ [[ACTIVE_LANE_MASK_ENTRY]], [[ENTRY]] ], [ [[ACTIVE_LANE_MASK_NEXT:%.*]], [[PRED_STORE_CONTINUE9]] ]  ; TFA_INTERLEAVE-NEXT:    [[ACTIVE_LANE_MASK2:%.*]] = phi <2 x i1> [ [[ACTIVE_LANE_MASK_ENTRY1]], [[ENTRY]] ], [ [[ACTIVE_LANE_MASK_NEXT10:%.*]], [[PRED_STORE_CONTINUE9]] ]  ; TFA_INTERLEAVE-NEXT:    [[TMP4:%.*]] = load double, ptr [[P2:%.*]], align 8 -; TFA_INTERLEAVE-NEXT:    [[TMP9:%.*]] = tail call double @llvm.exp.f64(double [[TMP4]]) #[[ATTR3:[0-9]+]] -; TFA_INTERLEAVE-NEXT:    [[TMP11:%.*]] = insertelement <2 x double> poison, double [[TMP9]], i32 0 -; TFA_INTERLEAVE-NEXT:    [[TMP12:%.*]] = insertelement <2 x double> [[TMP11]], double [[TMP9]], i32 1 +; TFA_INTERLEAVE-NEXT:    [[TMP5:%.*]] = tail call double @llvm.exp.f64(double [[TMP4]]) #[[ATTR2:[0-9]+]] +; TFA_INTERLEAVE-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x double> poison, double [[TMP5]], i64 0 +; TFA_INTERLEAVE-NEXT:    [[TMP12:%.*]] = shufflevector <2 x double> [[BROADCAST_SPLATINSERT]], <2 x double> poison, <2 x i32> zeroinitializer  ; TFA_INTERLEAVE-NEXT:    [[TMP14:%.*]] = fcmp ogt <2 x double> [[TMP12]], zeroinitializer  ; TFA_INTERLEAVE-NEXT:    [[PREDPHI3:%.*]] = select <2 x i1> [[TMP14]], <2 x double> zeroinitializer, <2 x double> splat (double 1.000000e+00)  ; TFA_INTERLEAVE-NEXT:    [[TMP19:%.*]] = extractelement <2 x i1> [[ACTIVE_LANE_MASK]], i32 0 @@ -120,7 +120,7 @@ define void @test_widen_exp_v2(ptr noalias %p2, ptr noalias %p, i64 %n) #5 {  ; TFA_INTERLEAVE-NEXT:    [[TMP29:%.*]] = extractelement <2 x i1> [[ACTIVE_LANE_MASK]], i32 1  ; TFA_INTERLEAVE-NEXT:    br i1 [[TMP29]], label [[PRED_STORE_IF4:%.*]], label [[PRED_STORE_CONTINUE5:%.*]]  ; TFA_INTERLEAVE:       pred.store.if3: -; TFA_INTERLEAVE-NEXT:    [[TMP22:%.*]] = extractelement <2 x double> [[PREDPHI3]], i32 1 +; TFA_INTERLEAVE-NEXT:    [[TMP22:%.*]] = extractelement <2 x double> [[PREDPHI3]], i32 0  ; TFA_INTERLEAVE-NEXT:    store double [[TMP22]], ptr [[P]], align 8  ; TFA_INTERLEAVE-NEXT:    br label [[PRED_STORE_CONTINUE5]]  ; TFA_INTERLEAVE:       pred.store.continue4: @@ -134,7 +134,7 @@ define void @test_widen_exp_v2(ptr noalias %p2, ptr noalias %p, i64 %n) #5 {  ; TFA_INTERLEAVE-NEXT:    [[TMP25:%.*]] = extractelement <2 x i1> [[ACTIVE_LANE_MASK2]], i32 1  ; TFA_INTERLEAVE-NEXT:    br i1 [[TMP25]], label [[PRED_STORE_IF8:%.*]], label [[PRED_STORE_CONTINUE9]]  ; TFA_INTERLEAVE:       pred.store.if7: -; TFA_INTERLEAVE-NEXT:    [[TMP34:%.*]] = extractelement <2 x double> [[PREDPHI3]], i32 1 +; TFA_INTERLEAVE-NEXT:    [[TMP34:%.*]] = extractelement <2 x double> [[PREDPHI3]], i32 0  ; TFA_INTERLEAVE-NEXT:    store double [[TMP34]], ptr [[P]], align 8  ; TFA_INTERLEAVE-NEXT:    br label [[PRED_STORE_CONTINUE9]]  ; TFA_INTERLEAVE:       pred.store.continue8: diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll b/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll index 49f663f..62e248b 100644 --- a/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll +++ b/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll @@ -1,12 +1,12 @@  ; REQUIRES: asserts -; RUN: opt -mattr=+neon,+dotprod -passes=loop-vectorize -debug-only=loop-vectorize -force-vector-interleave=1 -enable-epilogue-vectorization -epilogue-vectorization-force-VF=2 -disable-output %s 2>&1 | FileCheck %s +; RUN: opt -passes=loop-vectorize -debug-only=loop-vectorize -disable-output %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"  target triple = "aarch64-none-unknown-elf"  ; Tests for printing VPlans that are enabled under AArch64 -define i32 @print_partial_reduction(ptr %a, ptr %b) { +define i32 @print_partial_reduction(ptr %a, ptr %b) "target-features"="+neon,+dotprod" {  ; CHECK:      VPlan 'Initial VPlan for VF={8,16},UF>=1' {  ; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF  ; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF @@ -69,60 +69,37 @@ define i32 @print_partial_reduction(ptr %a, ptr %b) {  ; CHECK-NEXT: No successors  ; CHECK-NEXT: }  ; CHECK: VPlan 'Final VPlan for VF={8,16},UF={1}' { +; CHECK-NEXT: Live-in ir<1024> = vector-trip-count  ; CHECK-NEXT: Live-in ir<1024> = original trip-count  ; CHECK-EMPTY:  ; CHECK-NEXT: ir-bb<entry>: -; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.main.loop.iter.check> +; CHECK-NEXT: Successor(s): vector.ph  ; CHECK-EMPTY: -; CHECK-NEXT: ir-bb<vector.main.loop.iter.check>: -; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.ph> -; CHECK-EMPTY: -; CHECK-NEXT: ir-bb<vector.ph>: -; CHECK-NEXT:  EMIT vp<[[RDX_START:%.+]]> = reduction-start-vector ir<0>, ir<0>, ir<4> +; CHECK-NEXT: vector.ph: +; CHECK-NEXT:   EMIT vp<%1> = reduction-start-vector ir<0>, ir<0>, ir<4>  ; CHECK-NEXT: Successor(s): vector.body  ; CHECK-EMPTY:  ; CHECK-NEXT: vector.body: -; CHECK-NEXT:   EMIT-SCALAR vp<[[EP_IV:%.+]]> = phi [ ir<0>, ir-bb<vector.ph> ], [ vp<%index.next>, vector.body ] -; CHECK-NEXT:   WIDEN-REDUCTION-PHI ir<%accum> = phi vp<[[RDX_START]]>, ir<%add> (VF scaled by 1/4) -; CHECK-NEXT:   CLONE ir<%gep.a> = getelementptr ir<%a>, vp<[[EP_IV]]> +; CHECK-NEXT:   EMIT-SCALAR vp<%index> = phi [ ir<0>, vector.ph ], [ vp<%index.next>, vector.body ] +; CHECK-NEXT:   WIDEN-REDUCTION-PHI ir<%accum> = phi vp<%1>, ir<%add> (VF scaled by 1/4) +; CHECK-NEXT:   CLONE ir<%gep.a> = getelementptr ir<%a>, vp<%index>  ; CHECK-NEXT:   WIDEN ir<%load.a> = load ir<%gep.a> -; CHECK-NEXT:   CLONE ir<%gep.b> = getelementptr ir<%b>, vp<[[EP_IV]]> +; CHECK-NEXT:   CLONE ir<%gep.b> = getelementptr ir<%b>, vp<%index>  ; CHECK-NEXT:   WIDEN ir<%load.b> = load ir<%gep.b>  ; CHECK-NEXT:   WIDEN-CAST ir<%ext.b> = zext ir<%load.b> to i32  ; CHECK-NEXT:   WIDEN-CAST ir<%ext.a> = zext ir<%load.a> to i32  ; CHECK-NEXT:   WIDEN ir<%mul> = mul ir<%ext.b>, ir<%ext.a>  ; CHECK-NEXT:   PARTIAL-REDUCE ir<%add> = add ir<%accum>, ir<%mul> -; CHECK-NEXT:   EMIT vp<[[EP_IV_NEXT:%.+]]> = add nuw vp<[[EP_IV]]>, ir<16> -; CHECK-NEXT:   EMIT branch-on-count vp<[[EP_IV_NEXT]]>, ir<1024> +; CHECK-NEXT:   EMIT vp<%index.next> = add nuw vp<%index>, ir<16> +; CHECK-NEXT:   EMIT branch-on-count vp<%index.next>, ir<1024>  ; CHECK-NEXT: Successor(s): middle.block, vector.body  ; CHECK-EMPTY:  ; CHECK-NEXT: middle.block: -; CHECK-NEXT:   EMIT vp<[[RED_RESULT:%.+]]> = compute-reduction-result ir<%accum>, ir<%add> -; CHECK-NEXT:   EMIT branch-on-cond ir<true> -; CHECK-NEXT: Successor(s): ir-bb<exit>, ir-bb<scalar.ph> +; CHECK-NEXT:   EMIT vp<%3> = compute-reduction-result ir<%accum>, ir<%add> +; CHECK-NEXT: Successor(s): ir-bb<exit>  ; CHECK-EMPTY:  ; CHECK-NEXT: ir-bb<exit>: -; CHECK-NEXT:   IR   %add.lcssa = phi i32 [ %add, %for.body ] (extra operand: vp<[[RED_RESULT]]> from middle.block) -; CHECK-NEXT: No successors -; CHECK-EMPTY: -; CHECK-NEXT: ir-bb<scalar.ph>: -; CHECK-NEXT:   EMIT-SCALAR vp<[[EP_RESUME:%.+]]> = phi [ ir<1024>, middle.block ], [ ir<0>, ir-bb<entry> ] -; CHECK-NEXT:   EMIT-SCALAR vp<[[EP_MERGE:%.+]]> = phi [ vp<[[RED_RESULT]]>, middle.block ], [ ir<0>, ir-bb<entry> ] -; CHECK-NEXT:   EMIT-SCALAR vp<%6> = resume-for-epilogue vp<%vec.epilog.resume.val> -; CHECK-NEXT: Successor(s): ir-bb<for.body> -; CHECK-EMPTY: -; CHECK-NEXT: ir-bb<for.body>: -; CHECK-NEXT:   IR   %accum = phi i32 [ 0, %scalar.ph ], [ %add, %for.body ] (extra operand: vp<[[EP_MERGE]]> from ir-bb<scalar.ph>) -; CHECK-NEXT:   IR   %gep.a = getelementptr i8, ptr %a, i64 %iv -; CHECK-NEXT:   IR   %load.a = load i8, ptr %gep.a, align 1 -; CHECK-NEXT:   IR   %ext.a = zext i8 %load.a to i32 -; CHECK-NEXT:   IR   %gep.b = getelementptr i8, ptr %b, i64 %iv -; CHECK-NEXT:   IR   %load.b = load i8, ptr %gep.b, align 1 -; CHECK-NEXT:   IR   %ext.b = zext i8 %load.b to i32 -; CHECK-NEXT:   IR   %mul = mul i32 %ext.b, %ext.a -; CHECK-NEXT:   IR   %add = add i32 %mul, %accum -; CHECK-NEXT:   IR   %iv.next = add i64 %iv, 1 -; CHECK-NEXT:   IR   %exitcond.not = icmp eq i64 %iv.next, 1024 +; CHECK-NEXT:   IR   %add.lcssa = phi i32 [ %add, %for.body ] (extra operand: vp<%3> from middle.block)  ; CHECK-NEXT: No successors  ; CHECK-NEXT: }  entry: @@ -141,8 +118,12 @@ for.body:                                         ; preds = %for.body, %entry    %add = add i32 %mul, %accum    %iv.next = add i64 %iv, 1    %exitcond.not = icmp eq i64 %iv.next, 1024 -  br i1 %exitcond.not, label %exit, label %for.body +  br i1 %exitcond.not, label %exit, label %for.body, !llvm.loop !0  exit:    ret i32 %add  } + +!0 = distinct !{!0, !2, !3} +!2 = !{!"llvm.loop.interleave.count", i32 1} +!3 = !{!"llvm.loop.vectorize.predicate.enable", i1 false} diff --git a/llvm/test/Transforms/LoopVectorize/X86/replicate-recipe-with-only-first-lane-used.ll b/llvm/test/Transforms/LoopVectorize/X86/replicate-recipe-with-only-first-lane-used.ll index 03087bb..4590dfc 100644 --- a/llvm/test/Transforms/LoopVectorize/X86/replicate-recipe-with-only-first-lane-used.ll +++ b/llvm/test/Transforms/LoopVectorize/X86/replicate-recipe-with-only-first-lane-used.ll @@ -199,10 +199,8 @@ define float @uniform_load_replicating_select(ptr %A, ptr %B, i64 %1) {  ; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 7  ; CHECK-NEXT:    [[TMP6:%.*]] = load float, ptr [[A]], align 4  ; CHECK-NEXT:    [[TMP10:%.*]] = fcmp ogt float [[TMP6]], 0.000000e+00 -; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <4 x i1> poison, i1 [[TMP10]], i32 0 -; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <4 x i1> [[TMP8]], i1 [[TMP10]], i32 1 -; CHECK-NEXT:    [[TMP13:%.*]] = insertelement <4 x i1> [[TMP9]], i1 [[TMP10]], i32 2 -; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <4 x i1> [[TMP13]], i1 [[TMP10]], i32 3 +; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i1> poison, i1 [[TMP10]], i64 0 +; CHECK-NEXT:    [[TMP14:%.*]] = shufflevector <4 x i1> [[BROADCAST_SPLATINSERT]], <4 x i1> poison, <4 x i32> zeroinitializer  ; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP2]]  ; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP3]]  ; CHECK-NEXT:    [[TMP17:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP4]] diff --git a/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll b/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll index 9deab90..fe230fa 100644 --- a/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll +++ b/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll @@ -102,7 +102,7 @@ exit:    ret void  } -define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr) optsize { +define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr, i32 %z) optsize {  ; CHECK-LABEL: sink_replicate_region_2  ; CHECK:      VPlan 'Initial VPlan for VF={2},UF>=1' {  ; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF @@ -125,16 +125,18 @@ define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr) optsize {  ; CHECK-NEXT:   ir<%iv> = WIDEN-INDUCTION ir<0>, ir<1>, vp<[[VF]]>  ; CHECK-NEXT:   EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv>, vp<[[BTC]]>  ; CHECK-NEXT:   EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%recur>, ir<%recur.next> +; CHECK-NEXT:   WIDEN ir<%cond> = icmp eq ir<%iv>, ir<%z> +; CHECK-NEXT:   EMIT vp<[[AND:%.+]]> = logical-and vp<[[MASK]]>, ir<%cond>  ; CHECK-NEXT:   Successor(s): pred.store  ; CHECK-EMPTY:  ; CHECK-NEXT: <xVFxUF> pred.store: {  ; CHECK-NEXT:  pred.store.entry: -; CHECK-NEXT:    BRANCH-ON-MASK vp<[[MASK]]> +; CHECK-NEXT:    BRANCH-ON-MASK vp<[[AND]]>  ; CHECK-NEXT:  Successor(s): pred.store.if, pred.store.continue  ; CHECK-EMPTY:  ; CHECK-NEXT:  pred.store.if: -; CHECK-NEXT:     vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>  ; CHECK-NEXT:     REPLICATE ir<%rem> = srem vp<[[SPLICE]]>, ir<%x> +; CHECK-NEXT:     vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>  ; CHECK-NEXT:     REPLICATE ir<%gep> = getelementptr ir<%ptr>, vp<[[STEPS]]>  ; CHECK-NEXT:     REPLICATE ir<%add> = add ir<%rem>, ir<%recur.next>  ; CHECK-NEXT:     REPLICATE store ir<%add>, ir<%gep> @@ -143,9 +145,9 @@ define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr) optsize {  ; CHECK-NEXT:   pred.store.continue:  ; CHECK-NEXT:   No successors  ; CHECK-NEXT: } -; CHECK-NEXT: Successor(s): loop.0 +; CHECK-NEXT: Successor(s): if.1  ; CHECK-EMPTY: -; CHECK-NEXT: loop.0: +; CHECK-NEXT: if.1:  ; CHECK-NEXT:   EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>  ; CHECK-NEXT:   EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VEC_TC]]>  ; CHECK-NEXT: No successors @@ -162,13 +164,20 @@ entry:    br label %loop  loop: -  %recur = phi i32 [ 0, %entry ], [ %recur.next, %loop ] -  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] -  %rem = srem i32 %recur, %x +  %recur = phi i32 [ 0, %entry ], [ %recur.next, %latch ] +  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]    %recur.next = sext i8 %y to i32 +  %cond = icmp eq i32 %iv, %z +  br i1 %cond, label %if, label %latch + +if: +  %rem = srem i32 %recur, %x    %add = add i32 %rem, %recur.next    %gep = getelementptr i32, ptr %ptr, i32 %iv    store i32 %add, ptr %gep +  br label %latch + +latch:    %iv.next = add nsw i32 %iv, 1    %ec = icmp eq i32 %iv.next, 20001    br i1 %ec, label %exit, label %loop diff --git a/llvm/test/Transforms/LoopVectorize/hoist-and-sink-mem-ops-with-invariant-pointers.ll b/llvm/test/Transforms/LoopVectorize/hoist-and-sink-mem-ops-with-invariant-pointers.ll new file mode 100644 index 0000000..8615401 --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/hoist-and-sink-mem-ops-with-invariant-pointers.ll @@ -0,0 +1,247 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6 +; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s + +define void @hoist_invariant_load_noalias_due_to_memchecks(ptr %dst, ptr %invariant_ptr, i32 %n) { +; CHECK-LABEL: define void @hoist_invariant_load_noalias_due_to_memchecks( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[INVARIANT_PTR:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT:  [[ENTRY:.*]]: +; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N]], 4 +; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]] +; CHECK:       [[VECTOR_MEMCHECK]]: +; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[N]], -1 +; CHECK-NEXT:    [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 +; CHECK-NEXT:    [[TMP2:%.*]] = shl nuw nsw i64 [[TMP1]], 2 +; CHECK-NEXT:    [[TMP3:%.*]] = add nuw nsw i64 [[TMP2]], 4 +; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP3]] +; CHECK-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[INVARIANT_PTR]], i64 4 +; CHECK-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[SCEVGEP1]] +; CHECK-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[INVARIANT_PTR]], [[SCEVGEP]] +; CHECK-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] +; CHECK-NEXT:    br i1 [[FOUND_CONFLICT]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]] +; CHECK:       [[VECTOR_PH]]: +; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[N]], 4 +; CHECK-NEXT:    [[N_VEC:%.*]] = sub i32 [[N]], [[N_MOD_VF]] +; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]] +; CHECK:       [[VECTOR_BODY]]: +; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ] +; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META0:![0-9]+]] +; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[TMP4]], i64 0 +; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer +; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[INDEX]] +; CHECK-NEXT:    store <4 x i32> [[BROADCAST_SPLAT]], ptr [[TMP5]], align 4, !alias.scope [[META3:![0-9]+]], !noalias [[META0]] +; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4 +; CHECK-NEXT:    [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] +; CHECK-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]] +; CHECK:       [[MIDDLE_BLOCK]]: +; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[N]], [[N_VEC]] +; CHECK-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]] +; CHECK:       [[SCALAR_PH]]: +; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_MEMCHECK]] ] +; CHECK-NEXT:    br label %[[LOOP:.*]] +; CHECK:       [[LOOP]]: +; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ] +; CHECK-NEXT:    [[INV_VAL:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4 +; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[IV]] +; CHECK-NEXT:    store i32 [[INV_VAL]], ptr [[GEP]], align 4 +; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 +; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]] +; CHECK-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP8:![0-9]+]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +entry: +  br label %loop + +loop: +  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] +  %inv_val = load i32, ptr %invariant_ptr, align 4 +  %gep = getelementptr inbounds i32, ptr %dst, i32 %iv +  store i32 %inv_val, ptr %gep, align 4 +  %iv.next = add nuw nsw i32 %iv, 1 +  %ec = icmp eq i32 %iv.next, %n +  br i1 %ec, label %exit, label %loop + +exit: +  ret void +} + +; Test that loads with non-invariant addresses are not hoisted. +define void @dont_hoist_variant_address(ptr %dst, ptr %src, i32 %n) { +; CHECK-LABEL: define void @dont_hoist_variant_address( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT:  [[ENTRY:.*]]: +; CHECK-NEXT:    [[SRC2:%.*]] = ptrtoint ptr [[SRC]] to i64 +; CHECK-NEXT:    [[A1:%.*]] = ptrtoint ptr [[DST]] to i64 +; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N]], 4 +; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]] +; CHECK:       [[VECTOR_MEMCHECK]]: +; CHECK-NEXT:    [[TMP0:%.*]] = sub i64 [[A1]], [[SRC2]] +; CHECK-NEXT:    [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP0]], 16 +; CHECK-NEXT:    br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]] +; CHECK:       [[VECTOR_PH]]: +; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[N]], 4 +; CHECK-NEXT:    [[N_VEC:%.*]] = sub i32 [[N]], [[N_MOD_VF]] +; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]] +; CHECK:       [[VECTOR_BODY]]: +; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ] +; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[INDEX]] +; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4 +; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[INDEX]] +; CHECK-NEXT:    store <4 x i32> [[WIDE_LOAD]], ptr [[TMP2]], align 4 +; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4 +; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] +; CHECK-NEXT:    br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]] +; CHECK:       [[MIDDLE_BLOCK]]: +; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[N]], [[N_VEC]] +; CHECK-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]] +; CHECK:       [[SCALAR_PH]]: +; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_MEMCHECK]] ] +; CHECK-NEXT:    br label %[[LOOP:.*]] +; CHECK:       [[LOOP]]: +; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ] +; CHECK-NEXT:    [[GEP_SRC:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[IV]] +; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[GEP_SRC]], align 4 +; CHECK-NEXT:    [[GEP_DST:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[IV]] +; CHECK-NEXT:    store i32 [[VAL]], ptr [[GEP_DST]], align 4 +; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 +; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]] +; CHECK-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP10:![0-9]+]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +entry: +  br label %loop + +loop: +  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] +  %gep.src = getelementptr inbounds i32, ptr %src, i32 %iv +  %val = load i32, ptr %gep.src, align 4 +  %gep.dst = getelementptr inbounds i32, ptr %dst, i32 %iv +  store i32 %val, ptr %gep.dst, align 4 +  %iv.next = add nuw nsw i32 %iv, 1 +  %ec = icmp eq i32 %iv.next, %n +  br i1 %ec, label %exit, label %loop + +exit: +  ret void +} + +; Test that predicated loads are not hoisted. +define void @dont_hoist_predicated_load(ptr %dst, ptr %invariant_ptr, ptr %cond_ptr, i32 %n) { +; CHECK-LABEL: define void @dont_hoist_predicated_load( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[INVARIANT_PTR:%.*]], ptr [[COND_PTR:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT:  [[ENTRY:.*]]: +; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N]], 4 +; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]] +; CHECK:       [[VECTOR_MEMCHECK]]: +; CHECK-NEXT:    [[TMP5:%.*]] = add i32 [[N]], -1 +; CHECK-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP5]] to i64 +; CHECK-NEXT:    [[TMP22:%.*]] = shl nuw nsw i64 [[TMP20]], 2 +; CHECK-NEXT:    [[TMP3:%.*]] = add nuw nsw i64 [[TMP22]], 4 +; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP3]] +; CHECK-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[COND_PTR]], i64 [[TMP3]] +; CHECK-NEXT:    [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[INVARIANT_PTR]], i64 4 +; CHECK-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[SCEVGEP1]] +; CHECK-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[COND_PTR]], [[SCEVGEP]] +; CHECK-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] +; CHECK-NEXT:    [[BOUND03:%.*]] = icmp ult ptr [[DST]], [[SCEVGEP2]] +; CHECK-NEXT:    [[BOUND14:%.*]] = icmp ult ptr [[INVARIANT_PTR]], [[SCEVGEP]] +; CHECK-NEXT:    [[FOUND_CONFLICT5:%.*]] = and i1 [[BOUND03]], [[BOUND14]] +; CHECK-NEXT:    [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT5]] +; CHECK-NEXT:    br i1 [[CONFLICT_RDX]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]] +; CHECK:       [[VECTOR_PH]]: +; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[N]], 4 +; CHECK-NEXT:    [[N_VEC:%.*]] = sub i32 [[N]], [[N_MOD_VF]] +; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]] +; CHECK:       [[VECTOR_BODY]]: +; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE11:.*]] ] +; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[COND_PTR]], i32 [[INDEX]] +; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4, !alias.scope [[META11:![0-9]+]] +; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt <4 x i32> [[WIDE_LOAD]], zeroinitializer +; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i1> [[TMP1]], i32 0 +; CHECK-NEXT:    br i1 [[TMP2]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]] +; CHECK:       [[PRED_STORE_IF]]: +; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META14:![0-9]+]] +; CHECK-NEXT:    [[TMP4:%.*]] = add i32 [[INDEX]], 0 +; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP4]] +; CHECK-NEXT:    store i32 [[TMP7]], ptr [[TMP9]], align 4, !alias.scope [[META16:![0-9]+]], !noalias [[META18:![0-9]+]] +; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]] +; CHECK:       [[PRED_STORE_CONTINUE]]: +; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x i1> [[TMP1]], i32 1 +; CHECK-NEXT:    br i1 [[TMP6]], label %[[PRED_STORE_IF6:.*]], label %[[PRED_STORE_CONTINUE7:.*]] +; CHECK:       [[PRED_STORE_IF6]]: +; CHECK-NEXT:    [[TMP11:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META14]] +; CHECK-NEXT:    [[TMP8:%.*]] = add i32 [[INDEX]], 1 +; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP8]] +; CHECK-NEXT:    store i32 [[TMP11]], ptr [[TMP13]], align 4, !alias.scope [[META16]], !noalias [[META18]] +; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE7]] +; CHECK:       [[PRED_STORE_CONTINUE7]]: +; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <4 x i1> [[TMP1]], i32 2 +; CHECK-NEXT:    br i1 [[TMP10]], label %[[PRED_STORE_IF8:.*]], label %[[PRED_STORE_CONTINUE9:.*]] +; CHECK:       [[PRED_STORE_IF8]]: +; CHECK-NEXT:    [[TMP15:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META14]] +; CHECK-NEXT:    [[TMP12:%.*]] = add i32 [[INDEX]], 2 +; CHECK-NEXT:    [[TMP17:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP12]] +; CHECK-NEXT:    store i32 [[TMP15]], ptr [[TMP17]], align 4, !alias.scope [[META16]], !noalias [[META18]] +; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE9]] +; CHECK:       [[PRED_STORE_CONTINUE9]]: +; CHECK-NEXT:    [[TMP14:%.*]] = extractelement <4 x i1> [[TMP1]], i32 3 +; CHECK-NEXT:    br i1 [[TMP14]], label %[[PRED_STORE_IF10:.*]], label %[[PRED_STORE_CONTINUE11]] +; CHECK:       [[PRED_STORE_IF10]]: +; CHECK-NEXT:    [[TMP19:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META14]] +; CHECK-NEXT:    [[TMP16:%.*]] = add i32 [[INDEX]], 3 +; CHECK-NEXT:    [[TMP21:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP16]] +; CHECK-NEXT:    store i32 [[TMP19]], ptr [[TMP21]], align 4, !alias.scope [[META16]], !noalias [[META18]] +; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE11]] +; CHECK:       [[PRED_STORE_CONTINUE11]]: +; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4 +; CHECK-NEXT:    [[TMP18:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] +; CHECK-NEXT:    br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]] +; CHECK:       [[MIDDLE_BLOCK]]: +; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[N]], [[N_VEC]] +; CHECK-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]] +; CHECK:       [[SCALAR_PH]]: +; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_MEMCHECK]] ] +; CHECK-NEXT:    br label %[[LOOP:.*]] +; CHECK:       [[LOOP]]: +; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] +; CHECK-NEXT:    [[GEP_COND:%.*]] = getelementptr inbounds i32, ptr [[COND_PTR]], i32 [[IV]] +; CHECK-NEXT:    [[COND:%.*]] = load i32, ptr [[GEP_COND]], align 4 +; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[COND]], 0 +; CHECK-NEXT:    br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[LOOP_LATCH]] +; CHECK:       [[IF_THEN]]: +; CHECK-NEXT:    [[INV_VAL:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4 +; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[IV]] +; CHECK-NEXT:    store i32 [[INV_VAL]], ptr [[GEP]], align 4 +; CHECK-NEXT:    br label %[[LOOP_LATCH]] +; CHECK:       [[LOOP_LATCH]]: +; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 +; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]] +; CHECK-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP20:![0-9]+]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +entry: +  br label %loop + +loop: +  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] +  %gep.cond = getelementptr inbounds i32, ptr %cond_ptr, i32 %iv +  %cond = load i32, ptr %gep.cond, align 4 +  %cmp = icmp sgt i32 %cond, 0 +  br i1 %cmp, label %if.then, label %loop.latch + +if.then: +  %inv_val = load i32, ptr %invariant_ptr, align 4 +  %gep = getelementptr inbounds i32, ptr %dst, i32 %iv +  store i32 %inv_val, ptr %gep, align 4 +  br label %loop.latch + +loop.latch: +  %iv.next = add nuw nsw i32 %iv, 1 +  %ec = icmp eq i32 %iv.next, %n +  br i1 %ec, label %exit, label %loop + +exit: +  ret void +} diff --git a/llvm/test/Transforms/LoopVectorize/vplan-printing-metadata.ll b/llvm/test/Transforms/LoopVectorize/vplan-printing-metadata.ll new file mode 100644 index 0000000..857b913 --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/vplan-printing-metadata.ll @@ -0,0 +1,100 @@ +; REQUIRES: asserts + +; RUN: opt -passes=loop-vectorize -debug-only=loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -disable-output %s 2>&1 | FileCheck %s + +define void @test_widen_metadata(ptr noalias %A, ptr noalias %B, i32 %n) { +; CHECK-LABEL: Checking a loop in 'test_widen_metadata' +; CHECK:      VPlan 'Initial VPlan for VF={4},UF>=1' { +; CHECK:      <x1> vector loop: { +; CHECK:        vector.body: +; CHECK:          WIDEN ir<%lv> = load vp<{{.*}}> +; CHECK:          WIDEN-CAST ir<%conv> = sitofp ir<%lv> to float +; CHECK:          WIDEN ir<%mul> = fmul ir<%conv>, ir<2.000000e+00> +; CHECK:          WIDEN-CAST ir<%conv.back> = fptosi ir<%mul> to i32 +; CHECK:          WIDEN store vp<{{.*}}>, ir<%conv.back> +; +entry: +  br label %loop + +loop: +  %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] +  %gep.A = getelementptr inbounds i32, ptr %A, i32 %i +  %lv = load i32, ptr %gep.A, align 4, !tbaa !0, !range !6 +  %conv = sitofp i32 %lv to float, !fpmath !5 +  %mul = fmul float %conv, 2.0, !fpmath !5 +  %conv.back = fptosi float %mul to i32 +  %gep.B = getelementptr inbounds i32, ptr %B, i32 %i +  store i32 %conv.back, ptr %gep.B, align 4, !tbaa !0 +  %i.next = add i32 %i, 1 +  %cond = icmp eq i32 %i.next, %n +  br i1 %cond, label %exit, label %loop + +exit: +  ret void +} + +declare float @llvm.sqrt.f32(float) + +define void @test_intrinsic_with_metadata(ptr noalias %A, ptr noalias %B, i32 %n) { +; CHECK-LABEL: Checking a loop in 'test_intrinsic_with_metadata' +; CHECK:      VPlan 'Initial VPlan for VF={4},UF>=1' { +; CHECK:      <x1> vector loop: { +; CHECK:        vector.body: +; CHECK:          WIDEN ir<%lv> = load vp<{{.*}}> +; CHECK:          WIDEN-INTRINSIC ir<%sqrt> = call llvm.sqrt(ir<%lv>) +; CHECK:          WIDEN store vp<{{.*}}>, ir<%sqrt> +; +entry: +  br label %loop + +loop: +  %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] +  %gep.A = getelementptr inbounds float, ptr %A, i32 %i +  %lv = load float, ptr %gep.A, align 4, !tbaa !0 +  %sqrt = call float @llvm.sqrt.f32(float %lv), !fpmath !5 +  %gep.B = getelementptr inbounds float, ptr %B, i32 %i +  store float %sqrt, ptr %gep.B, align 4, !tbaa !0 +  %i.next = add i32 %i, 1 +  %cond = icmp eq i32 %i.next, %n +  br i1 %cond, label %exit, label %loop + +exit: +  ret void +} + +define void @test_widen_with_multiple_metadata(ptr noalias %A, ptr noalias %B, i32 %n) { +; CHECK-LABEL: Checking a loop in 'test_widen_with_multiple_metadata' +; CHECK:      VPlan 'Initial VPlan for VF={4},UF>=1' { +; CHECK:      <x1> vector loop: { +; CHECK:        vector.body: +; CHECK:          WIDEN ir<%lv> = load vp<{{.*}}> +; CHECK:          WIDEN-CAST ir<%conv> = sitofp ir<%lv> to float +; CHECK:          WIDEN ir<%mul> = fmul ir<%conv>, ir<2.000000e+00> +; CHECK:          WIDEN-CAST ir<%conv.back> = fptosi ir<%mul> to i32 +; CHECK:          WIDEN store vp<{{.*}}>, ir<%conv.back> +; +entry: +  br label %loop + +loop: +  %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] +  %gep.A = getelementptr inbounds i32, ptr %A, i32 %i +  %lv = load i32, ptr %gep.A, align 4, !tbaa !0, !range !6 +  %conv = sitofp i32 %lv to float +  %mul = fmul float %conv, 2.0 +  %conv.back = fptosi float %mul to i32 +  %gep.B = getelementptr inbounds i32, ptr %B, i32 %i +  store i32 %conv.back, ptr %gep.B, align 4, !tbaa !0 +  %i.next = add i32 %i, 1 +  %cond = icmp eq i32 %i.next, %n +  br i1 %cond, label %exit, label %loop + +exit: +  ret void +} + +!0 = !{!1, !1, i64 0} +!1 = !{!"float", !2} +!2 = !{!"root"} +!5 = !{float 2.500000e+00} +!6 = !{i32 0, i32 100} diff --git a/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll b/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll index 994e9c1..2dd6a04 100644 --- a/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll +++ b/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll @@ -29,11 +29,13 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3  ; CHECK-NEXT:   EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION  ; CHECK-NEXT:   ir<%iv> = WIDEN-INDUCTION ir<0>, ir<1>, vp<[[VF]]>  ; CHECK-NEXT:   EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv>, vp<[[BTC]]> +; CHECK-NEXT:   WIDEN ir<%cond> = icmp eq ir<%iv>, ir<%x> +; CHECK-NEXT:   EMIT vp<[[AND:%.+]]> = logical-and vp<[[MASK]]>, ir<%cond>  ; CHECK-NEXT: Successor(s): pred.store  ; CHECK:      <xVFxUF> pred.store: {  ; CHECK-NEXT:   pred.store.entry: -; CHECK-NEXT:     BRANCH-ON-MASK vp<[[MASK]]> +; CHECK-NEXT:     BRANCH-ON-MASK vp<[[AND]]>  ; CHECK-NEXT:   Successor(s): pred.store.if, pred.store.continue  ; CHECK:      pred.store.if: @@ -50,24 +52,31 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3  ; CHECK-NEXT:   No successors  ; CHECK-NEXT: } -; CHECK:      loop.1: +; CHECK:      if.1:  ; CHECK-NEXT:   EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>  ; CHECK-NEXT:   EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VEC_TC]]>  ; CHECK-NEXT: No successors  ; CHECK-NEXT: }  ; -define void @sink1(i32 %k) { +define void @sink1(i32 %k, i32 %x) {  entry:    br label %loop  loop: -  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] +  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] +  %cond = icmp eq i32 %iv, %x +  br i1 %cond, label %if, label %latch + +if:    %gep.b = getelementptr inbounds [2048 x i32], ptr @b, i32 0, i32 %iv    %lv.b  = load i32, ptr %gep.b, align 4    %add = add i32 %lv.b, 10    %mul = mul i32 2, %add    %gep.a = getelementptr inbounds [2048 x i32], ptr @a, i32 0, i32 %iv    store i32 %mul, ptr %gep.a, align 4 +  br label %latch + +latch:    %iv.next = add i32 %iv, 1    %large = icmp sge i32 %iv, 8    %exitcond = icmp eq i32 %iv, %k diff --git a/llvm/test/Transforms/PhaseOrdering/AArch64/hoist-load-from-vector-loop.ll b/llvm/test/Transforms/PhaseOrdering/AArch64/hoist-load-from-vector-loop.ll new file mode 100644 index 0000000..a35bcf1 --- /dev/null +++ b/llvm/test/Transforms/PhaseOrdering/AArch64/hoist-load-from-vector-loop.ll @@ -0,0 +1,46 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6 +; RUN: opt -passes='default<O3>' -S %s | FileCheck %s + +target triple = "arm64-apple-macosx" + +%"class.dealii::VectorizedArray" = type { [4 x double] } + +define void @hoist_invariant_load(ptr %invariant_ptr, i64 %num_elements, ptr %array) { +; CHECK-LABEL: define void @hoist_invariant_load( +; CHECK-SAME: ptr readonly captures(none) [[INVARIANT_PTR:%.*]], i64 [[NUM_ELEMENTS:%.*]], ptr captures(none) [[ARRAY:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { +; CHECK-NEXT:  [[ENTRY:.*]]: +; CHECK-NEXT:    [[CMP1_NOT:%.*]] = icmp eq i64 [[NUM_ELEMENTS]], 0 +; CHECK-NEXT:    br i1 [[CMP1_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH:.*]] +; CHECK:       [[LOOP_LATCH]]: +; CHECK-NEXT:    [[I2:%.*]] = phi i64 [ [[I_NEXT:%.*]], %[[LOOP_LATCH]] ], [ 0, %[[ENTRY]] ] +; CHECK-NEXT:    [[GEP:%.*]] = getelementptr nusw %"class.dealii::VectorizedArray", ptr [[ARRAY]], i64 [[I2]] +; CHECK-NEXT:    [[INVARIANT_VAL:%.*]] = load double, ptr [[INVARIANT_PTR]], align 8 +; CHECK-NEXT:    [[ARRAY_VAL:%.*]] = load double, ptr [[GEP]], align 8 +; CHECK-NEXT:    [[SUM:%.*]] = fadd double [[INVARIANT_VAL]], [[ARRAY_VAL]] +; CHECK-NEXT:    store double [[SUM]], ptr [[GEP]], align 8 +; CHECK-NEXT:    [[I_NEXT]] = add nuw i64 [[I2]], 1 +; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[I_NEXT]], [[NUM_ELEMENTS]] +; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT]], label %[[LOOP_LATCH]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +entry: +  br label %loop.header + +loop.header:                                      ; preds = %loop.latch, %entry +  %i = phi i64 [ 0, %entry ], [ %i.next, %loop.latch ] +  %cmp = icmp ult i64 %i, %num_elements +  br i1 %cmp, label %loop.latch, label %exit + +loop.latch:                                       ; preds = %loop.header +  %gep = getelementptr nusw %"class.dealii::VectorizedArray", ptr %array, i64 %i +  %invariant_val = load double, ptr %invariant_ptr, align 8 +  %array_val = load double, ptr %gep, align 8 +  %sum = fadd double %array_val, %invariant_val +  store double %sum, ptr %gep, align 8 +  %i.next = add i64 %i, 1 +  br label %loop.header + +exit:                                             ; preds = %loop.header +  ret void +} diff --git a/llvm/test/Transforms/SLPVectorizer/AArch64/div-like-mixed-with-undefs.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/div-like-mixed-with-undefs.ll index d16843c..6629b12 100644 --- a/llvm/test/Transforms/SLPVectorizer/AArch64/div-like-mixed-with-undefs.ll +++ b/llvm/test/Transforms/SLPVectorizer/AArch64/div-like-mixed-with-undefs.ll @@ -1,21 +1,21 @@  ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6  ; RUN: opt -passes=slp-vectorizer -S -slp-threshold=-100 -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s -define ptr @test(ptr %d) { +define ptr @test(ptr %d, i64 %v) {  ; CHECK-LABEL: define ptr @test( -; CHECK-SAME: ptr [[D:%.*]]) { +; CHECK-SAME: ptr [[D:%.*]], i64 [[V:%.*]]) {  ; CHECK-NEXT:  [[ENTRY:.*:]] -; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr null, align 1 +; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[D]], align 1  ; CHECK-NEXT:    [[CMP4_2:%.*]] = icmp eq i8 [[TMP0]], 0 -; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[CMP4_2]], i64 0, i64 0 -; CHECK-NEXT:    [[TMP2:%.*]] = xor i64 0, 0 -; CHECK-NEXT:    [[TMP3:%.*]] = udiv i64 [[TMP2]], 0 -; CHECK-NEXT:    [[TMP4:%.*]] = udiv i64 1, 0 +; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[CMP4_2]], i64 0, i64 4 +; CHECK-NEXT:    [[TMP2:%.*]] = xor i64 0, [[V]] +; CHECK-NEXT:    [[TMP3:%.*]] = udiv i64 [[TMP2]], 3 +; CHECK-NEXT:    [[TMP4:%.*]] = udiv i64 1, [[V]]  ; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <6 x i64> poison, i64 [[TMP1]], i32 0  ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <6 x i64> [[TMP5]], i64 [[TMP3]], i32 1  ; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <6 x i64> [[TMP6]], i64 [[TMP4]], i32 4  ; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <6 x i64> [[TMP7]], <6 x i64> poison, <6 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 4> -; CHECK-NEXT:    [[TMP9:%.*]] = mul <6 x i64> [[TMP8]], <i64 2, i64 6, i64 1, i64 1, i64 1, i64 0> +; CHECK-NEXT:    [[TMP9:%.*]] = mul <6 x i64> [[TMP8]], <i64 2, i64 6, i64 4, i64 3, i64 5, i64 4>  ; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <6 x i64> [[TMP9]], i32 0  ; CHECK-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[D]], i64 [[TMP10]]  ; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <6 x i64> [[TMP9]], i32 1 @@ -31,23 +31,23 @@ define ptr @test(ptr %d) {  ; CHECK-NEXT:    ret ptr [[TMP20]]  ;  entry: -  %0 = load i8, ptr null, align 1 +  %0 = load i8, ptr %d, align 1    %cmp4.2 = icmp eq i8 %0, 0 -  %1 = select i1 %cmp4.2, i64 0, i64 0 +  %1 = select i1 %cmp4.2, i64 0, i64 4    %2 = shl i64 %1, 1    %3 = getelementptr i8, ptr %d, i64 %2 -  %4 = xor i64 0, 0 -  %5 = udiv i64 %4, 0 +  %4 = xor i64 0, %v +  %5 = udiv i64 %4, 3    %6 = mul i64 %5, 6    %7 = getelementptr i8, ptr %d, i64 %6 -  %8 = shl i64 %1, 0 +  %8 = shl i64 %1, 2    %scevgep42 = getelementptr i8, ptr %d, i64 %8 -  %9 = mul i64 %5, 1 +  %9 = mul i64 %5, 3    %10 = getelementptr i8, ptr %d, i64 %9 -  %11 = udiv i64 1, 0 -  %12 = mul i64 %11, 1 +  %11 = udiv i64 1, %v +  %12 = mul i64 %11, 5    %13 = getelementptr i8, ptr %d, i64 %12 -  %14 = mul i64 %11, 0 +  %14 = mul i64 %11, 4    %15 = getelementptr i8, ptr %d, i64 %14    ret ptr %15  } diff --git a/llvm/test/Transforms/SLPVectorizer/X86/alternate-opcode-strict-bitwidth-than-main.ll b/llvm/test/Transforms/SLPVectorizer/X86/alternate-opcode-strict-bitwidth-than-main.ll new file mode 100644 index 0000000..959b235 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/alternate-opcode-strict-bitwidth-than-main.ll @@ -0,0 +1,36 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -passes=slp-vectorizer -S -slp-threshold=-99999 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +define float @test(i8 %0) { +; CHECK-LABEL: define float @test( +; CHECK-SAME: i8 [[TMP0:%.*]]) { +; CHECK-NEXT:  [[ENTRY:.*:]] +; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x i8> <i8 poison, i8 0>, i8 [[TMP0]], i32 0 +; CHECK-NEXT:    [[TMP2:%.*]] = sext <2 x i8> [[TMP1]] to <2 x i32> +; CHECK-NEXT:    [[TMP3:%.*]] = mul <2 x i32> [[TMP2]], <i32 2, i32 27> +; CHECK-NEXT:    [[TMP4:%.*]] = lshr <2 x i32> [[TMP2]], <i32 2, i32 27> +; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <2 x i32> [[TMP3]], <2 x i32> [[TMP4]], <2 x i32> <i32 0, i32 3> +; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <2 x i32> [[TMP5]], i32 0 +; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <2 x i32> [[TMP5]], i32 1 +; CHECK-NEXT:    [[TMP8:%.*]] = or i32 [[TMP6]], [[TMP7]] +; CHECK-NEXT:    switch i32 [[TMP8]], label %[[EXIT:.*]] [ +; CHECK-NEXT:      i32 0, label %[[EXIT]] +; CHECK-NEXT:      i32 1, label %[[EXIT]] +; CHECK-NEXT:    ] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret float 0.000000e+00 +; +entry: +  %1 = sext i8 0 to i32 +  %2 = lshr i32 %1, 27 +  %3 = sext i8 %0 to i32 +  %reass.add.epil = mul i32 %3, 2 +  %4 = or i32 %reass.add.epil, %2 +  switch i32 %4, label %exit [ +  i32 0, label %exit +  i32 1, label %exit +  ] + +exit: +  ret float 0.000000e+00 +} diff --git a/llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll b/llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll new file mode 100644 index 0000000..590b0be --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll @@ -0,0 +1,40 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -passes=slp-vectorizer -S --mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +@a = common global [100 x i64] zeroinitializer, align 64 + +define void @test() { +; CHECK-LABEL: define void @test() { +; CHECK-NEXT:  [[ENTRY:.*]]: +; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i64>, ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8 +; CHECK-NEXT:    [[TMP1:%.*]] = add <2 x i64> [[TMP0]], splat (i64 1) +; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <2 x i64> [[TMP0]], <2 x i64> [[TMP1]], <2 x i32> <i32 0, i32 3> +; CHECK-NEXT:    [[TMP3:%.*]] = add <2 x i64> [[TMP2]], splat (i64 1) +; CHECK-NEXT:    br i1 false, label %[[LOP_RHSCNT_I_PEEL:.*]], label %[[LAND_END_I_PEEL:.*]] +; CHECK:       [[LOP_RHSCNT_I_PEEL]]: +; CHECK-NEXT:    [[TMP4:%.*]] = or <2 x i64> [[TMP1]], <i64 1, i64 0> +; CHECK-NEXT:    br label %[[LAND_END_I_PEEL]] +; CHECK:       [[LAND_END_I_PEEL]]: +; CHECK-NEXT:    [[TMP5:%.*]] = phi <2 x i64> [ [[TMP3]], %[[ENTRY]] ], [ [[TMP4]], %[[LOP_RHSCNT_I_PEEL]] ] +; CHECK-NEXT:    store <2 x i64> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8 +; CHECK-NEXT:    ret void +; +entry: +  %.promoted104.i = load i64, ptr getelementptr inbounds nuw (i8, ptr @a, i64 56), align 8 +  %.promoted103.i = load i64, ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8 +  %0 = add i64 %.promoted104.i, 1 +  %1 = add i64 %.promoted103.i, 1 +  %2 = add i64 %0, 1 +  br i1 false, label %lop.rhscnt.i.peel, label %land.end.i.peel + +lop.rhscnt.i.peel: +  %3 = or i64 %1, 1 +  br label %land.end.i.peel + +land.end.i.peel: +  %4 = phi i64 [ %2, %entry ], [ %0, %lop.rhscnt.i.peel ] +  %5 = phi i64 [ %1, %entry ], [ %3, %lop.rhscnt.i.peel ] +  store i64 %5, ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8 +  store i64 %4, ptr getelementptr inbounds nuw (i8, ptr @a, i64 56), align 8 +  ret void +} diff --git a/llvm/test/Transforms/SimplifyCFG/X86/switch-of-powers-of-two.ll b/llvm/test/Transforms/SimplifyCFG/X86/switch-of-powers-of-two.ll index aa95b3f..d818335 100644 --- a/llvm/test/Transforms/SimplifyCFG/X86/switch-of-powers-of-two.ll +++ b/llvm/test/Transforms/SimplifyCFG/X86/switch-of-powers-of-two.ll @@ -1,8 +1,13 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 5  ; RUN: opt -passes='simplifycfg<switch-to-lookup>' -simplifycfg-require-and-preserve-domtree=1 -S < %s | FileCheck %s  target triple = "x86_64-unknown-linux-gnu" +;. +; CHECK: @switch.table.switch_of_powers_two = private unnamed_addr constant [7 x i32] [i32 3, i32 poison, i32 poison, i32 2, i32 1, i32 0, i32 42], align 4 +; CHECK: @switch.table.switch_of_powers_two_default_reachable = private unnamed_addr constant [7 x i32] [i32 3, i32 5, i32 5, i32 2, i32 1, i32 0, i32 42], align 4 +; CHECK: @switch.table.switch_of_powers_two_default_reachable_multipreds = private unnamed_addr constant [7 x i32] [i32 3, i32 poison, i32 poison, i32 2, i32 1, i32 0, i32 42], align 4 +;.  define i32 @switch_of_powers_two(i32 %arg) {  ; CHECK-LABEL: define i32 @switch_of_powers_two(  ; CHECK-SAME: i32 [[ARG:%.*]]) { @@ -35,17 +40,17 @@ return:    ret i32 %phi  } -define i32 @switch_of_powers_two_default_reachable(i32 %arg) { +define i32 @switch_of_powers_two_default_reachable(i32 %arg) !prof !0 {  ; CHECK-LABEL: define i32 @switch_of_powers_two_default_reachable( -; CHECK-SAME: i32 [[ARG:%.*]]) { +; CHECK-SAME: i32 [[ARG:%.*]]) !prof [[PROF0:![0-9]+]] {  ; CHECK-NEXT:  [[ENTRY:.*]]:  ; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.ctpop.i32(i32 [[ARG]])  ; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 1 -; CHECK-NEXT:    br i1 [[TMP1]], label %[[ENTRY_SPLIT:.*]], label %[[RETURN:.*]] +; CHECK-NEXT:    br i1 [[TMP1]], label %[[ENTRY_SPLIT:.*]], label %[[RETURN:.*]], !prof [[PROF1:![0-9]+]]  ; CHECK:       [[ENTRY_SPLIT]]:  ; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @llvm.cttz.i32(i32 [[ARG]], i1 true)  ; CHECK-NEXT:    [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 7 -; CHECK-NEXT:    br i1 [[TMP3]], label %[[SWITCH_LOOKUP:.*]], label %[[RETURN]] +; CHECK-NEXT:    br i1 [[TMP3]], label %[[SWITCH_LOOKUP:.*]], label %[[RETURN]], !prof [[PROF2:![0-9]+]]  ; CHECK:       [[SWITCH_LOOKUP]]:  ; CHECK-NEXT:    [[TMP4:%.*]] = zext nneg i32 [[TMP2]] to i64  ; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [7 x i32], ptr @switch.table.switch_of_powers_two_default_reachable, i64 0, i64 [[TMP4]] @@ -62,7 +67,7 @@ entry:    i32 16, label %bb3    i32 32, label %bb4    i32 64, label %bb5 -  ] +  ], !prof !1  default_case: br label %return  bb1: br label %return @@ -128,3 +133,13 @@ return:    %phi = phi i32 [ 3, %bb1 ], [ 2, %bb2 ], [ 1, %bb3 ], [ 0, %bb4 ], [ 42, %bb5 ], [ %pn, %default_case ]    ret i32 %phi  } + +!0 = !{!"function_entry_count", i32 10} +!1 = !{!"branch_weights", i32 10, i32 5, i32 7, i32 11, i32 13, i32 17} +;. +; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } +;. +; CHECK: [[PROF0]] = !{!"function_entry_count", i32 10} +; CHECK: [[PROF1]] = !{!"branch_weights", i32 58, i32 5} +; CHECK: [[PROF2]] = !{!"branch_weights", i32 56, i32 5} +;. diff --git a/llvm/test/Transforms/SimplifyCFG/pr165301.ll b/llvm/test/Transforms/SimplifyCFG/pr165301.ll index 4a539d7..1df6552 100644 --- a/llvm/test/Transforms/SimplifyCFG/pr165301.ll +++ b/llvm/test/Transforms/SimplifyCFG/pr165301.ll @@ -1,11 +1,11 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 6  ; RUN: opt -S -passes="simplifycfg<switch-range-to-icmp>" < %s | FileCheck %s  ; Make sure there's no use after free when removing incoming values from PHI nodes -define i32 @pr165301(i1 %cond) { +define i32 @pr165301(i1 %cond) !prof !0 {  ; CHECK-LABEL: define i32 @pr165301( -; CHECK-SAME: i1 [[COND:%.*]]) { +; CHECK-SAME: i1 [[COND:%.*]]) !prof [[PROF0:![0-9]+]] {  ; CHECK-NEXT:  [[ENTRY:.*:]]  ; CHECK-NEXT:    br label %[[SWITCHBB:.*]]  ; CHECK:       [[SWITCHBB]]: @@ -18,9 +18,14 @@ switchbb:    switch i1 %cond, label %default [    i1 false, label %switchbb    i1 true, label %switchbb -  ] +  ], !prof !1  default:    %phi.lcssa = phi i32 [ 0, %switchbb ]    ret i32 %phi.lcssa  } +!0 = !{!"function_entry_count", i32 10} +!1 = !{!"branch_weights", i32 2, i32 3, i32 5} +;. +; CHECK: [[PROF0]] = !{!"function_entry_count", i32 10} +;. diff --git a/llvm/test/Transforms/StructurizeCFG/callbr.ll b/llvm/test/Transforms/StructurizeCFG/callbr.ll new file mode 100644 index 0000000..42f9519 --- /dev/null +++ b/llvm/test/Transforms/StructurizeCFG/callbr.ll @@ -0,0 +1,235 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -S -passes=structurizecfg %s -o - | FileCheck %s + +; Structurize as usual, but don't tear callbr and its destination blocks apart. +; +; Note: currently, callbr blocks and their corresponding target blocks +; themselves are not handled by the structurizer.* If the CFG turns out to be +; unstructured at the end, the CFG lowering (si-annotate-control-flow) will +; detect this. For the currently intended use cases of callbr in the context of +; the AMDGPU backend, this is not a limitation (cf. +; https://discourse.llvm.org/t/rfc-add-callbr-intrinsic-support/86087). +; +; Note 2: while callbr and its targets remain untouched, everything else is +; handled as usual, even if it is nested in a callbr region. +; +; *FIXME: this will be fixed in the future. Callbr can be handled as follows: +; Input IR: +; ``` +; define void @foo_callbr() { +;   callbr void asm "", "!i"() to label %fallthrough [label %indirect, ...] +; fallthrough: +;   br label %exit +; indirect: +;   br label %exit +; ... +; exit: +;   ret void +; } +; ``` +; +; Output IR: +; ``` +; define void @foo_callbr() { +;   callbr void asm "", "!i"() +;          to label %fallthrough [label %fake.indirect, label %fake.indirect1, label %fake.indirect2, ...] +; fake.indirect:                                    ; preds = %0 +;   br label %Flow +; fake.indirect1:                                   ; preds = %0 +;   br label %Flow +; fake.indirect2:                                   ; preds = %0 +;   br label %Flow +; ... +; Flow:                                             ; preds = %fallthrough, %fake.indirect[0-N] +;   %1 = phi i1 [ false, %fallthrough ], [ true, %fake.indirect ], [ false, %fake.indirect[1-N] ] +;   br i1 %1, label %indirect, label %Flow1 +; Flow1:                                            ; preds = %Flow, %indirect +;   %2 = phi i1 [ false, %Flow], [ true, %fake.indirect1 ], [ false, %indirect ] +;   br i1 %2, label %indirect1, label %Flow2 +; Flow2:                                            ; preds = %Flow, %indirect1 +;   %2 = phi i1 [ false, %Flow], [ true, %fake.indirect2 ], [ false, %indirect1 ] +;   br i1 %2, label %indirect2, label %Flow3 +; ... +; fallthrough:                                      ; preds = %0 +;   br label %Flow +; indirect:                                         ; preds = %Flow +;   br label %Flow1 +; indirect1:                                        ; preds = %Flow1 +;   br label %Flow2 +; indirect2:                                        : preds = %Flow2 +;   br label %Flow3 +; ... +; exit:                                             ; preds = %indirectN, %FlowN +;   ret void +; } +; ``` +; +; Output IR as ASCII-art: +;          %0 +; --------------------- +; |     |     |     | +; v     v     v     v +; f    f.i   f.i1  f.i2 +; |     |     |     | +; v     v     v     v +; --------------------- +;        %Flow +;          |   \ +;          |    %indirect +;          |   / +;       %Flow1 +;          |   \ +;          |    %indirect1 +;          |   / +;       %Flow2 +;          |   \ +;          |    %indirect2 +;          |   / +;        %exit +; + +; Only callbr, nothing to do. +define void @callbr_simple() { +; CHECK-LABEL: define void @callbr_simple() { +; CHECK-NEXT:  [[CALLBR:.*:]] +; CHECK-NEXT:    callbr void asm "", "!i"() +; CHECK-NEXT:            to label %[[INDIRECT:.*]] [label %indirect] +; CHECK:       [[INDIRECT]]: +; CHECK-NEXT:    br label %[[EXIT:.*]] +; CHECK:       [[INDIRECT1:.*:]] +; CHECK-NEXT:    br label %[[EXIT]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +callbr: +  callbr void asm "", "!i"() to label %fallthrough [label %indirect] +fallthrough: +  br label %exit +indirect: +  br label %exit +exit: +  ret void +} + +; Callbr nested in non-callbr: non-callbr is transformed +define void @callbr_in_non_callbr(i1 %c) { +; CHECK-LABEL: define void @callbr_in_non_callbr( +; CHECK-SAME: i1 [[C:%.*]]) { +; CHECK-NEXT:    [[C_INV:%.*]] = xor i1 [[C]], true +; CHECK-NEXT:    br i1 [[C_INV]], label %[[NOCALLBR:.*]], label %[[FLOW:.*]] +; CHECK:       [[FLOW]]: +; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ false, %[[NOCALLBR]] ], [ true, [[TMP0:%.*]] ] +; CHECK-NEXT:    br i1 [[TMP1]], label %[[CALLBR:.*]], label %[[EXIT:.*]] +; CHECK:       [[CALLBR]]: +; CHECK-NEXT:    callbr void asm "", "!i"() +; CHECK-NEXT:            to label %[[INDIRECT:.*]] [label %indirect] +; CHECK:       [[INDIRECT]]: +; CHECK-NEXT:    br label %[[EXIT]] +; CHECK:       [[INDIRECT1:.*:]] +; CHECK-NEXT:    br label %[[EXIT]] +; CHECK:       [[NOCALLBR]]: +; CHECK-NEXT:    br label %[[FLOW]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +  br i1 %c, label %callbr, label %nocallbr +callbr: +  callbr void asm "", "!i"() to label %fallthrough [label %indirect] +fallthrough: +  br label %exit +indirect: +  br label %exit +nocallbr: +  br label %exit +exit: +  ret void +} + +; Callbr parent of non-callbr: non-callbr is transformed +define void @non_callbr_in_callbr(i1 %c) { +; CHECK-LABEL: define void @non_callbr_in_callbr( +; CHECK-SAME: i1 [[C:%.*]]) { +; CHECK-NEXT:    [[C_INV:%.*]] = xor i1 [[C]], true +; CHECK-NEXT:    callbr void asm "", "!i"() +; CHECK-NEXT:            to label %[[INDIRECT:.*]] [label %indirect] +; CHECK:       [[INDIRECT]]: +; CHECK-NEXT:    br i1 [[C_INV]], label %[[FALLTHROUGH2:.*]], label %[[FLOW:.*]] +; CHECK:       [[FLOW]]: +; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ false, %[[FALLTHROUGH2]] ], [ true, %[[INDIRECT]] ] +; CHECK-NEXT:    br i1 [[TMP1]], label %[[FALLTHROUGH1:.*]], label %[[FLOW1:.*]] +; CHECK:       [[FALLTHROUGH1]]: +; CHECK-NEXT:    br label %[[FLOW1]] +; CHECK:       [[FALLTHROUGH2]]: +; CHECK-NEXT:    br label %[[FLOW]] +; CHECK:       [[INDIRECT1:.*:]] +; CHECK-NEXT:    br label %[[EXIT:.*]] +; CHECK:       [[FLOW1]]: +; CHECK-NEXT:    br label %[[EXIT]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +  callbr void asm "", "!i"() to label %fallthrough [label %indirect] +fallthrough: +  br i1 %c, label %fallthrough1, label %fallthrough2 +fallthrough1: +  br label %exit +fallthrough2: +  br label %exit +indirect: +  br label %exit +exit: +  ret void +} + +; Callbr surrounded by non-callbr: all three regular branches are handled +; correctly +define void @callbr_nested_in_non_callbr(i1 %c, i1 %d, i1 %e, i1 %f) { +; CHECK-LABEL: define void @callbr_nested_in_non_callbr( +; CHECK-SAME: i1 [[C:%.*]], i1 [[D:%.*]], i1 [[E:%.*]], i1 [[F:%.*]]) { +; CHECK-NEXT:    [[C_INV:%.*]] = xor i1 [[C]], true +; CHECK-NEXT:    br i1 [[C_INV]], label %[[NOCALLBR:.*]], label %[[FLOW3:.*]] +; CHECK:       [[FLOW3]]: +; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ false, %[[FLOW:.*]] ], [ true, [[TMP0:%.*]] ] +; CHECK-NEXT:    br i1 [[TMP1]], label %[[CALLBR:.*]], label %[[RET:.*]] +; CHECK:       [[CALLBR]]: +; CHECK-NEXT:    callbr void asm "", "!i"() +; CHECK-NEXT:            to label %[[INDIRECT:.*]] [label %indirect] +; CHECK:       [[INDIRECT]]: +; CHECK-NEXT:    br i1 [[D]], label %[[FALLTHROUGH1:.*]], label %[[FLOW2:.*]] +; CHECK:       [[FALLTHROUGH1]]: +; CHECK-NEXT:    br label %[[FLOW2]] +; CHECK:       [[INDIRECT2:.*:]] +; CHECK-NEXT:    br i1 [[E]], label %[[INDIRECT1:.*]], label %[[FLOW1:.*]] +; CHECK:       [[INDIRECT1]]: +; CHECK-NEXT:    br label %[[FLOW1]] +; CHECK:       [[NOCALLBR]]: +; CHECK-NEXT:    br i1 [[F]], label %[[NOCALLBR1:.*]], label %[[FLOW]] +; CHECK:       [[NOCALLBR1]]: +; CHECK-NEXT:    br label %[[FLOW]] +; CHECK:       [[FLOW]]: +; CHECK-NEXT:    br label %[[FLOW3]] +; CHECK:       [[FLOW1]]: +; CHECK-NEXT:    br label %[[RET]] +; CHECK:       [[FLOW2]]: +; CHECK-NEXT:    br label %[[RET]] +; CHECK:       [[RET]]: +; CHECK-NEXT:    ret void +; +  br i1 %c, label %callbr, label %nocallbr +callbr: +  callbr void asm "", "!i"() to label %fallthrough [label %indirect] +fallthrough: +  br i1 %d, label %fallthrough1, label %ret +fallthrough1: +  br label %ret +indirect: +  br i1 %e, label %indirect1, label %ret +indirect1: +  br label %ret +nocallbr: +  br i1 %f, label %nocallbr1, label %ret +nocallbr1: +  br label %ret +ret: +  ret void +} diff --git a/llvm/test/lit.cfg.py b/llvm/test/lit.cfg.py index 11a5a57..cadf781 100644 --- a/llvm/test/lit.cfg.py +++ b/llvm/test/lit.cfg.py @@ -57,8 +57,13 @@ if config.enable_profcheck:      # so we just exclude llvm-reduce tests from this config altogether. This should      # be fine though as profcheck config tests are mostly concerned with opt.      config.excludes.append("llvm-reduce") +    # Exclude llvm-objcopy tests - not the target of this effort, and some use +    # cat in ways that conflict with how profcheck uses it. +    config.excludes.append("llvm-objcopy")      # (Issue #161235) Temporarily exclude LoopVectorize.      config.excludes.append("LoopVectorize") +    # exclude UpdateTestChecks - they fail because of inserted prof annotations +    config.excludes.append("UpdateTestChecks")  # test_source_root: The root path where tests are located.  config.test_source_root = os.path.dirname(__file__) @@ -474,7 +479,7 @@ if config.host_ldflags.find("-m32") < 0 and any(  config.available_features.add("host-byteorder-" + sys.byteorder + "-endian")  if config.target_triple:      if re.match( -        r"(aarch64_be|arc|armeb|bpfeb|lanai|m68k|mips|mips64|powerpc|powerpc64|sparc|sparcv9|s390x|s390|tce|thumbeb)-.*", +        r"(aarch64_be|arc|armeb|bpfeb|lanai|m68k|mips|mips64|powerpc|powerpc64|sparc|sparcv9|sparc64|s390x|s390|tce|thumbeb)-.*",          config.target_triple,      ):          config.available_features.add("target-byteorder-big-endian") diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_empty.ll b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_empty.ll new file mode 100644 index 0000000..bfd216d --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_empty.ll @@ -0,0 +1,29 @@ +; RUN: opt < %s -S | FileCheck %s + +; Test whether UTC checks empty lines instead of skipping them. +define i32 @test(i32 %x) { +entry: +  br label %block1 + +block1: +  %cmp = icmp eq i32 %x, 0 +  br i1 %cmp, label %block2, label %exit1 + +block2: +  br i1 %cmp, label %block3, label %exit2 + +block3: +  br i1 %cmp, label %exit3, label %exit4 + +exit1: +  ret i32 0 + +exit2: +  ret i32 %x + +exit3: +  ret i32 %x + +exit4: +  ret i32 %x +} diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_empty.ll.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_empty.ll.expected new file mode 100644 index 0000000..c5f822d --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_empty.ll.expected @@ -0,0 +1,57 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 7 +; RUN: opt < %s -S | FileCheck %s + +; Test whether UTC checks empty lines instead of skipping them. +define i32 @test(i32 %x) { +; CHECK-LABEL: define i32 @test( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT:  [[ENTRY:.*:]] +; CHECK-NEXT:    br label %[[BLOCK1:.*]] +; CHECK-EMPTY: +; CHECK-NEXT:  [[BLOCK1]]: +; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X]], 0 +; CHECK-NEXT:    br i1 [[CMP]], label %[[BLOCK2:.*]], label %[[EXIT1:.*]] +; CHECK-EMPTY: +; CHECK-NEXT:  [[BLOCK2]]: +; CHECK-NEXT:    br i1 [[CMP]], label %[[BLOCK3:.*]], label %[[EXIT2:.*]] +; CHECK-EMPTY: +; CHECK-NEXT:  [[BLOCK3]]: +; CHECK-NEXT:    br i1 [[CMP]], label %[[EXIT3:.*]], label %[[EXIT4:.*]] +; CHECK-EMPTY: +; CHECK-NEXT:  [[EXIT1]]: +; CHECK-NEXT:    ret i32 0 +; CHECK-EMPTY: +; CHECK-NEXT:  [[EXIT2]]: +; CHECK-NEXT:    ret i32 [[X]] +; CHECK-EMPTY: +; CHECK-NEXT:  [[EXIT3]]: +; CHECK-NEXT:    ret i32 [[X]] +; CHECK-EMPTY: +; CHECK-NEXT:  [[EXIT4]]: +; CHECK-NEXT:    ret i32 [[X]] +; +entry: +  br label %block1 + +block1: +  %cmp = icmp eq i32 %x, 0 +  br i1 %cmp, label %block2, label %exit1 + +block2: +  br i1 %cmp, label %block3, label %exit2 + +block3: +  br i1 %cmp, label %exit3, label %exit4 + +exit1: +  ret i32 0 + +exit2: +  ret i32 %x + +exit3: +  ret i32 %x + +exit4: +  ret i32 %x +} diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/switch_case.ll.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/switch_case.ll.expected index b1977e7..8cab0bb 100644 --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/switch_case.ll.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/switch_case.ll.expected @@ -12,13 +12,17 @@ define i8 @testi8(i8 %x) {  ; CHECK-NEXT:      i8 2, label %[[CASE3:.*]]  ; CHECK-NEXT:      i8 3, label %[[CASE3]]  ; CHECK-NEXT:    ] -; CHECK:       [[DEFAULT]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[DEFAULT]]:  ; CHECK-NEXT:    ret i8 0 -; CHECK:       [[CASE1]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[CASE1]]:  ; CHECK-NEXT:    ret i8 1 -; CHECK:       [[CASE2]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[CASE2]]:  ; CHECK-NEXT:    ret i8 2 -; CHECK:       [[CASE3]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[CASE3]]:  ; CHECK-NEXT:    ret i8 3  ;    switch i8 %x, label %default [ @@ -46,13 +50,17 @@ define i32 @testi32(i32 %x) {  ; CHECK-NEXT:      i32 2, label %[[CASE3:.*]]  ; CHECK-NEXT:      i32 3, label %[[CASE3]]  ; CHECK-NEXT:    ] -; CHECK:       [[DEFAULT]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[DEFAULT]]:  ; CHECK-NEXT:    ret i32 0 -; CHECK:       [[CASE1]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[CASE1]]:  ; CHECK-NEXT:    ret i32 1 -; CHECK:       [[CASE2]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[CASE2]]:  ; CHECK-NEXT:    ret i32 2 -; CHECK:       [[CASE3]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[CASE3]]:  ; CHECK-NEXT:    ret i32 3  ;    switch i32 %x, label %default [ @@ -80,13 +88,17 @@ define i128 @testi128(i128 %x) {  ; CHECK-NEXT:      i128 2, label %[[CASE3:.*]]  ; CHECK-NEXT:      i128 3, label %[[CASE3]]  ; CHECK-NEXT:    ] -; CHECK:       [[DEFAULT]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[DEFAULT]]:  ; CHECK-NEXT:    ret i128 0 -; CHECK:       [[CASE1]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[CASE1]]:  ; CHECK-NEXT:    ret i128 1 -; CHECK:       [[CASE2]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[CASE2]]:  ; CHECK-NEXT:    ret i128 2 -; CHECK:       [[CASE3]]: +; CHECK-EMPTY: +; CHECK-NEXT:  [[CASE3]]:  ; CHECK-NEXT:    ret i128 3  ;    switch i128 %x, label %default [ diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/check_empty.test b/llvm/test/tools/UpdateTestChecks/update_test_checks/check_empty.test new file mode 100644 index 0000000..670bda2 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/check_empty.test @@ -0,0 +1,3 @@ +## test whether the UTC generates CHECK-EMPTY for blank lines +# RUN: cp -f %S/Inputs/check_empty.ll %t.ll && %update_test_checks %t.ll --version 7 +# RUN: diff -u %t.ll %S/Inputs/check_empty.ll.expected diff --git a/llvm/test/tools/dsymutil/ARM/swiftmodule-include-from-interface.test b/llvm/test/tools/dsymutil/ARM/swiftmodule-include-from-interface.test new file mode 100644 index 0000000..00141f12 --- /dev/null +++ b/llvm/test/tools/dsymutil/ARM/swiftmodule-include-from-interface.test @@ -0,0 +1,33 @@ +# RUN: dsymutil -include-swiftmodules-from-interface -verbose -oso-prepend-path=%p -y -o %t.dSYM  %s | FileCheck %s +# +# RUN: dsymutil -include-swiftmodules-from-interface --linker parallel -verbose -oso-prepend-path=%p -y %s -o %t-parallel.dSYM | FileCheck %s +# +# To regenerate: +# echo ''>I.swift +# echo ''>B.swift +# echo 'import I'>main.swift +# xcrun swiftc -emit-module-interface-path I.swiftinterface -enable-library-evolution I.swift +# xcrun swiftc -emit-module-path B.swiftmodule B.swift -Xfrontend -no-serialize-debugging-options +# xcrun swiftc -explicit-module-build main.swift -I. -module-cache-path cache -g -Xfrontend  -no-serialize-debugging-options +# output is "B.swiftmodule" and "cache/I*.swiftmodule" +# +# CHECK-NOT: Skipping compiled textual Swift interface: {{.*}}/Inputs/Binary.swiftmodule +# CHECK-NOT: Skipping compiled textual Swift interface: {{.*}}/Inputs/FromInterface.swiftmodule + +# +--- +triple:          'arm64-apple-darwin' +objects: +  - filename:        '../Inputs/Binary.swiftmodule' +    timestamp:       0 +    type:            50 +    symbols:         [] +  - filename:        '../Inputs/FromInterface.swiftmodule' +    timestamp:       0 +    type:            50 +    symbols:         [] +  - filename:        '../Inputs/FromInterface.swiftmodule' +    timestamp:       0 +    type:            50 +    symbols:         [] +... diff --git a/llvm/test/tools/dsymutil/cmdline.test b/llvm/test/tools/dsymutil/cmdline.test index 1574fe3..0b0bce1 100644 --- a/llvm/test/tools/dsymutil/cmdline.test +++ b/llvm/test/tools/dsymutil/cmdline.test @@ -14,6 +14,7 @@ CHECK: -fat64  CHECK: -flat  CHECK: -gen-reproducer  CHECK: -help +CHECK: -include-swiftmodules-from-interface  CHECK: -keep-function-for-static  CHECK: -no-object-timestamp  CHECK: -no-odr diff --git a/llvm/test/tools/llvm-config/paths.test b/llvm/test/tools/llvm-config/paths.test index 419f155..61d86f7 100644 --- a/llvm/test/tools/llvm-config/paths.test +++ b/llvm/test/tools/llvm-config/paths.test @@ -4,18 +4,34 @@ RUN: llvm-config --bindir 2>&1 | FileCheck --check-prefix=CHECK-BINDIR %s  CHECK-BINDIR: {{.*}}{{/|\\}}bin  CHECK-BINDIR-NOT: error:  CHECK-BINDIR-NOT: warning +RUN: llvm-config --bindir --quote-paths 2>&1 | FileCheck --check-prefix=CHECK-BINDIR2 %s +CHECK-BINDIR2: {{.*}}{{/|\\\\}}bin +CHECK-BINDIR2-NOT: error: +CHECK-BINDIR2-NOT: warning  RUN: llvm-config --includedir 2>&1 | FileCheck --check-prefix=CHECK-INCLUDEDIR %s  CHECK-INCLUDEDIR: {{.*}}{{/|\\}}include  CHECK-INCLUDEDIR-NOT: error:  CHECK-INCLUDEDIR-NOT: warning +RUN: llvm-config --includedir --quote-paths 2>&1 | FileCheck --check-prefix=CHECK-INCLUDEDIR2 %s +CHECK-INCLUDEDIR2: {{.*}}{{/|\\\\}}include +CHECK-INCLUDEDIR2-NOT: error: +CHECK-INCLUDEDIR2-NOT: warning  RUN: llvm-config --libdir 2>&1 | FileCheck --check-prefix=CHECK-LIBDIR %s  CHECK-LIBDIR: {{.*}}{{/|\\}}lib{{.*}}  CHECK-LIBDIR-NOT: error:  CHECK-LIBDIR-NOT: warning +RUN: llvm-config --libdir --quote-paths 2>&1 | FileCheck --check-prefix=CHECK-LIBDIR2 %s +CHECK-LIBDIR2: {{.*}}{{/|\\\\}}lib{{.*}} +CHECK-LIBDIR2-NOT: error: +CHECK-LIBDIR2-NOT: warning  RUN: llvm-config --cmakedir 2>&1 | FileCheck --check-prefix=CHECK-CMAKEDIR %s  CHECK-CMAKEDIR: {{.*}}{{/|\\}}cmake{{/|\\}}llvm  CHECK-CMAKEDIR-NOT: error:  CHECK-CMAKEDIR-NOT: warning +RUN: llvm-config --cmakedir --quote-paths 2>&1 | FileCheck --check-prefix=CHECK-CMAKEDIR2 %s +CHECK-CMAKEDIR2: {{.*}}{{/|\\\\}}cmake{{/|\\\\}}llvm +CHECK-CMAKEDIR2-NOT: error: +CHECK-CMAKEDIR2-NOT: warning  | 
