Nikita Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
Simon Pilgrim | ad27f54 | 2020-11-08 13:30:18 +0000 | [diff] [blame] | 2 | ; 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 Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 5 | |
| 6 | target 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 | |
| 12 | define internal i1 @callee1(i1 %c, i64* align 8 %ptr) { |
| 13 | store volatile i64 0, i64* %ptr |
| 14 | ret i1 %c |
| 15 | } |
| 16 | |
| 17 | define void @caller1(i1 %c, i64* align 1 %ptr) { |
| 18 | ; ASSUMPTIONS-OFF-LABEL: @caller1( |
Roman Lebedev | 9c4c2f24 | 2021-06-24 13:15:39 +0300 | [diff] [blame] | 19 | ; 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 Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 22 | ; 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 Lebedev | 9c4c2f24 | 2021-06-24 13:15:39 +0300 | [diff] [blame] | 28 | ; ASSUMPTIONS-OFF-NEXT: store volatile i64 [[DOTSINK]], i64* [[PTR]], align 4 |
Nikita Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 29 | ; ASSUMPTIONS-OFF-NEXT: ret void |
| 30 | ; ASSUMPTIONS-OFF: false2: |
| 31 | ; ASSUMPTIONS-OFF-NEXT: store volatile i64 1, i64* [[PTR]], align 4 |
Roman Lebedev | 9c4c2f24 | 2021-06-24 13:15:39 +0300 | [diff] [blame] | 32 | ; ASSUMPTIONS-OFF-NEXT: br label [[COMMON_RET]] |
Nikita Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 33 | ; |
| 34 | ; ASSUMPTIONS-ON-LABEL: @caller1( |
Hans Wennborg | 1e9afab | 2021-09-24 18:44:20 +0200 | [diff] [blame] | 35 | ; ASSUMPTIONS-ON-NEXT: br i1 [[C:%.*]], label [[COMMON_RET:%.*]], label [[FALSE2:%.*]] |
Roman Lebedev | 9c4c2f24 | 2021-06-24 13:15:39 +0300 | [diff] [blame] | 36 | ; ASSUMPTIONS-ON: common.ret: |
Hans Wennborg | 1e9afab | 2021-09-24 18:44:20 +0200 | [diff] [blame] | 37 | ; 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 Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 39 | ; 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 Lebedev | 9c4c2f24 | 2021-06-24 13:15:39 +0300 | [diff] [blame] | 45 | ; ASSUMPTIONS-ON-NEXT: store volatile i64 [[DOTSINK]], i64* [[PTR]], align 8 |
Tyker | c95ffad | 2020-06-24 13:18:21 +0200 | [diff] [blame] | 46 | ; ASSUMPTIONS-ON-NEXT: ret void |
Hans Wennborg | 1e9afab | 2021-09-24 18:44:20 +0200 | [diff] [blame] | 47 | ; ASSUMPTIONS-ON: false2: |
| 48 | ; ASSUMPTIONS-ON-NEXT: store volatile i64 1, i64* [[PTR]], align 4 |
| 49 | ; ASSUMPTIONS-ON-NEXT: br label [[COMMON_RET]] |
Nikita Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 50 | ; |
| 51 | br i1 %c, label %true1, label %false1 |
| 52 | |
| 53 | true1: |
| 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 | |
| 62 | false1: |
| 63 | store volatile i64 1, i64* %ptr |
| 64 | br label %true1 |
| 65 | |
| 66 | true2: |
| 67 | store volatile i64 2, i64* %ptr |
| 68 | ret void |
| 69 | |
| 70 | false2: |
| 71 | store volatile i64 3, i64* %ptr |
| 72 | ret void |
| 73 | } |
| 74 | |
Hiroshi Yamauchi | 6bd1db0 | 2020-06-15 09:37:07 -0700 | [diff] [blame] | 75 | ; This test checks that alignment assumptions do not prevent SROA. |
Nikita Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 76 | ; See PR45763. |
| 77 | |
Matt Arsenault | 20c43d6 | 2020-11-20 14:07:11 -0500 | [diff] [blame] | 78 | define internal void @callee2(i64* noalias sret(i64) align 32 %arg) { |
Nikita Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 79 | store i64 0, i64* %arg, align 8 |
| 80 | ret void |
| 81 | } |
| 82 | |
| 83 | define amdgpu_kernel void @caller2() { |
Tyker | 78de729 | 2020-09-12 13:36:45 +0200 | [diff] [blame] | 84 | ; CHECK-LABEL: @caller2( |
Tyker | 78de729 | 2020-09-12 13:36:45 +0200 | [diff] [blame] | 85 | ; CHECK-NEXT: ret void |
Nikita Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 86 | ; |
| 87 | %alloca = alloca i64, align 8, addrspace(5) |
| 88 | %cast = addrspacecast i64 addrspace(5)* %alloca to i64* |
Matt Arsenault | 20c43d6 | 2020-11-20 14:07:11 -0500 | [diff] [blame] | 89 | call void @callee2(i64* sret(i64) align 32 %cast) |
Nikita Popov | b74c6d2 | 2020-03-25 23:35:19 +0100 | [diff] [blame] | 90 | ret void |
| 91 | } |