11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart
2- ; RUN: opt -S -passes=instcombine,simplifycfg < %s 2>&1 | FileCheck %s
2+ ; RUN: opt -S -passes=' instcombine<no-verify-fixpoint> ,simplifycfg' < %s 2>&1 | FileCheck %s
33
44declare void @llvm.assume (i1 noundef)
55
@@ -87,7 +87,6 @@ if.end: ; preds = %if.else, %if.then
8787define void @f3 (i64 %a , ptr %b ) {
8888; CHECK-LABEL: @f3(
8989; CHECK-NEXT: [[C:%.*]] = ptrtoint ptr [[B:%.*]] to i64
90- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[B]], i64 4294967296) ]
9190; CHECK-NEXT: [[D:%.*]] = add i64 [[A:%.*]], [[C]]
9291; CHECK-NEXT: call void @g(i64 [[D]])
9392; CHECK-NEXT: ret void
@@ -125,8 +124,7 @@ define i8 @assume_align_non_pow2(ptr %p) {
125124
126125define ptr @fold_assume_align_pow2_of_loaded_pointer_into_align_metadata (ptr %p ) {
127126; CHECK-LABEL: @fold_assume_align_pow2_of_loaded_pointer_into_align_metadata(
128- ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8
129- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 8) ]
127+ ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0:![0-9]+]], !noundef [[META1:![0-9]+]]
130128; CHECK-NEXT: ret ptr [[P2]]
131129;
132130 %p2 = load ptr , ptr %p
@@ -136,8 +134,7 @@ define ptr @fold_assume_align_pow2_of_loaded_pointer_into_align_metadata(ptr %p)
136134
137135define ptr @fold_assume_align_i32_pow2_of_loaded_pointer_into_align_metadata (ptr %p ) {
138136; CHECK-LABEL: @fold_assume_align_i32_pow2_of_loaded_pointer_into_align_metadata(
139- ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8
140- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i32 8) ]
137+ ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0]], !noundef [[META1]]
141138; CHECK-NEXT: ret ptr [[P2]]
142139;
143140 %p2 = load ptr , ptr %p
@@ -184,8 +181,7 @@ define ptr @dont_fold_assume_align_zero_of_loaded_pointer_into_align_metadata(pt
184181
185182define ptr @redundant_assume_align_1 (ptr %p ) {
186183; CHECK-LABEL: @redundant_assume_align_1(
187- ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8
188- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i32 1) ]
184+ ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META2:![0-9]+]], !noundef [[META1]]
189185; CHECK-NEXT: call void @foo(ptr [[P2]])
190186; CHECK-NEXT: ret ptr [[P2]]
191187;
@@ -198,8 +194,7 @@ define ptr @redundant_assume_align_1(ptr %p) {
198194
199195define ptr @redundant_assume_align_8_via_align_metadata (ptr %p ) {
200196; CHECK-LABEL: @redundant_assume_align_8_via_align_metadata(
201- ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0:![0-9]+]]
202- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i32 8) ]
197+ ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0]], !noundef [[META1]]
203198; CHECK-NEXT: call void @foo(ptr [[P2]])
204199; CHECK-NEXT: ret ptr [[P2]]
205200;
@@ -211,8 +206,7 @@ define ptr @redundant_assume_align_8_via_align_metadata(ptr %p) {
211206
212207define ptr @assume_align_16_via_align_metadata (ptr %p ) {
213208; CHECK-LABEL: @assume_align_16_via_align_metadata(
214- ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META0]]
215- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i32 16) ]
209+ ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META3:![0-9]+]], !noundef [[META1]]
216210; CHECK-NEXT: call void @foo(ptr [[P2]])
217211; CHECK-NEXT: ret ptr [[P2]]
218212;
@@ -224,7 +218,8 @@ define ptr @assume_align_16_via_align_metadata(ptr %p) {
224218
225219define ptr @redundant_assume_align_8_via_align_attribute (ptr align 8 %p ) {
226220; CHECK-LABEL: @redundant_assume_align_8_via_align_attribute(
227- ; CHECK-NEXT: call void @foo(ptr [[P:%.*]])
221+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P:%.*]], i32 8) ]
222+ ; CHECK-NEXT: call void @foo(ptr [[P]])
228223; CHECK-NEXT: ret ptr [[P]]
229224;
230225 call void @llvm.assume (i1 true ) [ "align" (ptr %p , i32 8 ) ]
@@ -258,13 +253,40 @@ define ptr @redundant_assume_align_8_via_asume(ptr %p) {
258253 ret ptr %p
259254}
260255
256+ define void @redundant_arg_passed_to_intrinsic (ptr %dst , ptr %src ) {
257+ ; CHECK-LABEL: @redundant_arg_passed_to_intrinsic(
258+ ; CHECK-NEXT: call void @bar()
259+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[SRC:%.*]], i32 8) ]
260+ ; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) [[DST:%.*]], ptr noundef nonnull align 8 dereferenceable(16) [[SRC]], i64 16, i1 false)
261+ ; CHECK-NEXT: ret void
262+ ;
263+ call void @llvm.assume (i1 true ) [ "align" (ptr %dst , i32 8 ) ]
264+ call void @bar ()
265+ call void @llvm.assume (i1 true ) [ "align" (ptr %src , i32 8 ) ]
266+ call void @llvm.memmove.p0.p0.i64 (ptr align 8 %dst , ptr %src , i64 16 , i1 false )
267+ ret void
268+ }
269+
270+ define void @test_store (ptr %ptr ) {
271+ ; CHECK-LABEL: @test_store(
272+ ; CHECK-NEXT: entry:
273+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 2) ]
274+ ; CHECK-NEXT: store i16 0, ptr [[PTR]], align 1
275+ ; CHECK-NEXT: ret void
276+ ;
277+ entry:
278+ call void @llvm.assume (i1 true ) [ "align" (ptr %ptr , i64 2 ) ]
279+ store i16 0 , ptr %ptr , align 1
280+ ret void
281+ }
282+
261283declare void @foo (ptr )
284+ declare void @bar ()
262285
263286; !align must have a constant integer alignment.
264287define ptr @dont_fold_assume_align_not_constant_of_loaded_pointer_into_align_metadata (ptr %p , i64 %align ) {
265288; CHECK-LABEL: @dont_fold_assume_align_not_constant_of_loaded_pointer_into_align_metadata(
266- ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8
267- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 [[ALIGN:%.*]]) ]
289+ ; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P:%.*]], align 8, !align [[META2]], !noundef [[META1]]
268290; CHECK-NEXT: ret ptr [[P2]]
269291;
270292 %p2 = load ptr , ptr %p
@@ -274,4 +296,7 @@ define ptr @dont_fold_assume_align_not_constant_of_loaded_pointer_into_align_met
274296
275297;.
276298; CHECK: [[META0]] = !{i64 8}
299+ ; CHECK: [[META1]] = !{}
300+ ; CHECK: [[META2]] = !{i64 1}
301+ ; CHECK: [[META3]] = !{i64 16}
277302;.
0 commit comments