blob: f764a59dd8a2f88695c12a4477fb6c9aeb90fd85 [file] [log] [blame]
Nikita Popovb74c6d22020-03-25 23:35:19 +01001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
Simon Pilgrimad27f542020-11-08 13:30:18 +00002; RUN: opt -S -O2 -preserve-alignment-assumptions-during-inlining=0 < %s | FileCheck %s --check-prefixes=CHECK,ASSUMPTIONS-OFF
3; RUN: opt -S -O2 -preserve-alignment-assumptions-during-inlining=1 < %s | FileCheck %s --check-prefixes=CHECK,ASSUMPTIONS-ON
4; RUN: opt -S -O2 < %s | FileCheck %s --check-prefixes=CHECK,ASSUMPTIONS-OFF
Nikita Popovb74c6d22020-03-25 23:35:19 +01005
6target datalayout = "e-p:64:64-p5:32:32-A5"
7
8; This illustrates an optimization difference caused by instruction counting
9; heuristics, which are affected by the additional instructions of the
10; alignment assumption.
11
12define internal i1 @callee1(i1 %c, i64* align 8 %ptr) {
13 store volatile i64 0, i64* %ptr
14 ret i1 %c
15}
16
17define void @caller1(i1 %c, i64* align 1 %ptr) {
18; ASSUMPTIONS-OFF-LABEL: @caller1(
Roman Lebedev9c4c2f242021-06-24 13:15:39 +030019; ASSUMPTIONS-OFF-NEXT: br i1 [[C:%.*]], label [[COMMON_RET:%.*]], label [[FALSE2:%.*]]
20; ASSUMPTIONS-OFF: common.ret:
21; ASSUMPTIONS-OFF-NEXT: [[DOTSINK:%.*]] = phi i64 [ 3, [[FALSE2]] ], [ 2, [[TMP0:%.*]] ]
Nikita Popovb74c6d22020-03-25 23:35:19 +010022; ASSUMPTIONS-OFF-NEXT: store volatile i64 0, i64* [[PTR:%.*]], align 8
23; ASSUMPTIONS-OFF-NEXT: store volatile i64 -1, i64* [[PTR]], align 4
24; ASSUMPTIONS-OFF-NEXT: store volatile i64 -1, i64* [[PTR]], align 4
25; ASSUMPTIONS-OFF-NEXT: store volatile i64 -1, i64* [[PTR]], align 4
26; ASSUMPTIONS-OFF-NEXT: store volatile i64 -1, i64* [[PTR]], align 4
27; ASSUMPTIONS-OFF-NEXT: store volatile i64 -1, i64* [[PTR]], align 4
Roman Lebedev9c4c2f242021-06-24 13:15:39 +030028; ASSUMPTIONS-OFF-NEXT: store volatile i64 [[DOTSINK]], i64* [[PTR]], align 4
Nikita Popovb74c6d22020-03-25 23:35:19 +010029; ASSUMPTIONS-OFF-NEXT: ret void
30; ASSUMPTIONS-OFF: false2:
31; ASSUMPTIONS-OFF-NEXT: store volatile i64 1, i64* [[PTR]], align 4
Roman Lebedev9c4c2f242021-06-24 13:15:39 +030032; ASSUMPTIONS-OFF-NEXT: br label [[COMMON_RET]]
Nikita Popovb74c6d22020-03-25 23:35:19 +010033;
34; ASSUMPTIONS-ON-LABEL: @caller1(
Hans Wennborg1e9afab2021-09-24 18:44:20 +020035; ASSUMPTIONS-ON-NEXT: br i1 [[C:%.*]], label [[COMMON_RET:%.*]], label [[FALSE2:%.*]]
Roman Lebedev9c4c2f242021-06-24 13:15:39 +030036; ASSUMPTIONS-ON: common.ret:
Hans Wennborg1e9afab2021-09-24 18:44:20 +020037; ASSUMPTIONS-ON-NEXT: [[DOTSINK:%.*]] = phi i64 [ 3, [[FALSE2]] ], [ 2, [[TMP0:%.*]] ]
38; ASSUMPTIONS-ON-NEXT: call void @llvm.assume(i1 true) [ "align"(i64* [[PTR:%.*]], i64 8) ]
Nikita Popovb74c6d22020-03-25 23:35:19 +010039; ASSUMPTIONS-ON-NEXT: store volatile i64 0, i64* [[PTR]], align 8
40; ASSUMPTIONS-ON-NEXT: store volatile i64 -1, i64* [[PTR]], align 8
41; ASSUMPTIONS-ON-NEXT: store volatile i64 -1, i64* [[PTR]], align 8
42; ASSUMPTIONS-ON-NEXT: store volatile i64 -1, i64* [[PTR]], align 8
43; ASSUMPTIONS-ON-NEXT: store volatile i64 -1, i64* [[PTR]], align 8
44; ASSUMPTIONS-ON-NEXT: store volatile i64 -1, i64* [[PTR]], align 8
Roman Lebedev9c4c2f242021-06-24 13:15:39 +030045; ASSUMPTIONS-ON-NEXT: store volatile i64 [[DOTSINK]], i64* [[PTR]], align 8
Tykerc95ffad2020-06-24 13:18:21 +020046; ASSUMPTIONS-ON-NEXT: ret void
Hans Wennborg1e9afab2021-09-24 18:44:20 +020047; ASSUMPTIONS-ON: false2:
48; ASSUMPTIONS-ON-NEXT: store volatile i64 1, i64* [[PTR]], align 4
49; ASSUMPTIONS-ON-NEXT: br label [[COMMON_RET]]
Nikita Popovb74c6d22020-03-25 23:35:19 +010050;
51 br i1 %c, label %true1, label %false1
52
53true1:
54 %c2 = call i1 @callee1(i1 %c, i64* %ptr)
55 store volatile i64 -1, i64* %ptr
56 store volatile i64 -1, i64* %ptr
57 store volatile i64 -1, i64* %ptr
58 store volatile i64 -1, i64* %ptr
59 store volatile i64 -1, i64* %ptr
60 br i1 %c2, label %true2, label %false2
61
62false1:
63 store volatile i64 1, i64* %ptr
64 br label %true1
65
66true2:
67 store volatile i64 2, i64* %ptr
68 ret void
69
70false2:
71 store volatile i64 3, i64* %ptr
72 ret void
73}
74
Hiroshi Yamauchi6bd1db02020-06-15 09:37:07 -070075; This test checks that alignment assumptions do not prevent SROA.
Nikita Popovb74c6d22020-03-25 23:35:19 +010076; See PR45763.
77
Matt Arsenault20c43d62020-11-20 14:07:11 -050078define internal void @callee2(i64* noalias sret(i64) align 32 %arg) {
Nikita Popovb74c6d22020-03-25 23:35:19 +010079 store i64 0, i64* %arg, align 8
80 ret void
81}
82
83define amdgpu_kernel void @caller2() {
Tyker78de7292020-09-12 13:36:45 +020084; CHECK-LABEL: @caller2(
Tyker78de7292020-09-12 13:36:45 +020085; CHECK-NEXT: ret void
Nikita Popovb74c6d22020-03-25 23:35:19 +010086;
87 %alloca = alloca i64, align 8, addrspace(5)
88 %cast = addrspacecast i64 addrspace(5)* %alloca to i64*
Matt Arsenault20c43d62020-11-20 14:07:11 -050089 call void @callee2(i64* sret(i64) align 32 %cast)
Nikita Popovb74c6d22020-03-25 23:35:19 +010090 ret void
91}