Compiler projects using llvm
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx | FileCheck %s

; Make sure that we do not infinitely-loop combining shuffle vectors.

@test24_id5239 = dso_local local_unnamed_addr global i64 0, align 8
define void @infiloop() {
; CHECK-LABEL: infiloop:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    pushq %rbp
; CHECK-NEXT:    .cfi_def_cfa_offset 16
; CHECK-NEXT:    .cfi_offset %rbp, -16
; CHECK-NEXT:    movq %rsp, %rbp
; CHECK-NEXT:    .cfi_def_cfa_register %rbp
; CHECK-NEXT:    andq $-32, %rsp
; CHECK-NEXT:    subq $64, %rsp
; CHECK-NEXT:    movabsq $506097522914230528, %rax # imm = 0x706050403020100
; CHECK-NEXT:    movq %rax, test24_id5239(%rip)
; CHECK-NEXT:    vmovaps {{.*#+}} ymm0 = [4,1,6,7,6,7,2,3,6,7,4,5,6,7,2,3,6,7,2,3,2,3,2,3,4,5,4,5,2,3,0,1]
; CHECK-NEXT:    vmovaps %ymm0, (%rsp)
; CHECK-NEXT:    movq %rbp, %rsp
; CHECK-NEXT:    popq %rbp
; CHECK-NEXT:    .cfi_def_cfa %rsp, 8
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
entry:
  %id5230 = alloca <32 x i8>, align 32
  store i8 0, ptr @test24_id5239, align 8
  store i8 1, ptr getelementptr inbounds (i8, ptr @test24_id5239, i64 1), align 1
  store i8 2, ptr getelementptr inbounds (i8, ptr @test24_id5239, i64 2), align 2
  store i8 3, ptr getelementptr inbounds (i8, ptr @test24_id5239, i64 3), align 1
  store i8 4, ptr getelementptr inbounds (i8, ptr @test24_id5239, i64 4), align 4
  store i8 5, ptr getelementptr inbounds (i8, ptr @test24_id5239, i64 5), align 1
  store i8 6, ptr getelementptr inbounds (i8, ptr @test24_id5239, i64 6), align 2
  store i8 7, ptr getelementptr inbounds (i8, ptr @test24_id5239, i64 7), align 1
  %0 = load <4 x i16>, ptr @test24_id5239, align 8
  %shuffle = shufflevector <4 x i16> %0, <4 x i16> poison, <16 x i32> <i32 0, i32 3, i32 3, i32 1, i32 3, i32 2, i32 3, i32 1, i32 3, i32 1, i32 1, i32 1, i32 2, i32 2, i32 1, i32 0>
  %1 = bitcast <16 x i16> %shuffle to <32 x i8>
  %2 = or <32 x i8> %1, <i8 4, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>
  store volatile <32 x i8> %2, ptr %id5230, align 32
  ret void
}