xref: /llvm-project/llvm/test/Transforms/HardwareLoops/ARM/calls-codegen.ll (revision d17f4f267d9b084d9cacaf7e2f135dab370cd6fe)
1eecba950SDavid Green; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+lob,+mve.fp -disable-arm-loloops=true %s -o - | FileCheck %s --check-prefix=DISABLED
2eecba950SDavid Green; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+lob,+mve.fp %s -o - | FileCheck %s
3e3a4a13fSSam Parker
4e3a4a13fSSam Parker; DISABLED-NOT: dls lr,
5152dd3b8SDavid Green
6152dd3b8SDavid Green; CHECK-LABEL: test_target_specific:
773a6cd4bSDavid Green; CHECK:        mov.w lr, #50
848230355SDavid Green; CHECK-NOT:    dls lr, lr
9152dd3b8SDavid Green; CHECK-NOT:    mov lr,
10152dd3b8SDavid Green; CHECK:      [[LOOP_HEADER:\.LBB[0-9_]+]]:
11152dd3b8SDavid Green; CHECK:        le lr, [[LOOP_HEADER]]
12152dd3b8SDavid Green; CHECK-NOT:    b .
13152dd3b8SDavid Green; CHECK:      @ %exit
14152dd3b8SDavid Green
15*d17f4f26SMatt Arsenaultdefine i32 @test_target_specific(ptr %a, ptr %b) {
16152dd3b8SDavid Greenentry:
17152dd3b8SDavid Green  br label %loop
18152dd3b8SDavid Greenloop:
19152dd3b8SDavid Green  %acc = phi i32 [ 0, %entry ], [ %res, %loop ]
20152dd3b8SDavid Green  %count = phi i32 [ 0, %entry ], [ %count.next, %loop ]
21*d17f4f26SMatt Arsenault  %addr.a = getelementptr i32, ptr %a, i32 %count
22*d17f4f26SMatt Arsenault  %addr.b = getelementptr i32, ptr %b, i32 %count
23*d17f4f26SMatt Arsenault  %load.a = load i32, ptr %addr.a
24*d17f4f26SMatt Arsenault  %load.b = load i32, ptr %addr.b
25152dd3b8SDavid Green  %res = call i32 @llvm.arm.smlad(i32 %load.a, i32 %load.b, i32 %acc)
26152dd3b8SDavid Green  %count.next = add nuw i32 %count, 2
27152dd3b8SDavid Green  %cmp = icmp ne i32 %count.next, 100
28152dd3b8SDavid Green  br i1 %cmp, label %loop, label %exit
29152dd3b8SDavid Greenexit:
30152dd3b8SDavid Green  ret i32 %res
31152dd3b8SDavid Green}
32152dd3b8SDavid Green
33152dd3b8SDavid Green; CHECK-LABEL: test_fabs:
3473a6cd4bSDavid Green; CHECK:        mov.w lr, #100
3548230355SDavid Green; CHECK-NOT:    dls lr, lr
36152dd3b8SDavid Green; CHECK-NOT:    mov lr,
37152dd3b8SDavid Green; CHECK:      [[LOOP_HEADER:\.LBB[0-9_]+]]:
38152dd3b8SDavid Green; CHECK-NOT:    bl
39152dd3b8SDavid Green; CHECK:        le lr, [[LOOP_HEADER]]
40152dd3b8SDavid Green; CHECK-NOT:    b .
41152dd3b8SDavid Green; CHECK:      @ %exit
42152dd3b8SDavid Green
43*d17f4f26SMatt Arsenaultdefine float @test_fabs(ptr %a) {
44152dd3b8SDavid Greenentry:
45152dd3b8SDavid Green  br label %loop
46152dd3b8SDavid Greenloop:
47152dd3b8SDavid Green  %acc = phi float [ 0.0, %entry ], [ %res, %loop ]
48152dd3b8SDavid Green  %count = phi i32 [ 0, %entry ], [ %count.next, %loop ]
49*d17f4f26SMatt Arsenault  %addr.a = getelementptr float, ptr %a, i32 %count
50*d17f4f26SMatt Arsenault  %load.a = load float, ptr %addr.a
51152dd3b8SDavid Green  %abs = call float @llvm.fabs.f32(float %load.a)
52152dd3b8SDavid Green  %res = fadd float %abs, %acc
53152dd3b8SDavid Green  %count.next = add nuw i32 %count, 1
54152dd3b8SDavid Green  %cmp = icmp ne i32 %count.next, 100
55152dd3b8SDavid Green  br i1 %cmp, label %loop, label %exit
56152dd3b8SDavid Greenexit:
57152dd3b8SDavid Green  ret float %res
58152dd3b8SDavid Green}
59152dd3b8SDavid Green
60152dd3b8SDavid Greendeclare i32 @llvm.arm.smlad(i32, i32, i32)
61152dd3b8SDavid Greendeclare float @llvm.fabs.f32(float)
62