|
1 |
| -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart |
2 | 2 | ; RUN: opt -S -passes=instcombine,simplifycfg < %s 2>&1 | FileCheck %s
|
3 | 3 |
|
4 | 4 | declare void @llvm.assume(i1 noundef)
|
@@ -122,3 +122,52 @@ define i8 @assume_align_non_pow2(ptr %p) {
|
122 | 122 | %v = load i8, ptr %p
|
123 | 123 | ret i8 %v
|
124 | 124 | }
|
| 125 | + |
| 126 | +; TODO: Can fold alignment assumption into !align metadata on load. |
| 127 | +define ptr @fold_assume_align_pow2_of_loaded_pointer_into_align_metadata(ptr %p) { |
| 128 | +; CHECK-LABEL: @fold_assume_align_pow2_of_loaded_pointer_into_align_metadata( |
| 129 | +; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8 |
| 130 | +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 8) ] |
| 131 | +; CHECK-NEXT: ret ptr [[P2]] |
| 132 | +; |
| 133 | + %p2 = load ptr, ptr %p |
| 134 | + call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 8) ] |
| 135 | + ret ptr %p2 |
| 136 | +} |
| 137 | + |
| 138 | +define ptr @dont_fold_assume_align_pow2_of_loaded_pointer_into_align_metadata_due_to_call(ptr %p) { |
| 139 | +; CHECK-LABEL: @dont_fold_assume_align_pow2_of_loaded_pointer_into_align_metadata_due_to_call( |
| 140 | +; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8 |
| 141 | +; CHECK-NEXT: call void @g(i64 0) |
| 142 | +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 8) ] |
| 143 | +; CHECK-NEXT: ret ptr [[P2]] |
| 144 | +; |
| 145 | + %p2 = load ptr, ptr %p |
| 146 | + call void @g(i64 0) |
| 147 | + call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 8) ] |
| 148 | + ret ptr %p2 |
| 149 | +} |
| 150 | + |
| 151 | +; !align must have a power-of-2 alignment. |
| 152 | +define ptr @dont_fold_assume_align_non_pow2_of_loaded_pointer_into_align_metadata(ptr %p) { |
| 153 | +; CHECK-LABEL: @dont_fold_assume_align_non_pow2_of_loaded_pointer_into_align_metadata( |
| 154 | +; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8 |
| 155 | +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 13) ] |
| 156 | +; CHECK-NEXT: ret ptr [[P2]] |
| 157 | +; |
| 158 | + %p2 = load ptr, ptr %p |
| 159 | + call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 13) ] |
| 160 | + ret ptr %p2 |
| 161 | +} |
| 162 | + |
| 163 | +; !align must have a power-of-2 alignment. |
| 164 | +define ptr @dont_fold_assume_align_zero_of_loaded_pointer_into_align_metadata(ptr %p) { |
| 165 | +; CHECK-LABEL: @dont_fold_assume_align_zero_of_loaded_pointer_into_align_metadata( |
| 166 | +; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8 |
| 167 | +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 0) ] |
| 168 | +; CHECK-NEXT: ret ptr [[P2]] |
| 169 | +; |
| 170 | + %p2 = load ptr, ptr %p |
| 171 | + call void @llvm.assume(i1 true) [ "align"(ptr %p2, i64 0) ] |
| 172 | + ret ptr %p2 |
| 173 | +} |
0 commit comments