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 3f5f377d1SAndrew Litteken 4f5f377d1SAndrew Litteken; This test checks that we do can outline indirect and regular function calls 5f5f377d1SAndrew Litteken; when the type matches when it is not specified that the names must match. 6f5f377d1SAndrew Litteken 7f5f377d1SAndrew Littekendeclare void @f1(); 8f5f377d1SAndrew Litteken 9*f4b925eeSMatt Arsenaultdefine void @function1(ptr %func) { 10f5f377d1SAndrew Littekenentry: 11f5f377d1SAndrew Litteken %a = alloca i32, align 4 12f5f377d1SAndrew Litteken %b = alloca i32, align 4 13f5f377d1SAndrew Litteken %c = alloca i32, align 4 14*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 15*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 16*f4b925eeSMatt Arsenault store i32 4, ptr %c, align 4 17f5f377d1SAndrew Litteken call void %func() 18*f4b925eeSMatt Arsenault %al = load i32, ptr %a 19*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 20*f4b925eeSMatt Arsenault %cl = load i32, ptr %c 21f5f377d1SAndrew Litteken ret void 22f5f377d1SAndrew Litteken} 23f5f377d1SAndrew Litteken 24f5f377d1SAndrew Littekendefine void @function2() { 25f5f377d1SAndrew Littekenentry: 26f5f377d1SAndrew Litteken %a = alloca i32, align 4 27f5f377d1SAndrew Litteken %b = alloca i32, align 4 28f5f377d1SAndrew Litteken %c = alloca i32, align 4 29*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 30*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 31*f4b925eeSMatt Arsenault store i32 4, ptr %c, align 4 32f5f377d1SAndrew Litteken call void @f1() 33*f4b925eeSMatt Arsenault %al = load i32, ptr %a 34*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 35*f4b925eeSMatt Arsenault %cl = load i32, ptr %c 36f5f377d1SAndrew Litteken ret void 37f5f377d1SAndrew Litteken} 38f5f377d1SAndrew Litteken; CHECK-LABEL: @function1( 39f5f377d1SAndrew Litteken; CHECK-NEXT: entry: 40f5f377d1SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 41f5f377d1SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 42f5f377d1SAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 43*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]], ptr [[FUNC:%.*]]) 44f5f377d1SAndrew Litteken; CHECK-NEXT: ret void 45f5f377d1SAndrew Litteken; 46f5f377d1SAndrew Litteken; 47f5f377d1SAndrew Litteken; CHECK-LABEL: @function2( 48f5f377d1SAndrew Litteken; CHECK-NEXT: entry: 49f5f377d1SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 50f5f377d1SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 51f5f377d1SAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 52*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]], ptr @f1) 53f5f377d1SAndrew Litteken; CHECK-NEXT: ret void 54f5f377d1SAndrew Litteken; 55f5f377d1SAndrew Litteken; 56f5f377d1SAndrew Litteken; CHECK-LABEL: define internal void @outlined_ir_func_0( 57f5f377d1SAndrew Litteken; CHECK-NEXT: newFuncRoot: 58f5f377d1SAndrew Litteken; CHECK-NEXT: br label [[ENTRY_TO_OUTLINE:%.*]] 59f5f377d1SAndrew Litteken; CHECK: entry_to_outline: 60*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 2, ptr [[TMP0:%.*]], align 4 61*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 3, ptr [[TMP1:%.*]], align 4 62*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 4, ptr [[TMP2:%.*]], align 4 63f5f377d1SAndrew Litteken; CHECK-NEXT: call void [[TMP3:%.*]]() 64*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AL:%.*]] = load i32, ptr [[TMP0]], align 4 65*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BL:%.*]] = load i32, ptr [[TMP1]], align 4 66*f4b925eeSMatt Arsenault; CHECK-NEXT: [[CL:%.*]] = load i32, ptr [[TMP2]], align 4 67f5f377d1SAndrew Litteken; CHECK-NEXT: br label [[ENTRY_AFTER_OUTLINE_EXITSTUB:%.*]] 68f5f377d1SAndrew Litteken; CHECK: entry_after_outline.exitStub: 69f5f377d1SAndrew Litteken; CHECK-NEXT: ret void 70f5f377d1SAndrew Litteken; 71