| ; 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 |
| |
| ; Test argument promotion involving bitcasts. |
| |
| %opaque = type opaque |
| |
| define internal i32 @callee_basic(ptr %p) { |
| ; CHECK-LABEL: define {{[^@]+}}@callee_basic |
| ; CHECK-SAME: (i32 [[P_0_VAL:%.*]], i32 [[P_4_VAL:%.*]]) { |
| ; CHECK-NEXT: [[Z:%.*]] = add i32 [[P_0_VAL]], [[P_4_VAL]] |
| ; CHECK-NEXT: ret i32 [[Z]] |
| ; |
| %x = load i32, ptr %p |
| %p1 = getelementptr i8, ptr %p, i64 4 |
| %y = load i32, ptr %p1 |
| %z = add i32 %x, %y |
| ret i32 %z |
| } |
| |
| define void @caller_basic(ptr %p) { |
| ; CHECK-LABEL: define {{[^@]+}}@caller_basic |
| ; CHECK-SAME: (ptr [[P:%.*]]) { |
| ; CHECK-NEXT: [[P_VAL:%.*]] = load i32, ptr [[P]], align 4 |
| ; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[P]], i64 4 |
| ; CHECK-NEXT: [[P_VAL1:%.*]] = load i32, ptr [[TMP2]], align 4 |
| ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @callee_basic(i32 [[P_VAL]], i32 [[P_VAL1]]) |
| ; CHECK-NEXT: ret void |
| ; |
| call i32 @callee_basic(ptr %p) |
| ret void |
| } |
| |
| define internal i32 @callee_opaque(ptr %p) { |
| ; CHECK-LABEL: define {{[^@]+}}@callee_opaque |
| ; CHECK-SAME: (i32 [[P_0_VAL:%.*]], i32 [[P_4_VAL:%.*]]) { |
| ; CHECK-NEXT: [[Z:%.*]] = add i32 [[P_0_VAL]], [[P_4_VAL]] |
| ; CHECK-NEXT: ret i32 [[Z]] |
| ; |
| %x = load i32, ptr %p |
| %p1.32 = getelementptr i32, ptr %p, i64 1 |
| %y = load i32, ptr %p1.32 |
| %z = add i32 %x, %y |
| ret i32 %z |
| } |
| |
| define void @caller_opaque(ptr %p) { |
| ; CHECK-LABEL: define {{[^@]+}}@caller_opaque |
| ; CHECK-SAME: (ptr [[P:%.*]]) { |
| ; CHECK-NEXT: [[P_VAL:%.*]] = load i32, ptr [[P]], align 4 |
| ; CHECK-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[P]], i64 4 |
| ; CHECK-NEXT: [[P_VAL1:%.*]] = load i32, ptr [[TMP3]], align 4 |
| ; CHECK-NEXT: [[TMP5:%.*]] = call i32 @callee_opaque(i32 [[P_VAL]], i32 [[P_VAL1]]) |
| ; CHECK-NEXT: ret void |
| ; |
| call i32 @callee_opaque(ptr %p) |
| ret void |
| } |