11a9eb19aSAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 29dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s 31a9eb19aSAndrew Litteken 41a9eb19aSAndrew Litteken; This has two compatible regions based on function attributes. We have 51a9eb19aSAndrew Litteken; attributes that should be transferred only if it is on all of the regions. 61a9eb19aSAndrew Litteken 71a9eb19aSAndrew Litteken; This includes the attributes, no-nans-fp-math, 81a9eb19aSAndrew Litteken; no-signed-zeros-fp-math, less-precise-fpmad, unsafe-fp-math, and 91a9eb19aSAndrew Litteken; no-infs-fp-math. Only when each instance of similarity has these attributes 101a9eb19aSAndrew Litteken; can we say that the outlined function can have these attributes since that 111a9eb19aSAndrew Litteken; is the more general case for these attributes. 121a9eb19aSAndrew Litteken 131a9eb19aSAndrew Littekendefine void @outline_attrs1() #0 { 141a9eb19aSAndrew Litteken; CHECK-LABEL: @outline_attrs1( 151a9eb19aSAndrew Litteken; CHECK-NEXT: entry: 161a9eb19aSAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 171a9eb19aSAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 181a9eb19aSAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 19*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]]) 201a9eb19aSAndrew Litteken; CHECK-NEXT: ret void 211a9eb19aSAndrew Litteken; 221a9eb19aSAndrew Littekenentry: 231a9eb19aSAndrew Litteken %a = alloca i32, align 4 241a9eb19aSAndrew Litteken %b = alloca i32, align 4 251a9eb19aSAndrew Litteken %c = alloca i32, align 4 26*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 27*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 28*f4b925eeSMatt Arsenault store i32 4, ptr %c, align 4 29*f4b925eeSMatt Arsenault %al = load i32, ptr %a 30*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 31*f4b925eeSMatt Arsenault %cl = load i32, ptr %c 321a9eb19aSAndrew Litteken ret void 331a9eb19aSAndrew Litteken} 341a9eb19aSAndrew Litteken 351a9eb19aSAndrew Littekendefine void @outline_attrs2() #0 { 361a9eb19aSAndrew Litteken; CHECK-LABEL: @outline_attrs2( 371a9eb19aSAndrew Litteken; CHECK-NEXT: entry: 381a9eb19aSAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 391a9eb19aSAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 401a9eb19aSAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 41*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]]) 421a9eb19aSAndrew Litteken; CHECK-NEXT: ret void 431a9eb19aSAndrew Litteken; 441a9eb19aSAndrew Littekenentry: 451a9eb19aSAndrew Litteken %a = alloca i32, align 4 461a9eb19aSAndrew Litteken %b = alloca i32, align 4 471a9eb19aSAndrew Litteken %c = alloca i32, align 4 48*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 49*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 50*f4b925eeSMatt Arsenault store i32 4, ptr %c, align 4 51*f4b925eeSMatt Arsenault %al = load i32, ptr %a 52*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 53*f4b925eeSMatt Arsenault %cl = load i32, ptr %c 541a9eb19aSAndrew Litteken ret void 551a9eb19aSAndrew Litteken} 561a9eb19aSAndrew Litteken 571a9eb19aSAndrew Littekendefine void @outline_attrs3() #0 { 581a9eb19aSAndrew Litteken; CHECK-LABEL: @outline_attrs3( 591a9eb19aSAndrew Litteken; CHECK-NEXT: entry: 601a9eb19aSAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca float, align 4 611a9eb19aSAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca float, align 4 621a9eb19aSAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca float, align 4 63*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]]) 641a9eb19aSAndrew Litteken; CHECK-NEXT: ret void 651a9eb19aSAndrew Litteken; 661a9eb19aSAndrew Littekenentry: 671a9eb19aSAndrew Litteken %a = alloca float, align 4 681a9eb19aSAndrew Litteken %b = alloca float, align 4 691a9eb19aSAndrew Litteken %c = alloca float, align 4 70*f4b925eeSMatt Arsenault store float 2.0, ptr %a, align 4 71*f4b925eeSMatt Arsenault store float 3.0, ptr %b, align 4 72*f4b925eeSMatt Arsenault store float 4.0, ptr %c, align 4 73*f4b925eeSMatt Arsenault %al = load float, ptr %a 74*f4b925eeSMatt Arsenault %bl = load float, ptr %b 75*f4b925eeSMatt Arsenault %cl = load float, ptr %c 761a9eb19aSAndrew Litteken %0 = fmul float %al, %bl 771a9eb19aSAndrew Litteken ret void 781a9eb19aSAndrew Litteken} 791a9eb19aSAndrew Litteken 801a9eb19aSAndrew Littekendefine void @outline_attrs4() { 811a9eb19aSAndrew Litteken; CHECK-LABEL: @outline_attrs4( 821a9eb19aSAndrew Litteken; CHECK-NEXT: entry: 831a9eb19aSAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca float, align 4 841a9eb19aSAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca float, align 4 851a9eb19aSAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca float, align 4 86*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]]) 871a9eb19aSAndrew Litteken; CHECK-NEXT: ret void 881a9eb19aSAndrew Litteken; 891a9eb19aSAndrew Littekenentry: 901a9eb19aSAndrew Litteken %a = alloca float, align 4 911a9eb19aSAndrew Litteken %b = alloca float, align 4 921a9eb19aSAndrew Litteken %c = alloca float, align 4 93*f4b925eeSMatt Arsenault store float 2.0, ptr %a, align 4 94*f4b925eeSMatt Arsenault store float 3.0, ptr %b, align 4 95*f4b925eeSMatt Arsenault store float 4.0, ptr %c, align 4 96*f4b925eeSMatt Arsenault %al = load float, ptr %a 97*f4b925eeSMatt Arsenault %bl = load float, ptr %b 98*f4b925eeSMatt Arsenault %cl = load float, ptr %c 991a9eb19aSAndrew Litteken %0 = fmul float %al, %bl 1001a9eb19aSAndrew Litteken ret void 1011a9eb19aSAndrew Litteken} 1021a9eb19aSAndrew Litteken 1031a9eb19aSAndrew Littekenattributes #0 = { "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "less-precise-fpmad"="true" 1041a9eb19aSAndrew Litteken"unsafe-fp-math"="true" "no-infs-fp-math"="true"} 1051a9eb19aSAndrew Litteken 106*f4b925eeSMatt Arsenault; CHECK: define internal void @outlined_ir_func_0(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) [[ATTR1:#[0-9]+]] { 1071a9eb19aSAndrew Litteken; CHECK: entry_to_outline: 108*f4b925eeSMatt Arsenault; CHECK-NEXT: store float 2.000000e+00, ptr [[ARG0]], align 4 109*f4b925eeSMatt Arsenault; CHECK-NEXT: store float 3.000000e+00, ptr [[ARG1]], align 4 110*f4b925eeSMatt Arsenault; CHECK-NEXT: store float 4.000000e+00, ptr [[ARG2]], align 4 111*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AL:%.*]] = load float, ptr [[ARG0]], align 4 112*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BL:%.*]] = load float, ptr [[ARG1]], align 4 113*f4b925eeSMatt Arsenault; CHECK-NEXT: [[CL:%.*]] = load float, ptr [[ARG2]], align 4 1141a9eb19aSAndrew Litteken 115*f4b925eeSMatt Arsenault; CHECK: define internal void @outlined_ir_func_1(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) [[ATTR:#[0-9]+]] { 1161a9eb19aSAndrew Litteken; CHECK: entry_to_outline: 117*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 2, ptr [[ARG0]], align 4 118*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 3, ptr [[ARG1]], align 4 119*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 4, ptr [[ARG2]], align 4 120*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AL:%.*]] = load i32, ptr [[ARG0]], align 4 121*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BL:%.*]] = load i32, ptr [[ARG1]], align 4 122*f4b925eeSMatt Arsenault; CHECK-NEXT: [[CL:%.*]] = load i32, ptr [[ARG2]], align 4 1231a9eb19aSAndrew Litteken 1241a9eb19aSAndrew Litteken 1251a9eb19aSAndrew Litteken; 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" } 1261a9eb19aSAndrew Litteken; 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