Index: tests_lit/llvm2ice_tests/returns_twice_no_coalesce.ll |
diff --git a/tests_lit/llvm2ice_tests/returns_twice_no_coalesce.ll b/tests_lit/llvm2ice_tests/returns_twice_no_coalesce.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..754a105b01591191e3a267314e3f31a5bacf1722 |
--- /dev/null |
+++ b/tests_lit/llvm2ice_tests/returns_twice_no_coalesce.ll |
@@ -0,0 +1,60 @@ |
+; This file checks that SimpleCoalescing of local stack slots is not done |
+; when calling a function with the "returns twice" attribute. |
+ |
+; RUN: %llvm2ice -Om1 --verbose none %s \ |
+; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \ |
+; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s |
+; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s |
+ |
+; Setjmp is a function with the "returns twice" attribute. |
+declare i32 @llvm.nacl.setjmp(i8*) |
+ |
+declare i32 @other(i32) |
+declare void @user(i32) |
+ |
+define i32 @call_returns_twice(i32 %iptr_jmpbuf, i32 %x) { |
+entry: |
+ %local = add i32 %x, 12345 |
+ %jmpbuf = inttoptr i32 %iptr_jmpbuf to i8* |
+ %y = call i32 @llvm.nacl.setjmp(i8* %jmpbuf) |
+ call void @user(i32 %local) |
+ %cmp = icmp eq i32 %y, 0 |
+ br i1 %cmp, label %Zero, label %NonZero |
+Zero: |
+ %other_local = add i32 %x, 54321 |
+ call void @user(i32 %other_local) |
+ ret i32 %other_local |
+NonZero: |
+ ret i32 1 |
+} |
+ |
+; CHECK-LABEL: call_returns_twice |
+; CHECK: add [[REG1:.*]], 12345 |
+; CHECK: mov dword ptr [esp + [[OFF:.*]]], [[REG1]] |
+; CHECK: add [[REG2:.*]], 54321 |
+; There should not be sharing of the stack slot. |
+; CHECK-NOT: mov dword ptr [esp + [[OFF]]], [[REG2]] |
+ |
+define i32 @no_call_returns_twice(i32 %iptr_jmpbuf, i32 %x) { |
+entry: |
+ %local = add i32 %x, 12345 |
+ %y = call i32 @other(i32 %x) |
+ call void @user(i32 %local) |
+ %cmp = icmp eq i32 %y, 0 |
+ br i1 %cmp, label %Zero, label %NonZero |
+Zero: |
+ %other_local = add i32 %x, 54321 |
+ call void @user(i32 %other_local) |
+ ret i32 %other_local |
+NonZero: |
+ ret i32 1 |
+} |
+ |
+; CHECK-LABEL: no_call_returns_twice |
+; CHECK: add [[REG1:.*]], 12345 |
+; CHECK: mov dword ptr [esp + [[OFF:.*]]], [[REG1]] |
+; CHECK: add [[REG2:.*]], 54321 |
+; Now there should be sharing of the stack slot (OFF is the same). |
+; CHECK: mov dword ptr [esp + [[OFF]]], [[REG2]] |
+ |
+; ERRORS-NOT: ICE translation error |