diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-06-30 21:21:40 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-06-30 21:21:40 +0000 |
| commit | 9eb75c45204781886c8d598a1bc9b5c37f3cb037 (patch) | |
| tree | a3fdf0875ee6a0e9fbfb02dd8e548fb40493a5b5 /llvm/test | |
| parent | 2fb1075f140b77927c9c30e9c2beee8f86efe1cc (diff) | |
| download | bcm5719-llvm-9eb75c45204781886c8d598a1bc9b5c37f3cb037.tar.gz bcm5719-llvm-9eb75c45204781886c8d598a1bc9b5c37f3cb037.zip | |
[Hexagon] Implement frame pointer elimination with -fomit-frame-pointer
It applies to leaf functions that are otherwise not required to have
a frame pointer.
llvm-svn: 306888
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/CodeGen/Hexagon/fpelim-basic.ll | 91 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Hexagon/frame.ll | 23 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Hexagon/newvaluejump2.ll | 2 |
3 files changed, 92 insertions, 24 deletions
diff --git a/llvm/test/CodeGen/Hexagon/fpelim-basic.ll b/llvm/test/CodeGen/Hexagon/fpelim-basic.ll new file mode 100644 index 00000000000..ffec07f7dbf --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/fpelim-basic.ll @@ -0,0 +1,91 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s + +target triple = "hexagon" + +; FP elimination enabled. +; +; CHECK-LABEL: danny: +; CHECK: r29 = add(r29,#-[[SIZE:[0-9]+]]) +; CHECK: r29 = add(r29,#[[SIZE]]) +define i32 @danny(i32 %a0, i32 %a1) local_unnamed_addr #0 { +b2: + %v3 = alloca [32 x i32], align 8 + %v4 = bitcast [32 x i32]* %v3 to i8* + call void @llvm.lifetime.start.p0i8(i64 128, i8* nonnull %v4) #3 + br label %b5 + +b5: ; preds = %b5, %b2 + %v6 = phi i32 [ 0, %b2 ], [ %v8, %b5 ] + %v7 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %v6 + store i32 %v6, i32* %v7, align 4 + %v8 = add nuw nsw i32 %v6, 1 + %v9 = icmp eq i32 %v8, 32 + br i1 %v9, label %b10, label %b5 + +b10: ; preds = %b5 + %v11 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %a0 + store i32 %a1, i32* %v11, align 4 + br label %b12 + +b12: ; preds = %b12, %b10 + %v13 = phi i32 [ 0, %b10 ], [ %v18, %b12 ] + %v14 = phi i32 [ 0, %b10 ], [ %v17, %b12 ] + %v15 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %v13 + %v16 = load i32, i32* %v15, align 4 + %v17 = add nsw i32 %v16, %v14 + %v18 = add nuw nsw i32 %v13, 1 + %v19 = icmp eq i32 %v18, 32 + br i1 %v19, label %b20, label %b12 + +b20: ; preds = %b12 + call void @llvm.lifetime.end.p0i8(i64 128, i8* nonnull %v4) #3 + ret i32 %v17 +} + +; FP elimination disabled. +; +; CHECK-LABEL: sammy: +; CHECK: allocframe +; CHECK: dealloc_return +define i32 @sammy(i32 %a0, i32 %a1) local_unnamed_addr #1 { +b2: + %v3 = alloca [32 x i32], align 8 + %v4 = bitcast [32 x i32]* %v3 to i8* + call void @llvm.lifetime.start.p0i8(i64 128, i8* nonnull %v4) #3 + br label %b5 + +b5: ; preds = %b5, %b2 + %v6 = phi i32 [ 0, %b2 ], [ %v8, %b5 ] + %v7 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %v6 + store i32 %v6, i32* %v7, align 4 + %v8 = add nuw nsw i32 %v6, 1 + %v9 = icmp eq i32 %v8, 32 + br i1 %v9, label %b10, label %b5 + +b10: ; preds = %b5 + %v11 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %a0 + store i32 %a1, i32* %v11, align 4 + br label %b12 + +b12: ; preds = %b12, %b10 + %v13 = phi i32 [ 0, %b10 ], [ %v18, %b12 ] + %v14 = phi i32 [ 0, %b10 ], [ %v17, %b12 ] + %v15 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %v13 + %v16 = load i32, i32* %v15, align 4 + %v17 = add nsw i32 %v16, %v14 + %v18 = add nuw nsw i32 %v13, 1 + %v19 = icmp eq i32 %v18, 32 + br i1 %v19, label %b20, label %b12 + +b20: ; preds = %b12 + call void @llvm.lifetime.end.p0i8(i64 128, i8* nonnull %v4) #3 + ret i32 %v17 +} + +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #2 +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #2 + +attributes #0 = { nounwind readnone "no-frame-pointer-elim"="false" "target-cpu"="hexagonv60" } +attributes #1 = { nounwind readnone "no-frame-pointer-elim"="true" "target-cpu"="hexagonv60" } +attributes #2 = { argmemonly nounwind } +attributes #3 = { nounwind } diff --git a/llvm/test/CodeGen/Hexagon/frame.ll b/llvm/test/CodeGen/Hexagon/frame.ll deleted file mode 100644 index e87acb8cd79..00000000000 --- a/llvm/test/CodeGen/Hexagon/frame.ll +++ /dev/null @@ -1,23 +0,0 @@ -; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s - -@num = external global i32 -@acc = external global i32 -@num2 = external global i32 - -; CHECK: allocframe -; CHECK: dealloc_return - -define i32 @foo() nounwind { -entry: - %i = alloca i32, align 4 - %0 = load i32, i32* @num, align 4 - store i32 %0, i32* %i, align 4 - %1 = load i32, i32* %i, align 4 - %2 = load i32, i32* @acc, align 4 - %mul = mul nsw i32 %1, %2 - %3 = load i32, i32* @num2, align 4 - %add = add nsw i32 %mul, %3 - store i32 %add, i32* %i, align 4 - %4 = load i32, i32* %i, align 4 - ret i32 %4 -} diff --git a/llvm/test/CodeGen/Hexagon/newvaluejump2.ll b/llvm/test/CodeGen/Hexagon/newvaluejump2.ll index 4c897f0830f..fbc3f2925d1 100644 --- a/llvm/test/CodeGen/Hexagon/newvaluejump2.ll +++ b/llvm/test/CodeGen/Hexagon/newvaluejump2.ll @@ -6,7 +6,7 @@ @Reg = common global i32 0, align 4 define i32 @main() nounwind { entry: -; CHECK: if (cmp.gt(r{{[0-9]+}},r{{[0-9]+}}.new)) jump:{{[t|nt]}} .LBB{{[0-9]+}}_{{[0-9]+}} +; CHECK: if (cmp.gt(r{{[0-9]+}}.new,r{{[0-9]+}})) jump:{{[t|nt]}} .LBB{{[0-9]+}}_{{[0-9]+}} %Reg2 = alloca i32, align 4 %0 = load i32, i32* %Reg2, align 4 %1 = load i32, i32* @Reg, align 4 |

