xref: /llvm-project/llvm/test/CodeGen/WebAssembly/simd-shift-in-loop.ll (revision 4b3ba64ba71c06b6bc9db347a66a7316f5edbcc4)
1291101aaSYolanda Chen; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2291101aaSYolanda Chen; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
3291101aaSYolanda Chen
4291101aaSYolanda Chen; Test that SIMD shifts can be lowered correctly even when shift
5291101aaSYolanda Chen; values are exported from outside blocks.
6291101aaSYolanda Chen
7291101aaSYolanda Chentarget triple = "wasm32-unknown-unknown"
8291101aaSYolanda Chen
9291101aaSYolanda Chendefine void @shl_loop(ptr %a, i8 %shift, i32 %count) {
10291101aaSYolanda Chen; CHECK-LABEL: shl_loop:
11291101aaSYolanda Chen; CHECK:         .functype shl_loop (i32, i32, i32) -> ()
12*4b3ba64bSNikita Popov; CHECK-NEXT:    .local i32
13291101aaSYolanda Chen; CHECK-NEXT:  # %bb.0: # %entry
14291101aaSYolanda Chen; CHECK-NEXT:  .LBB0_1: # %body
15291101aaSYolanda Chen; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
16291101aaSYolanda Chen; CHECK-NEXT:    loop # label0:
17291101aaSYolanda Chen; CHECK-NEXT:    local.get 0
18*4b3ba64bSNikita Popov; CHECK-NEXT:    i32.const 16
19*4b3ba64bSNikita Popov; CHECK-NEXT:    i32.add
20*4b3ba64bSNikita Popov; CHECK-NEXT:    local.tee 3
21291101aaSYolanda Chen; CHECK-NEXT:    local.get 0
22291101aaSYolanda Chen; CHECK-NEXT:    v128.load 0:p2align=0
23291101aaSYolanda Chen; CHECK-NEXT:    local.get 1
24291101aaSYolanda Chen; CHECK-NEXT:    i8x16.shl
25*4b3ba64bSNikita Popov; CHECK-NEXT:    v128.store 0
26*4b3ba64bSNikita Popov; CHECK-NEXT:    local.get 3
27291101aaSYolanda Chen; CHECK-NEXT:    local.set 0
28291101aaSYolanda Chen; CHECK-NEXT:    local.get 2
29291101aaSYolanda Chen; CHECK-NEXT:    i32.const -1
30291101aaSYolanda Chen; CHECK-NEXT:    i32.add
31291101aaSYolanda Chen; CHECK-NEXT:    local.tee 2
32291101aaSYolanda Chen; CHECK-NEXT:    i32.eqz
33291101aaSYolanda Chen; CHECK-NEXT:    br_if 0 # 0: up to label0
34291101aaSYolanda Chen; CHECK-NEXT:  # %bb.2: # %exit
35291101aaSYolanda Chen; CHECK-NEXT:    end_loop
36291101aaSYolanda Chen; CHECK-NEXT:    # fallthrough-return
37291101aaSYolanda Chenentry:
38291101aaSYolanda Chen %t1 = insertelement <16 x i8> undef, i8 %shift, i32 0
39291101aaSYolanda Chen %vshift = shufflevector <16 x i8> %t1, <16 x i8> undef, <16 x i32> zeroinitializer
40291101aaSYolanda Chen br label %body
41291101aaSYolanda Chenbody:
42291101aaSYolanda Chen %out = phi ptr [%a, %entry], [%b, %body]
43291101aaSYolanda Chen %i = phi i32 [0, %entry], [%next, %body]
44291101aaSYolanda Chen %v = load <16 x i8>, ptr %out, align 1
45291101aaSYolanda Chen %r = shl <16 x i8> %v, %vshift
46291101aaSYolanda Chen %b = getelementptr inbounds i8, ptr %out, i32 16
47291101aaSYolanda Chen store <16 x i8> %r, ptr %b
48291101aaSYolanda Chen %next = add i32 %i, 1
49291101aaSYolanda Chen %i.cmp = icmp eq i32 %next, %count
50291101aaSYolanda Chen br i1 %i.cmp, label %body, label %exit
51291101aaSYolanda Chenexit:
52291101aaSYolanda Chen ret void
53291101aaSYolanda Chen}
54291101aaSYolanda Chen
55291101aaSYolanda Chen; Test that SIMD shifts can be lowered correctly when shift value
56291101aaSYolanda Chen; is a phi inside loop body.
57291101aaSYolanda Chen
58291101aaSYolanda Chendefine void @shl_phi_loop(ptr %a, i8 %shift, i32 %count) {
59291101aaSYolanda Chen; CHECK-LABEL: shl_phi_loop:
60291101aaSYolanda Chen; CHECK:         .functype shl_phi_loop (i32, i32, i32) -> ()
61*4b3ba64bSNikita Popov; CHECK-NEXT:    .local i32
62291101aaSYolanda Chen; CHECK-NEXT:  # %bb.0: # %entry
63291101aaSYolanda Chen; CHECK-NEXT:  .LBB1_1: # %body
64291101aaSYolanda Chen; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
65291101aaSYolanda Chen; CHECK-NEXT:    loop # label1:
66291101aaSYolanda Chen; CHECK-NEXT:    local.get 0
67*4b3ba64bSNikita Popov; CHECK-NEXT:    i32.const 16
68*4b3ba64bSNikita Popov; CHECK-NEXT:    i32.add
69*4b3ba64bSNikita Popov; CHECK-NEXT:    local.tee 3
70291101aaSYolanda Chen; CHECK-NEXT:    local.get 0
71291101aaSYolanda Chen; CHECK-NEXT:    v128.load 0:p2align=0
72291101aaSYolanda Chen; CHECK-NEXT:    local.get 1
73291101aaSYolanda Chen; CHECK-NEXT:    i8x16.shl
74*4b3ba64bSNikita Popov; CHECK-NEXT:    v128.store 0
75291101aaSYolanda Chen; CHECK-NEXT:    local.get 1
76291101aaSYolanda Chen; CHECK-NEXT:    i32.const 1
77291101aaSYolanda Chen; CHECK-NEXT:    i32.and
78291101aaSYolanda Chen; CHECK-NEXT:    local.set 1
79*4b3ba64bSNikita Popov; CHECK-NEXT:    local.get 3
80291101aaSYolanda Chen; CHECK-NEXT:    local.set 0
81291101aaSYolanda Chen; CHECK-NEXT:    local.get 2
82291101aaSYolanda Chen; CHECK-NEXT:    i32.const -1
83291101aaSYolanda Chen; CHECK-NEXT:    i32.add
84291101aaSYolanda Chen; CHECK-NEXT:    local.tee 2
85291101aaSYolanda Chen; CHECK-NEXT:    i32.eqz
86291101aaSYolanda Chen; CHECK-NEXT:    br_if 0 # 0: up to label1
87291101aaSYolanda Chen; CHECK-NEXT:  # %bb.2: # %exit
88291101aaSYolanda Chen; CHECK-NEXT:    end_loop
89291101aaSYolanda Chen; CHECK-NEXT:    # fallthrough-return
90291101aaSYolanda Chenentry:
91291101aaSYolanda Chen br label %body
92291101aaSYolanda Chenbody:
93291101aaSYolanda Chen %out = phi ptr [%a, %entry], [%b, %body]
94291101aaSYolanda Chen %i = phi i32 [0, %entry], [%next, %body]
95291101aaSYolanda Chen %t1 = phi i8 [%shift, %entry], [%sand, %body]
96291101aaSYolanda Chen %t2 = insertelement <16 x i8> undef, i8 %t1, i32 0
97291101aaSYolanda Chen %vshift = shufflevector <16 x i8> %t2, <16 x i8> undef, <16 x i32> zeroinitializer
98291101aaSYolanda Chen %v = load <16 x i8>, ptr %out, align 1
99291101aaSYolanda Chen %r = shl <16 x i8> %v, %vshift
100291101aaSYolanda Chen %b = getelementptr inbounds i8, ptr %out, i32 16
101291101aaSYolanda Chen store <16 x i8> %r, ptr %b
102291101aaSYolanda Chen %sand = and i8 %t1, 1
103291101aaSYolanda Chen %next = add i32 %i, 1
104291101aaSYolanda Chen %i.cmp = icmp eq i32 %next, %count
105291101aaSYolanda Chen br i1 %i.cmp, label %body, label %exit
106291101aaSYolanda Chenexit:
107291101aaSYolanda Chen ret void
108291101aaSYolanda Chen}
109