File: pr61923.ll

package info (click to toggle)
llvm-toolchain-17 1%3A17.0.6-22
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,799,624 kB
  • sloc: cpp: 6,428,607; ansic: 1,383,196; asm: 793,408; python: 223,504; objc: 75,364; f90: 60,502; lisp: 33,869; pascal: 15,282; sh: 9,684; perl: 7,453; ml: 4,937; awk: 3,523; makefile: 2,889; javascript: 2,149; xml: 888; fortran: 619; cs: 573
file content (63 lines) | stat: -rw-r--r-- 2,783 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc -mtriple=x86_64-unknown-linux-gnu  -mattr=+avx < %s -o - | FileCheck %s

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Regressed test from https://github.com/llvm/llvm-project/issues/61923
define void @test_loop(ptr align 1 %src, ptr align 1 %dest, i32 %len) {
; CHECK-LABEL: test_loop:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    cmpl $32, %edx
; CHECK-NEXT:    jb .LBB0_4
; CHECK-NEXT:  # %bb.1: # %memcmp.loop.preheader
; CHECK-NEXT:    movl %edx, %eax
; CHECK-NEXT:    andl $-32, %eax
; CHECK-NEXT:    xorl %ecx, %ecx
; CHECK-NEXT:    .p2align 4, 0x90
; CHECK-NEXT:  .LBB0_2: # %memcmp.loop
; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    vmovups (%rsi,%rcx), %ymm0
; CHECK-NEXT:    vxorps (%rdi,%rcx), %ymm0, %ymm0
; CHECK-NEXT:    vptest %ymm0, %ymm0
; CHECK-NEXT:    jne .LBB0_4
; CHECK-NEXT:  # %bb.3: # %memcmp.loop.latch
; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
; CHECK-NEXT:    addq $32, %rcx
; CHECK-NEXT:    cmpq %rax, %rcx
; CHECK-NEXT:    jb .LBB0_2
; CHECK-NEXT:  .LBB0_4: # %done
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
entry:
  %len.wide = zext i32 %len to i64
  %elements.len = lshr i64 %len.wide, 0
  %loop.entry.cond = icmp uge i64 %elements.len, 32
  br i1 %loop.entry.cond, label %memcmp.loop.preheader, label %done

memcmp.loop.preheader:                            ; preds = %entry
  %memcmp.loop.iters = lshr i64 %elements.len, 5
  %memcmp.loop.elements = shl i64 %memcmp.loop.iters, 5
  br label %memcmp.loop

memcmp.loop:                                      ; preds = %memcmp.loop.latch, %memcmp.loop.preheader
  %vector.index = phi i64 [ 0, %memcmp.loop.preheader ], [ %vector.index.next, %memcmp.loop.latch ]
  %left.vector_start_ptr = getelementptr inbounds i8, ptr %dest, i64 %vector.index
  %right.vector_start_ptr = getelementptr inbounds i8, ptr %src, i64 %vector.index
  %left.vector = load <32 x i8>, ptr %left.vector_start_ptr, align 1
  %right.vector = load <32 x i8>, ptr %right.vector_start_ptr, align 1
  %vec.cmp = icmp eq <32 x i8> %left.vector, %right.vector
  %vec.cmp.reduced = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %vec.cmp)
  br i1 %vec.cmp.reduced, label %memcmp.loop.latch, label %done

memcmp.loop.latch:                                ; preds = %memcmp.loop
  %vector.index.next = add i64 %vector.index, 32
  %loop.continue = icmp ult i64 %vector.index.next, %memcmp.loop.elements
  br i1 %loop.continue, label %memcmp.loop, label %done

done:
  ret void
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i1 @llvm.vector.reduce.and.v32i1(<32 x i1>) #2