1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s 3 4; This has two compatible regions based on function attributes. We have 5; attributes that should be transferred only if it is on all of the regions. 6 7; This includes the attributes, no-nans-fp-math, 8; no-signed-zeros-fp-math, less-precise-fpmad, unsafe-fp-math, and 9; no-infs-fp-math. Only when each instance of similarity has these attributes 10; can we say that the outlined function can have these attributes since that 11; is the more general case for these attributes. 12 13define void @outline_attrs1() #0 { 14; CHECK-LABEL: @outline_attrs1( 15; CHECK-NEXT: entry: 16; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 17; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 18; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 19; CHECK-NEXT: call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]]) 20; CHECK-NEXT: ret void 21; 22entry: 23 %a = alloca i32, align 4 24 %b = alloca i32, align 4 25 %c = alloca i32, align 4 26 store i32 2, ptr %a, align 4 27 store i32 3, ptr %b, align 4 28 store i32 4, ptr %c, align 4 29 %al = load i32, ptr %a 30 %bl = load i32, ptr %b 31 %cl = load i32, ptr %c 32 ret void 33} 34 35define void @outline_attrs2() #0 { 36; CHECK-LABEL: @outline_attrs2( 37; CHECK-NEXT: entry: 38; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 39; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 40; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 41; CHECK-NEXT: call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]]) 42; CHECK-NEXT: ret void 43; 44entry: 45 %a = alloca i32, align 4 46 %b = alloca i32, align 4 47 %c = alloca i32, align 4 48 store i32 2, ptr %a, align 4 49 store i32 3, ptr %b, align 4 50 store i32 4, ptr %c, align 4 51 %al = load i32, ptr %a 52 %bl = load i32, ptr %b 53 %cl = load i32, ptr %c 54 ret void 55} 56 57define void @outline_attrs3() #0 { 58; CHECK-LABEL: @outline_attrs3( 59; CHECK-NEXT: entry: 60; CHECK-NEXT: [[A:%.*]] = alloca float, align 4 61; CHECK-NEXT: [[B:%.*]] = alloca float, align 4 62; CHECK-NEXT: [[C:%.*]] = alloca float, align 4 63; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]]) 64; CHECK-NEXT: ret void 65; 66entry: 67 %a = alloca float, align 4 68 %b = alloca float, align 4 69 %c = alloca float, align 4 70 store float 2.0, ptr %a, align 4 71 store float 3.0, ptr %b, align 4 72 store float 4.0, ptr %c, align 4 73 %al = load float, ptr %a 74 %bl = load float, ptr %b 75 %cl = load float, ptr %c 76 %0 = fmul float %al, %bl 77 ret void 78} 79 80define void @outline_attrs4() { 81; CHECK-LABEL: @outline_attrs4( 82; CHECK-NEXT: entry: 83; CHECK-NEXT: [[A:%.*]] = alloca float, align 4 84; CHECK-NEXT: [[B:%.*]] = alloca float, align 4 85; CHECK-NEXT: [[C:%.*]] = alloca float, align 4 86; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]]) 87; CHECK-NEXT: ret void 88; 89entry: 90 %a = alloca float, align 4 91 %b = alloca float, align 4 92 %c = alloca float, align 4 93 store float 2.0, ptr %a, align 4 94 store float 3.0, ptr %b, align 4 95 store float 4.0, ptr %c, align 4 96 %al = load float, ptr %a 97 %bl = load float, ptr %b 98 %cl = load float, ptr %c 99 %0 = fmul float %al, %bl 100 ret void 101} 102 103attributes #0 = { "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "less-precise-fpmad"="true" 104"unsafe-fp-math"="true" "no-infs-fp-math"="true"} 105 106; CHECK: define internal void @outlined_ir_func_0(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) [[ATTR1:#[0-9]+]] { 107; CHECK: entry_to_outline: 108; CHECK-NEXT: store float 2.000000e+00, ptr [[ARG0]], align 4 109; CHECK-NEXT: store float 3.000000e+00, ptr [[ARG1]], align 4 110; CHECK-NEXT: store float 4.000000e+00, ptr [[ARG2]], align 4 111; CHECK-NEXT: [[AL:%.*]] = load float, ptr [[ARG0]], align 4 112; CHECK-NEXT: [[BL:%.*]] = load float, ptr [[ARG1]], align 4 113; CHECK-NEXT: [[CL:%.*]] = load float, ptr [[ARG2]], align 4 114 115; CHECK: define internal void @outlined_ir_func_1(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) [[ATTR:#[0-9]+]] { 116; CHECK: entry_to_outline: 117; CHECK-NEXT: store i32 2, ptr [[ARG0]], align 4 118; CHECK-NEXT: store i32 3, ptr [[ARG1]], align 4 119; CHECK-NEXT: store i32 4, ptr [[ARG2]], align 4 120; CHECK-NEXT: [[AL:%.*]] = load i32, ptr [[ARG0]], align 4 121; CHECK-NEXT: [[BL:%.*]] = load i32, ptr [[ARG1]], align 4 122; CHECK-NEXT: [[CL:%.*]] = load i32, ptr [[ARG2]], align 4 123 124 125; CHECK: attributes [[ATTR1]] = { minsize optsize "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "unsafe-fp-math"="false" } 126; CHECK: attributes [[ATTR]] = { minsize optsize "less-precise-fpmad"="true" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "unsafe-fp-math"="true" } 127