| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes |
| ; RUN: opt -S -passes=argpromotion < %s | FileCheck %s |
| |
| declare void @may_not_return() |
| |
| ; The argument cannot be promoted, as we do not know whether the load can be |
| ; speculatively executed. |
| |
| define internal i32 @callee(ptr %p) { |
| ; CHECK-LABEL: define {{[^@]+}}@callee |
| ; CHECK-SAME: (ptr [[P:%.*]]) { |
| ; CHECK-NEXT: call void @may_not_return() |
| ; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4 |
| ; CHECK-NEXT: ret i32 [[X]] |
| ; |
| call void @may_not_return() readnone |
| %x = load i32, ptr %p |
| ret i32 %x |
| } |
| |
| define void @caller(ptr %p) { |
| ; CHECK-LABEL: define {{[^@]+}}@caller |
| ; CHECK-SAME: (ptr [[P:%.*]]) { |
| ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @callee(ptr [[P]]) |
| ; CHECK-NEXT: ret void |
| ; |
| call i32 @callee(ptr %p) |
| ret void |
| } |