xref: /llvm-project/llvm/test/Transforms/Attributor/ArgumentPromotion/alloca-as.ll (revision cd3a4c31bc9694d160de54c6a4daa53e152cb463)
1e39b4193SJohannes Doerfert; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
223dafbb1SJohannes Doerfert; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal  -attributor-annotate-decl-cs  -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT
3846709b2SNikita Popov; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC
4e39b4193SJohannes Doerfert
5e39b4193SJohannes Doerferttarget datalayout = "A7"
6e39b4193SJohannes Doerfert
7e39b4193SJohannes Doerfert; Make sure we create allocas in AS 7 and cast them properly.
8e39b4193SJohannes Doerfert
9e39b4193SJohannes Doerfertdefine i32 @bar(i32 %arg) {
10846709b2SNikita Popov; TUNIT-LABEL: define {{[^@]+}}@bar
11846709b2SNikita Popov; TUNIT-SAME: (i32 [[ARG:%.*]]) {
12846709b2SNikita Popov; TUNIT-NEXT:  entry:
13846709b2SNikita Popov; TUNIT-NEXT:    [[STACK:%.*]] = alloca i32, align 4
144f4787e3SNikita Popov; TUNIT-NEXT:    store i32 [[ARG]], ptr [[STACK]], align 4
154f4787e3SNikita Popov; TUNIT-NEXT:    [[TMP0:%.*]] = load i32, ptr [[STACK]], align 4
16846709b2SNikita Popov; TUNIT-NEXT:    [[CALL:%.*]] = call i32 @foo(i32 [[TMP0]])
17846709b2SNikita Popov; TUNIT-NEXT:    ret i32 [[CALL]]
18af30de77SJohannes Doerfert;
19846709b2SNikita Popov; CGSCC-LABEL: define {{[^@]+}}@bar
20846709b2SNikita Popov; CGSCC-SAME: (i32 [[ARG:%.*]]) {
21846709b2SNikita Popov; CGSCC-NEXT:  entry:
22846709b2SNikita Popov; CGSCC-NEXT:    [[STACK:%.*]] = alloca i32, align 4
234f4787e3SNikita Popov; CGSCC-NEXT:    store i32 [[ARG]], ptr [[STACK]], align 4
24846709b2SNikita Popov; CGSCC-NEXT:    [[CALL:%.*]] = call i32 @foo(i32 [[ARG]])
25846709b2SNikita Popov; CGSCC-NEXT:    ret i32 [[CALL]]
2639a68cc0SJohannes Doerfert;
27e39b4193SJohannes Doerfertentry:
28e39b4193SJohannes Doerfert  %stack = alloca i32
294f4787e3SNikita Popov  store i32 %arg, ptr %stack
304f4787e3SNikita Popov  %call = call i32 @foo(ptr %stack)
31e39b4193SJohannes Doerfert  ret i32 %call
32e39b4193SJohannes Doerfert}
33e39b4193SJohannes Doerfert
344f4787e3SNikita Popovdefine internal i32 @foo(ptr %arg) {
35ae6ad317SJohannes Doerfert; CHECK: Function Attrs: memory(readwrite, argmem: none)
36846709b2SNikita Popov; CHECK-LABEL: define {{[^@]+}}@foo
37ae6ad317SJohannes Doerfert; CHECK-SAME: (i32 [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
38846709b2SNikita Popov; CHECK-NEXT:  entry:
39846709b2SNikita Popov; CHECK-NEXT:    [[ARG_PRIV:%.*]] = alloca i32, align 4, addrspace(7)
404f4787e3SNikita Popov; CHECK-NEXT:    store i32 [[TMP0]], ptr addrspace(7) [[ARG_PRIV]], align 4
414f4787e3SNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr addrspace(7) [[ARG_PRIV]] to ptr
424f4787e3SNikita Popov; CHECK-NEXT:    [[L:%.*]] = load i32, ptr [[TMP1]], align 4
43846709b2SNikita Popov; CHECK-NEXT:    call void @use(i32 [[L]])
44846709b2SNikita Popov; CHECK-NEXT:    ret i32 [[L]]
45e39b4193SJohannes Doerfert;
46e39b4193SJohannes Doerfertentry:
474f4787e3SNikita Popov  %l = load i32, ptr %arg
48e39b4193SJohannes Doerfert  call void @use(i32 %l)
49e39b4193SJohannes Doerfert  ret i32 %l
50e39b4193SJohannes Doerfert}
51e39b4193SJohannes Doerfert
52e39b4193SJohannes Doerfertdeclare void @use(i32)
53ae6ad317SJohannes Doerfert;.
54*cd3a4c31SJohannes Doerfert; TUNIT: attributes #[[ATTR0]] = { memory(readwrite, argmem: none) }
55*cd3a4c31SJohannes Doerfert;.
56*cd3a4c31SJohannes Doerfert; CGSCC: attributes #[[ATTR0]] = { memory(readwrite, argmem: none) }
57ae6ad317SJohannes Doerfert;.
58