[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / MemCpyOpt / callslot_throw.ll
blob8ae188c6fd3d4c29a85dd9aa4a149dfe1649e346
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=memcpyopt < %s -verify-memoryssa | FileCheck %s
3 declare void @may_throw(ptr nocapture %x)
5 define void @test1(ptr nocapture noalias dereferenceable(4) %x) {
6 ; CHECK-LABEL: @test1(
7 ; CHECK-NEXT:  entry:
8 ; CHECK-NEXT:    [[T:%.*]] = alloca i32, align 4
9 ; CHECK-NEXT:    call void @may_throw(ptr nonnull [[T]])
10 ; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[T]], align 4
11 ; CHECK-NEXT:    store i32 [[LOAD]], ptr [[X:%.*]], align 4
12 ; CHECK-NEXT:    ret void
14 entry:
15   %t = alloca i32, align 4
16   call void @may_throw(ptr nonnull %t)
17   %load = load i32, ptr %t, align 4
18   store i32 %load, ptr %x, align 4
19   ret void
22 declare void @always_throws()
24 define void @test2(ptr nocapture noalias dereferenceable(4) %x) {
25 ; CHECK-LABEL: @test2(
26 ; CHECK-NEXT:  entry:
27 ; CHECK-NEXT:    [[T:%.*]] = alloca i32, align 4
28 ; CHECK-NEXT:    call void @may_throw(ptr nonnull [[T]]) #[[ATTR0:[0-9]+]]
29 ; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[T]], align 4
30 ; CHECK-NEXT:    call void @always_throws()
31 ; CHECK-NEXT:    store i32 [[LOAD]], ptr [[X:%.*]], align 4
32 ; CHECK-NEXT:    ret void
34 entry:
35   %t = alloca i32, align 4
36   call void @may_throw(ptr nonnull %t) nounwind
37   %load = load i32, ptr %t, align 4
38   call void @always_throws()
39   store i32 %load, ptr %x, align 4
40   ret void
43 ; byval argument is not visible on unwind.
44 define 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 4
48 ; CHECK-NEXT:    call void @may_throw(ptr nonnull [[X:%.*]])
49 ; CHECK-NEXT:    ret void
51 entry:
52   %t = alloca i32, align 4
53   call void @may_throw(ptr nonnull %t)
54   %load = load i32, ptr %t, align 4
55   store i32 %load, ptr %x, align 4
56   ret void
59 ; TODO: With updated semantics, sret could also be invisible on unwind.
60 define void @test_sret(ptr nocapture noalias dereferenceable(4) sret(i32) %x) {
61 ; CHECK-LABEL: @test_sret(
62 ; CHECK-NEXT:  entry:
63 ; CHECK-NEXT:    [[T:%.*]] = alloca i32, align 4
64 ; CHECK-NEXT:    call void @may_throw(ptr nonnull [[T]])
65 ; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[T]], align 4
66 ; CHECK-NEXT:    store i32 [[LOAD]], ptr [[X:%.*]], align 4
67 ; CHECK-NEXT:    ret void
69 entry:
70   %t = alloca i32, align 4
71   call void @may_throw(ptr nonnull %t)
72   %load = load i32, ptr %t, align 4
73   store i32 %load, ptr %x, align 4
74   ret void