94 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost -ir-sim-calls-by-name < %s | FileCheck %s3 4; This test checks that we do can outline calls, but only if they have the same5; function type and the same name.6 7declare void @f1(ptr, ptr);8declare void @f2(ptr, ptr);9 10define void @function1() {11; CHECK-LABEL: @function1(12; CHECK-NEXT: entry:13; CHECK-NEXT: [[A:%.*]] = alloca i32, align 414; CHECK-NEXT: [[B:%.*]] = alloca i32, align 415; CHECK-NEXT: [[C:%.*]] = alloca i32, align 416; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]])17; CHECK-NEXT: ret void18;19entry:20 %a = alloca i32, align 421 %b = alloca i32, align 422 %c = alloca i32, align 423 store i32 2, ptr %a, align 424 store i32 3, ptr %b, align 425 store i32 4, ptr %c, align 426 call void @f1(ptr %a, ptr %b)27 %al = load i32, ptr %a28 %bl = load i32, ptr %b29 %cl = load i32, ptr %c30 ret void31}32 33define void @function2() {34; CHECK-LABEL: @function2(35; CHECK-NEXT: entry:36; CHECK-NEXT: [[A:%.*]] = alloca i32, align 437; CHECK-NEXT: [[B:%.*]] = alloca i32, align 438; CHECK-NEXT: [[C:%.*]] = alloca i32, align 439; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]])40; CHECK-NEXT: ret void41;42entry:43 %a = alloca i32, align 444 %b = alloca i32, align 445 %c = alloca i32, align 446 store i32 2, ptr %a, align 447 store i32 3, ptr %b, align 448 store i32 4, ptr %c, align 449 call void @f1(ptr %a, ptr %b)50 %al = load i32, ptr %a51 %bl = load i32, ptr %b52 %cl = load i32, ptr %c53 ret void54}55 56define void @function3() {57; CHECK-LABEL: @function3(58; CHECK-NEXT: entry:59; CHECK-NEXT: [[A:%.*]] = alloca i32, align 460; CHECK-NEXT: [[B:%.*]] = alloca i32, align 461; CHECK-NEXT: [[C:%.*]] = alloca i32, align 462; CHECK-NEXT: store i32 2, ptr [[A]], align 463; CHECK-NEXT: store i32 3, ptr [[B]], align 464; CHECK-NEXT: store i32 4, ptr [[C]], align 465; CHECK-NEXT: call void @f2(ptr [[A]], ptr [[B]])66; CHECK-NEXT: [[AL:%.*]] = load i32, ptr [[A]], align 467; CHECK-NEXT: [[BL:%.*]] = load i32, ptr [[B]], align 468; CHECK-NEXT: [[CL:%.*]] = load i32, ptr [[C]], align 469; CHECK-NEXT: ret void70;71entry:72 %a = alloca i32, align 473 %b = alloca i32, align 474 %c = alloca i32, align 475 store i32 2, ptr %a, align 476 store i32 3, ptr %b, align 477 store i32 4, ptr %c, align 478 call void @f2(ptr %a, ptr %b)79 %al = load i32, ptr %a80 %bl = load i32, ptr %b81 %cl = load i32, ptr %c82 ret void83}84 85; CHECK: define internal void @outlined_ir_func_0(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]])86; CHECK: entry_to_outline:87; CHECK-NEXT: store i32 2, ptr [[ARG0]], align 488; CHECK-NEXT: store i32 3, ptr [[ARG1]], align 489; CHECK-NEXT: store i32 4, ptr [[ARG2]], align 490; CHECK-NEXT: call void @f1(ptr [[ARG0]], ptr [[ARG1]])91; CHECK-NEXT: [[AL:%.*]] = load i32, ptr [[ARG0]], align 492; CHECK-NEXT: [[BL:%.*]] = load i32, ptr [[ARG1]], align 493; CHECK-NEXT: [[CL:%.*]] = load i32, ptr [[ARG2]], align 494