1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs 2; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s 3 4; This test checks that we do not fail when there is a similarity group with 5; an ending instruction that is also the end of the module. 6 7@a = global ptr null 8 9define void @foo() { 10entry: 11 br label %for.cond1 12 13for.cond1: 14 br label %for.body 15 16for.body: 17 %inc = add nsw i32 2, 1 18 br label %for.cond1 19 20for.end: 21 %inc3 = add nsw i32 2, 1 22 br label %for.cond1 23} 24 25; These are for testing if return instructions or unreachable instructions are 26; matched for similarity. 27define void @foo1() { 28entry: 29 br label %for.cond1 30 31for.cond1: 32 br label %for.body 33 34for.body: 35 %inc = add nsw i32 2, 1 36 ret void 37 38for.end: 39 %inc3 = add nsw i32 2, 1 40 ret void 41} 42 43define void @foo2() { 44entry: 45 br label %for.cond1 46 47for.cond1: 48 br label %for.body 49 50for.body: 51 %inc = add nsw i32 2, 1 52 unreachable 53 54for.end: 55 %inc3 = add nsw i32 2, 1 56 unreachable 57} 58 59; CHECK-LABEL: @foo( 60; CHECK-NEXT: entry: 61; CHECK-NEXT: br label [[FOR_COND1:%.*]] 62; CHECK: for.cond1: 63; CHECK-NEXT: br label [[FOR_BODY:%.*]] 64; CHECK: for.body: 65; CHECK-NEXT: call void @outlined_ir_func_1() 66; CHECK-NEXT: br label [[FOR_COND1]] 67; CHECK: for.end: 68; CHECK-NEXT: call void @outlined_ir_func_1() 69; CHECK-NEXT: br label [[FOR_COND1]] 70; 71; 72; CHECK-LABEL: @foo1( 73; CHECK-NEXT: entry: 74; CHECK-NEXT: call void @outlined_ir_func_0() 75; CHECK-NEXT: ret void 76; CHECK: for.end: 77; CHECK-NEXT: [[INC3:%.*]] = add nsw i32 2, 1 78; CHECK-NEXT: ret void 79; 80; 81; CHECK-LABEL: @foo2( 82; CHECK-NEXT: entry: 83; CHECK-NEXT: call void @outlined_ir_func_0() 84; CHECK-NEXT: unreachable 85; CHECK: for.end: 86; CHECK-NEXT: [[INC3:%.*]] = add nsw i32 2, 1 87; CHECK-NEXT: unreachable 88; 89; 90; CHECK: define internal void @outlined_ir_func_0( 91; CHECK-NEXT: newFuncRoot: 92; CHECK-NEXT: br label [[ENTRY_TO_OUTLINE:%.*]] 93; CHECK: entry_to_outline: 94; CHECK-NEXT: br label [[FOR_COND1:%.*]] 95; CHECK: for.cond1: 96; CHECK-NEXT: br label [[FOR_BODY:%.*]] 97; CHECK: for.body: 98; CHECK-NEXT: [[INC:%.*]] = add nsw i32 2, 1 99; CHECK-NEXT: br label [[ENTRY_AFTER_OUTLINE_EXITSTUB:%.*]] 100; CHECK: entry_after_outline.exitStub: 101; CHECK-NEXT: ret void 102; 103; 104; CHECK: define internal void @outlined_ir_func_1( 105; CHECK-NEXT: newFuncRoot: 106; CHECK-NEXT: br label [[FOR_BODY_TO_OUTLINE:%.*]] 107; CHECK: for.body_to_outline: 108; CHECK-NEXT: [[INC:%.*]] = add nsw i32 2, 1 109; CHECK-NEXT: br label [[FOR_COND1_EXITSTUB:%.*]] 110; CHECK: for.cond1.exitStub: 111; CHECK-NEXT: ret void 112; 113