[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / Transforms / HardwareLoops / ARM / calls-codegen.ll
blob85160ced319e0399bf2fb65dc4a569ccb5c8f4f8
1 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+lob,+mve.fp -disable-arm-loloops=false %s -o - | FileCheck %s
3 ; CHECK-LABEL: test_target_specific:
4 ; CHECK:        mov.w lr, #50
5 ; CHECK:        dls lr, lr
6 ; CHECK-NOT:    mov lr,
7 ; CHECK:      [[LOOP_HEADER:\.LBB[0-9_]+]]:
8 ; CHECK:        le lr, [[LOOP_HEADER]]
9 ; CHECK-NOT:    b .
10 ; CHECK:      @ %exit
12 define i32 @test_target_specific(i32* %a, i32* %b) {
13 entry:
14   br label %loop
15 loop:
16   %acc = phi i32 [ 0, %entry ], [ %res, %loop ]
17   %count = phi i32 [ 0, %entry ], [ %count.next, %loop ]
18   %addr.a = getelementptr i32, i32* %a, i32 %count
19   %addr.b = getelementptr i32, i32* %b, i32 %count
20   %load.a = load i32, i32* %addr.a
21   %load.b = load i32, i32* %addr.b
22   %res = call i32 @llvm.arm.smlad(i32 %load.a, i32 %load.b, i32 %acc)
23   %count.next = add nuw i32 %count, 2
24   %cmp = icmp ne i32 %count.next, 100
25   br i1 %cmp, label %loop, label %exit
26 exit:
27   ret i32 %res
30 ; CHECK-LABEL: test_fabs:
31 ; CHECK:        mov.w lr, #100
32 ; CHECK:        dls lr, lr
33 ; CHECK-NOT:    mov lr,
34 ; CHECK:      [[LOOP_HEADER:\.LBB[0-9_]+]]:
35 ; CHECK-NOT:    bl
36 ; CHECK:        le lr, [[LOOP_HEADER]]
37 ; CHECK-NOT:    b .
38 ; CHECK:      @ %exit
40 define float @test_fabs(float* %a) {
41 entry:
42   br label %loop
43 loop:
44   %acc = phi float [ 0.0, %entry ], [ %res, %loop ]
45   %count = phi i32 [ 0, %entry ], [ %count.next, %loop ]
46   %addr.a = getelementptr float, float* %a, i32 %count
47   %load.a = load float, float* %addr.a
48   %abs = call float @llvm.fabs.f32(float %load.a)
49   %res = fadd float %abs, %acc
50   %count.next = add nuw i32 %count, 1
51   %cmp = icmp ne i32 %count.next, 100
52   br i1 %cmp, label %loop, label %exit
53 exit:
54   ret float %res
57 declare i32 @llvm.arm.smlad(i32, i32, i32)
58 declare float @llvm.fabs.f32(float)