brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 8ceb310 Raw
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