1f5f377d1SAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs 29dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s 357a46914SAndrew Litteken 457a46914SAndrew Litteken; This test checks that we do can outline calls, but only if they have the same 557a46914SAndrew Litteken; function type and the same name. 657a46914SAndrew Litteken 7*f4b925eeSMatt Arsenaultdeclare void @f1(ptr, ptr); 8*f4b925eeSMatt Arsenaultdeclare void @f2(ptr, ptr); 957a46914SAndrew Litteken 1057a46914SAndrew Littekendefine void @function1() { 1157a46914SAndrew Littekenentry: 1257a46914SAndrew Litteken %a = alloca i32, align 4 1357a46914SAndrew Litteken %b = alloca i32, align 4 1457a46914SAndrew Litteken %c = alloca i32, align 4 15*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 16*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 17*f4b925eeSMatt Arsenault store i32 4, ptr %c, align 4 18*f4b925eeSMatt Arsenault call void @f1(ptr %a, ptr %b) 19*f4b925eeSMatt Arsenault %al = load i32, ptr %a 20*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 21*f4b925eeSMatt Arsenault %cl = load i32, ptr %c 2257a46914SAndrew Litteken ret void 2357a46914SAndrew Litteken} 2457a46914SAndrew Litteken 2557a46914SAndrew Littekendefine void @function2() { 2657a46914SAndrew Littekenentry: 2757a46914SAndrew Litteken %a = alloca i32, align 4 2857a46914SAndrew Litteken %b = alloca i32, align 4 2957a46914SAndrew Litteken %c = alloca i32, align 4 30*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 31*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 32*f4b925eeSMatt Arsenault store i32 4, ptr %c, align 4 33*f4b925eeSMatt Arsenault call void @f1(ptr %a, ptr %b) 34*f4b925eeSMatt Arsenault %al = load i32, ptr %a 35*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 36*f4b925eeSMatt Arsenault %cl = load i32, ptr %c 3757a46914SAndrew Litteken ret void 3857a46914SAndrew Litteken} 3957a46914SAndrew Litteken 4057a46914SAndrew Littekendefine void @function3() { 4157a46914SAndrew Littekenentry: 4257a46914SAndrew Litteken %a = alloca i32, align 4 4357a46914SAndrew Litteken %b = alloca i32, align 4 4457a46914SAndrew Litteken %c = alloca i32, align 4 45*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 46*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 47*f4b925eeSMatt Arsenault store i32 4, ptr %c, align 4 48*f4b925eeSMatt Arsenault call void @f2(ptr %a, ptr %b) 49*f4b925eeSMatt Arsenault %al = load i32, ptr %a 50*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 51*f4b925eeSMatt Arsenault %cl = load i32, ptr %c 5257a46914SAndrew Litteken ret void 5357a46914SAndrew Litteken} 5457a46914SAndrew Litteken 55f5f377d1SAndrew Litteken; CHECK-LABEL: @function1( 56f5f377d1SAndrew Litteken; CHECK-NEXT: entry: 57f5f377d1SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 58f5f377d1SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 59f5f377d1SAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 60*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]], ptr @f1) 61f5f377d1SAndrew Litteken; CHECK-NEXT: ret void 62f5f377d1SAndrew Litteken; 63f5f377d1SAndrew Litteken; 64f5f377d1SAndrew Litteken; CHECK-LABEL: @function2( 65f5f377d1SAndrew Litteken; CHECK-NEXT: entry: 66f5f377d1SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 67f5f377d1SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 68f5f377d1SAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 69*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]], ptr @f1) 70f5f377d1SAndrew Litteken; CHECK-NEXT: ret void 71f5f377d1SAndrew Litteken; 72f5f377d1SAndrew Litteken; 73f5f377d1SAndrew Litteken; CHECK-LABEL: @function3( 74f5f377d1SAndrew Litteken; CHECK-NEXT: entry: 75f5f377d1SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 76f5f377d1SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 77f5f377d1SAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 78*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]], ptr @f2) 79f5f377d1SAndrew Litteken; CHECK-NEXT: ret void 80f5f377d1SAndrew Litteken; 81f5f377d1SAndrew Litteken; 82f5f377d1SAndrew Litteken; CHECK-LABEL: define internal void @outlined_ir_func_0( 83f5f377d1SAndrew Litteken; CHECK-NEXT: newFuncRoot: 84f5f377d1SAndrew Litteken; CHECK-NEXT: br label [[ENTRY_TO_OUTLINE:%.*]] 8557a46914SAndrew Litteken; CHECK: entry_to_outline: 86*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 2, ptr [[TMP0:%.*]], align 4 87*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 3, ptr [[TMP1:%.*]], align 4 88*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 4, ptr [[TMP2:%.*]], align 4 89*f4b925eeSMatt Arsenault; CHECK-NEXT: call void [[TMP3:%.*]](ptr [[TMP0]], ptr [[TMP1]]) 90*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AL:%.*]] = load i32, ptr [[TMP0]], align 4 91*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BL:%.*]] = load i32, ptr [[TMP1]], align 4 92*f4b925eeSMatt Arsenault; CHECK-NEXT: [[CL:%.*]] = load i32, ptr [[TMP2]], align 4 93f5f377d1SAndrew Litteken; CHECK-NEXT: br label [[ENTRY_AFTER_OUTLINE_EXITSTUB:%.*]] 94f5f377d1SAndrew Litteken; CHECK: entry_after_outline.exitStub: 95f5f377d1SAndrew Litteken; CHECK-NEXT: ret void 96f5f377d1SAndrew Litteken; 97