104 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes2; RUN: opt < %s -passes=argpromotion -S | FileCheck %s3 4declare void @use.i32(i32)5declare void @use.p32(ptr)6 7define internal void @callee(ptr %p1, ptr %p2, ptr %p3, ptr %p4, ptr %p5, ptr %p6, ptr %p7, ptr %p8, ptr %p9, ptr %p10) {8; CHECK-LABEL: define {{[^@]+}}@callee9; CHECK-SAME: (i32 [[P1_0_VAL:%.*]], i32 [[P2_0_VAL:%.*]], ptr [[P3_0_VAL:%.*]], ptr [[P4_0_VAL:%.*]], ptr [[P5_0_VAL:%.*]], ptr [[P6_0_VAL:%.*]], ptr [[P7_0_VAL:%.*]], ptr [[P8_0_VAL:%.*]], ptr [[P9_0_VAL:%.*]], ptr [[P10_0_VAL:%.*]]) {10; CHECK-NEXT: [[TMP1:%.*]] = icmp ne ptr [[P4_0_VAL]], null11; CHECK-NEXT: call void @llvm.assume(i1 [[TMP1]])12; CHECK-NEXT: call void @use.i32(i32 [[P1_0_VAL]])13; CHECK-NEXT: call void @use.i32(i32 [[P2_0_VAL]])14; CHECK-NEXT: call void @use.p32(ptr [[P3_0_VAL]])15; CHECK-NEXT: call void @use.p32(ptr [[P4_0_VAL]])16; CHECK-NEXT: call void @use.p32(ptr [[P5_0_VAL]])17; CHECK-NEXT: call void @use.p32(ptr [[P6_0_VAL]])18; CHECK-NEXT: call void @use.p32(ptr [[P7_0_VAL]])19; CHECK-NEXT: call void @use.p32(ptr [[P8_0_VAL]])20; CHECK-NEXT: call void @use.p32(ptr [[P9_0_VAL]])21; CHECK-NEXT: call void @use.p32(ptr [[P10_0_VAL]])22; CHECK-NEXT: ret void23;24 %v1 = load i32, ptr %p1, !range !025 %v2 = load i32, ptr %p2, !range !0, !noundef !126 %v3 = load ptr, ptr %p3, !nonnull !127 %v4 = load ptr, ptr %p4, !nonnull !1, !noundef !128 %v5 = load ptr, ptr %p5, !dereferenceable !229 %v6 = load ptr, ptr %p6, !dereferenceable_or_null !230 %v7 = load ptr, ptr %p7, !align !331 %v8 = load ptr, ptr %p8, !align !3, !noundef !132 %v9 = load ptr, ptr %p9, !noundef !133 %v10 = load ptr, ptr %p10, !nontemporal !434 call void @use.i32(i32 %v1)35 call void @use.i32(i32 %v2)36 call void @use.p32(ptr %v3)37 call void @use.p32(ptr %v4)38 call void @use.p32(ptr %v5)39 call void @use.p32(ptr %v6)40 call void @use.p32(ptr %v7)41 call void @use.p32(ptr %v8)42 call void @use.p32(ptr %v9)43 call void @use.p32(ptr %v10)44 ret void45}46 47define void @caller(ptr %p1, ptr %p2, ptr %p3, ptr %p4, ptr %p5, ptr %p6, ptr %p7, ptr %p8, ptr %p9, ptr %p10) {48; CHECK-LABEL: define {{[^@]+}}@caller49; CHECK-SAME: (ptr [[P1:%.*]], ptr [[P2:%.*]], ptr [[P3:%.*]], ptr [[P4:%.*]], ptr [[P5:%.*]], ptr [[P6:%.*]], ptr [[P7:%.*]], ptr [[P8:%.*]], ptr [[P9:%.*]], ptr [[P10:%.*]]) {50; CHECK-NEXT: [[P1_VAL:%.*]] = load i32, ptr [[P1]], align 451; CHECK-NEXT: [[P2_VAL:%.*]] = load i32, ptr [[P2]], align 4, !range [[RNG0:![0-9]+]], !noundef !152; CHECK-NEXT: [[P3_VAL:%.*]] = load ptr, ptr [[P3]], align 853; CHECK-NEXT: [[P4_VAL:%.*]] = load ptr, ptr [[P4]], align 8, !nonnull !1, !noundef !154; CHECK-NEXT: [[P5_VAL:%.*]] = load ptr, ptr [[P5]], align 8, !dereferenceable !255; CHECK-NEXT: [[P6_VAL:%.*]] = load ptr, ptr [[P6]], align 8, !dereferenceable_or_null !256; CHECK-NEXT: [[P7_VAL:%.*]] = load ptr, ptr [[P7]], align 857; CHECK-NEXT: [[P8_VAL:%.*]] = load ptr, ptr [[P8]], align 8, !align !3, !noundef !158; CHECK-NEXT: [[P9_VAL:%.*]] = load ptr, ptr [[P9]], align 8, !noundef !159; CHECK-NEXT: [[P10_VAL:%.*]] = load ptr, ptr [[P10]], align 8, !nontemporal !460; CHECK-NEXT: call void @callee(i32 [[P1_VAL]], i32 [[P2_VAL]], ptr [[P3_VAL]], ptr [[P4_VAL]], ptr [[P5_VAL]], ptr [[P6_VAL]], ptr [[P7_VAL]], ptr [[P8_VAL]], ptr [[P9_VAL]], ptr [[P10_VAL]])61; CHECK-NEXT: ret void62;63 call void @callee(ptr %p1, ptr %p2, ptr %p3, ptr %p4, ptr %p5, ptr %p6, ptr %p7, ptr %p8, ptr %p9, ptr %p10)64 ret void65}66 67define internal ptr @callee_conditional(i1 %c, ptr dereferenceable(8) align 8 %p) {68; CHECK-LABEL: define {{[^@]+}}@callee_conditional69; CHECK-SAME: (i1 [[C:%.*]], ptr [[P_0_VAL:%.*]]) {70; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]71; CHECK: if:72; CHECK-NEXT: [[TMP1:%.*]] = icmp ne ptr [[P_0_VAL]], null73; CHECK-NEXT: call void @llvm.assume(i1 [[TMP1]])74; CHECK-NEXT: ret ptr [[P_0_VAL]]75; CHECK: else:76; CHECK-NEXT: ret ptr null77;78 br i1 %c, label %if, label %else79 80if:81 %v = load ptr, ptr %p, !nonnull !1, !noundef !182 ret ptr %v83 84else:85 ret ptr null86}87 88define void @caller_conditional(i1 %c, ptr %p) {89; CHECK-LABEL: define {{[^@]+}}@caller_conditional90; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]]) {91; CHECK-NEXT: [[P_VAL:%.*]] = load ptr, ptr [[P]], align 892; CHECK-NEXT: [[TMP1:%.*]] = call ptr @callee_conditional(i1 [[C]], ptr [[P_VAL]])93; CHECK-NEXT: ret void94;95 call ptr @callee_conditional(i1 %c, ptr %p)96 ret void97}98 99!0 = !{i32 0, i32 4}100!1 = !{}101!2 = !{i64 8}102!3 = !{i64 4}103!4 = !{i32 1}104