brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 608d45a Raw
106 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=memcpyopt < %s -verify-memoryssa | FileCheck %s3declare void @may_throw(ptr nocapture %x)4 5define void @test1(ptr nocapture noalias dereferenceable(4) %x) {6; CHECK-LABEL: @test1(7; CHECK-NEXT:  entry:8; CHECK-NEXT:    [[T:%.*]] = alloca i32, align 49; CHECK-NEXT:    call void @may_throw(ptr nonnull [[T]])10; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[T]], align 411; CHECK-NEXT:    store i32 [[LOAD]], ptr [[X:%.*]], align 412; CHECK-NEXT:    ret void13;14entry:15  %t = alloca i32, align 416  call void @may_throw(ptr nonnull %t)17  %load = load i32, ptr %t, align 418  store i32 %load, ptr %x, align 419  ret void20}21 22declare void @always_throws()23 24define void @test2(ptr nocapture noalias dereferenceable(4) %x) {25; CHECK-LABEL: @test2(26; CHECK-NEXT:  entry:27; CHECK-NEXT:    [[T:%.*]] = alloca i32, align 428; CHECK-NEXT:    call void @may_throw(ptr nonnull [[T]]) #[[ATTR0:[0-9]+]]29; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[T]], align 430; CHECK-NEXT:    call void @always_throws()31; CHECK-NEXT:    store i32 [[LOAD]], ptr [[X:%.*]], align 432; CHECK-NEXT:    ret void33;34entry:35  %t = alloca i32, align 436  call void @may_throw(ptr nonnull %t) nounwind37  %load = load i32, ptr %t, align 438  call void @always_throws()39  store i32 %load, ptr %x, align 440  ret void41}42 43; byval argument is not visible on unwind.44define void @test_byval(ptr nocapture noalias dereferenceable(4) byval(i32) %x) {45; CHECK-LABEL: @test_byval(46; CHECK-NEXT:  entry:47; CHECK-NEXT:    [[T:%.*]] = alloca i32, align 448; CHECK-NEXT:    call void @may_throw(ptr nonnull [[X:%.*]])49; CHECK-NEXT:    ret void50;51entry:52  %t = alloca i32, align 453  call void @may_throw(ptr nonnull %t)54  %load = load i32, ptr %t, align 455  store i32 %load, ptr %x, align 456  ret void57}58 59define void @test_dead_on_unwind(ptr nocapture noalias writable dead_on_unwind dereferenceable(4) %x) {60; CHECK-LABEL: @test_dead_on_unwind(61; CHECK-NEXT:  entry:62; CHECK-NEXT:    [[T:%.*]] = alloca i32, align 463; CHECK-NEXT:    call void @may_throw(ptr nonnull [[X:%.*]])64; CHECK-NEXT:    ret void65;66entry:67  %t = alloca i32, align 468  call void @may_throw(ptr nonnull %t)69  %load = load i32, ptr %t, align 470  store i32 %load, ptr %x, align 471  ret void72}73 74; Same as previous test, but dereferenceability information is provided by sret.75define void @test_dead_on_unwind_sret(ptr nocapture noalias writable dead_on_unwind sret(i32) %x) {76; CHECK-LABEL: @test_dead_on_unwind_sret(77; CHECK-NEXT:  entry:78; CHECK-NEXT:    [[T:%.*]] = alloca i32, align 479; CHECK-NEXT:    call void @may_throw(ptr nonnull [[X:%.*]])80; CHECK-NEXT:    ret void81;82entry:83  %t = alloca i32, align 484  call void @may_throw(ptr nonnull %t)85  %load = load i32, ptr %t, align 486  store i32 %load, ptr %x, align 487  ret void88}89 90define void @test_dead_on_unwind_missing_writable(ptr nocapture noalias dead_on_unwind dereferenceable(4) %x) {91; CHECK-LABEL: @test_dead_on_unwind_missing_writable(92; CHECK-NEXT:  entry:93; CHECK-NEXT:    [[T:%.*]] = alloca i32, align 494; CHECK-NEXT:    call void @may_throw(ptr nonnull [[T]])95; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[T]], align 496; CHECK-NEXT:    store i32 [[LOAD]], ptr [[X:%.*]], align 497; CHECK-NEXT:    ret void98;99entry:100  %t = alloca i32, align 4101  call void @may_throw(ptr nonnull %t)102  %load = load i32, ptr %t, align 4103  store i32 %load, ptr %x, align 4104  ret void105}106