124 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt -p instcombine -S %s | FileCheck %s3 4define i64 @test_dereferenceable_assume(ptr %p, ptr %q, i1 %c.0) {5; CHECK-LABEL: define i64 @test_dereferenceable_assume(6; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]]) {7; CHECK-NEXT: [[ENTRY:.*:]]8; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i649; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i6410; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]11; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[DIFF]]) ]12; CHECK-NEXT: br i1 [[C_0]], label %[[THEN:.*]], label %[[ELSE:.*]]13; CHECK: [[THEN]]:14; CHECK-NEXT: ret i64 [[DIFF]]15; CHECK: [[ELSE]]:16; CHECK-NEXT: ret i64 017;18entry:19 %p_int = ptrtoint ptr %p to i6420 %q_int = ptrtoint ptr %q to i6421 %diff = sub i64 %q_int, %p_int22 call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %diff) ]23 br i1 %c.0, label %then, label %else24 25then:26 ret i64 %diff27 28else:29 ret i64 030}31 32define i64 @test_sink_with_dereferenceable_assume_same_block_as_user(ptr %p, ptr %q, i1 %c.0) {33; CHECK-LABEL: define i64 @test_sink_with_dereferenceable_assume_same_block_as_user(34; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]]) {35; CHECK-NEXT: [[ENTRY:.*:]]36; CHECK-NEXT: br i1 [[C_0]], label %[[THEN:.*]], label %[[ELSE:.*]]37; CHECK: [[THEN]]:38; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i6439; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i6440; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]41; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[DIFF]]) ]42; CHECK-NEXT: ret i64 [[DIFF]]43; CHECK: [[ELSE]]:44; CHECK-NEXT: ret i64 045;46entry:47 %p_int = ptrtoint ptr %p to i6448 %q_int = ptrtoint ptr %q to i6449 %diff = sub i64 %q_int, %p_int50 br i1 %c.0, label %then, label %else51 52then:53 call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %diff) ]54 ret i64 %diff55 56else:57 ret i64 058}59 60define i64 @test_sink_with_multiple_users_dominated_by_deref(ptr %p, ptr %q, i1 %c.0, i1 %c.1) {61; CHECK-LABEL: define i64 @test_sink_with_multiple_users_dominated_by_deref(62; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]], i1 [[C_1:%.*]]) {63; CHECK-NEXT: [[ENTRY:.*:]]64; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i6465; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i6466; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]67; CHECK-NEXT: br i1 [[C_0]], label %[[THEN:.*]], label %[[ELSE:.*]]68; CHECK: [[THEN]]:69; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[DIFF]]) ]70; CHECK-NEXT: br i1 [[C_1]], label %[[THEN_2:.*]], label %[[ELSE]]71; CHECK: [[THEN_2]]:72; CHECK-NEXT: [[DOUBLED:%.*]] = shl i64 [[DIFF]], 173; CHECK-NEXT: ret i64 [[DOUBLED]]74; CHECK: [[ELSE]]:75; CHECK-NEXT: ret i64 076;77entry:78 %p_int = ptrtoint ptr %p to i6479 %q_int = ptrtoint ptr %q to i6480 %diff = sub i64 %q_int, %p_int81 br i1 %c.0, label %then, label %else82 83then:84 call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %diff) ]85 br i1 %c.1, label %then.2, label %else86 87then.2:88 %doubled = mul i64 %diff, 289 ret i64 %doubled90 91else:92 ret i64 093}94 95define i64 @test_deref_user_does_not_dominate_other_user(ptr %p, ptr %q, i1 %c.0) {96; CHECK-LABEL: define i64 @test_deref_user_does_not_dominate_other_user(97; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]]) {98; CHECK-NEXT: [[ENTRY:.*:]]99; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64100; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64101; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]102; CHECK-NEXT: br i1 [[C_0]], label %[[MIDDLE:.*]], label %[[EXIT:.*]]103; CHECK: [[MIDDLE]]:104; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[DIFF]]) ]105; CHECK-NEXT: br label %[[EXIT]]106; CHECK: [[EXIT]]:107; CHECK-NEXT: ret i64 [[DIFF]]108;109entry:110 %p_int = ptrtoint ptr %p to i64111 %q_int = ptrtoint ptr %q to i64112 %diff = sub i64 %q_int, %p_int113 br i1 %c.0, label %middle, label %exit114 115middle:116 call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %diff) ]117 br label %exit118 119exit:120 ret i64 %diff121}122 123declare void @llvm.assume(i1 noundef)124