| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature | |
| ; RUN: opt -passes=argpromotion -S < %s | FileCheck %s | |
| declare void @sink(i32) | |
| define internal void @optnone_promote(ptr %X) optnone noinline { | |
| ; CHECK-LABEL: define {{[^@]+}}@optnone_promote | |
| ; CHECK-SAME: (ptr [[X:%.*]]) #[[ATTR0:[0-9]+]] { | |
| ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[X]], align 4 | |
| ; CHECK-NEXT: call void @sink(i32 [[V]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| %v = load i32, ptr %X, align 4 | |
| call void @sink(i32 %v) | |
| ret void | |
| } | |
| define internal void @promote(ptr %X) { | |
| ; CHECK-LABEL: define {{[^@]+}}@promote | |
| ; CHECK-SAME: (i32 [[X_0_VAL:%.*]]) { | |
| ; CHECK-NEXT: call void @sink(i32 [[X_0_VAL]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| %v = load i32, ptr %X, align 4 | |
| call void @sink(i32 %v) | |
| ret void | |
| } | |
| define void @caller(ptr %Y, ptr %Z) { | |
| ; CHECK-LABEL: define {{[^@]+}}@caller | |
| ; CHECK-SAME: (ptr [[Y:%.*]], ptr [[Z:%.*]]) { | |
| ; CHECK-NEXT: call void @optnone_promote(ptr [[Y]]) | |
| ; CHECK-NEXT: [[Z_VAL:%.*]] = load i32, ptr [[Z]], align 4 | |
| ; CHECK-NEXT: call void @promote(i32 [[Z_VAL]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @optnone_promote(ptr %Y) | |
| call void @promote(ptr %Z) | |
| ret void | |
| } |