Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / SCCP / ipsccp-clear-returned.ll
blobe5bd5d5973ed3859785377d5300eeaa43d9b69e8
1 ; if IPSCCP determines a function returns undef,
2 ; then the "returned" attribute of input arguments
3 ; should be cleared.
5 ; RUN: opt < %s -passes=ipsccp -S | FileCheck %s
6 define i32 @main() {
7 ; CHECK-LABEL: @main
8 entry:
9 ; CHECK-NEXT: entry:
10   %call = call i32 @func_return_undef(i32 returned 1)
11 ; CHECK: call i32 @func_return_undef(i32 1)
12 ; CHECK-NOT: returned
13   ret i32 %call
14 ; CHECK: ret i32 1
17 define internal i32 @func_return_undef(i32 returned %arg) {
18 ; CHECK: {{define.*@func_return_undef}}
19 ; CHECK-NOT: returned
20 entry:
21 ; CHECK-NEXT: entry:
22 ; CHECK-NEXT: {{ret.*undef}}
23   ret i32 %arg
27 ; The only case that users of zapped functions are non-call site
28 ; users is that they are blockaddr users. Skip them because we
29 ; want to remove the returned attribute for call sites
31 ; CHECK: {{define.*@blockaddr_user}}
32 ; CHECK-NOT: returned
33 define internal i32 @blockaddr_user(i1 %c, i32 returned %d) {
34 entry:
35   br i1 %c, label %bb1, label %bb2
37 bb1:
38   br label %branch.block
40 bb2:
41   br label %branch.block
43 branch.block:
44   %addr = phi ptr [blockaddress(@blockaddr_user, %target1), %bb1], [blockaddress(@blockaddr_user, %target2), %bb2]
45   indirectbr ptr %addr, [label %target1, label %target2]
47 target1:
48   br label %target2
50 ; CHECK: ret i32 undef
51 target2:
52   ret i32 %d
55 define i32 @call_blockaddr_user(i1 %c) {
56 ; CHECK-LABEL: define i32 @call_blockaddr_user(
57 ; CHECK-NEXT: %r = call i32 @blockaddr_user(i1 %c
58 ; CHECK-NOT: returned
59 ; CHECK-NEXT: ret i32 10
60   %r = call i32 @blockaddr_user(i1 %c, i32 returned 10)
61   ret i32 %r