148ad8194SAndrew 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 348ad8194SAndrew Litteken 448ad8194SAndrew Litteken; This test checks the isomorphic comparisons can be outlined together into one 548ad8194SAndrew Litteken; function. 648ad8194SAndrew Litteken 748ad8194SAndrew Litteken; The following three function are identical, except that in the third, the 848ad8194SAndrew Litteken; operand order, and predicate are swapped, meaning it is structurally the same 948ad8194SAndrew Litteken; and should be outlined together. 1048ad8194SAndrew Litteken 1148ad8194SAndrew Littekendefine void @outline_slt1() { 1248ad8194SAndrew Litteken; CHECK-LABEL: @outline_slt1( 1348ad8194SAndrew Litteken; CHECK-NEXT: entry: 1448ad8194SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 1548ad8194SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 16*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_1(ptr [[A]], ptr [[B]]) 1748ad8194SAndrew Litteken; CHECK-NEXT: ret void 1848ad8194SAndrew Litteken; 1948ad8194SAndrew Littekenentry: 2048ad8194SAndrew Litteken %a = alloca i32, align 4 2148ad8194SAndrew Litteken %b = alloca i32, align 4 22*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 23*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 24*f4b925eeSMatt Arsenault %al = load i32, ptr %a 25*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 2648ad8194SAndrew Litteken %0 = icmp slt i32 %al, %bl 2748ad8194SAndrew Litteken ret void 2848ad8194SAndrew Litteken} 2948ad8194SAndrew Litteken 3048ad8194SAndrew Littekendefine void @outline_slt2() { 3148ad8194SAndrew Litteken; CHECK-LABEL: @outline_slt2( 3248ad8194SAndrew Litteken; CHECK-NEXT: entry: 3348ad8194SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 3448ad8194SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 35*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_1(ptr [[A]], ptr [[B]]) 3648ad8194SAndrew Litteken; CHECK-NEXT: ret void 3748ad8194SAndrew Litteken; 3848ad8194SAndrew Littekenentry: 3948ad8194SAndrew Litteken %a = alloca i32, align 4 4048ad8194SAndrew Litteken %b = alloca i32, align 4 41*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 42*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 43*f4b925eeSMatt Arsenault %al = load i32, ptr %a 44*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 4548ad8194SAndrew Litteken %0 = icmp slt i32 %al, %bl 4648ad8194SAndrew Litteken ret void 4748ad8194SAndrew Litteken} 4848ad8194SAndrew Litteken 4948ad8194SAndrew Littekendefine void @outline_sgt() { 5048ad8194SAndrew Litteken; CHECK-LABEL: @outline_sgt( 5148ad8194SAndrew Litteken; CHECK-NEXT: entry: 5248ad8194SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 5348ad8194SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 54*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_1(ptr [[A]], ptr [[B]]) 5548ad8194SAndrew Litteken; CHECK-NEXT: ret void 5648ad8194SAndrew Litteken; 5748ad8194SAndrew Littekenentry: 5848ad8194SAndrew Litteken %a = alloca i32, align 4 5948ad8194SAndrew Litteken %b = alloca i32, align 4 60*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 61*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 62*f4b925eeSMatt Arsenault %al = load i32, ptr %a 63*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 6448ad8194SAndrew Litteken %0 = icmp sgt i32 %bl, %al 6548ad8194SAndrew Litteken ret void 6648ad8194SAndrew Litteken} 6748ad8194SAndrew Litteken 6848ad8194SAndrew Litteken; This has a swapped predicate, but not swapped operands, so it cannot use 6948ad8194SAndrew Litteken; the same outlined function as the ones above. 7048ad8194SAndrew Litteken 7148ad8194SAndrew Littekendefine void @dontoutline_sgt() { 7248ad8194SAndrew Litteken; CHECK-LABEL: @dontoutline_sgt( 7348ad8194SAndrew Litteken; CHECK-NEXT: entry: 7448ad8194SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 7548ad8194SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 76*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 2, ptr [[A]], align 4 77*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 3, ptr [[B]], align 4 78*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AL:%.*]] = load i32, ptr [[A]], align 4 79*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BL:%.*]] = load i32, ptr [[B]], align 4 8048ad8194SAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[AL]], [[BL]] 8148ad8194SAndrew Litteken; CHECK-NEXT: ret void 8248ad8194SAndrew Litteken; 8348ad8194SAndrew Littekenentry: 8448ad8194SAndrew Litteken %a = alloca i32, align 4 8548ad8194SAndrew Litteken %b = alloca i32, align 4 86*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 87*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 88*f4b925eeSMatt Arsenault %al = load i32, ptr %a 89*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 9048ad8194SAndrew Litteken %0 = icmp sgt i32 %al, %bl 9148ad8194SAndrew Litteken ret void 9248ad8194SAndrew Litteken} 9348ad8194SAndrew Litteken 9448ad8194SAndrew Litteken; The below functions use a different kind of predicate that is not compatible 9548ad8194SAndrew Litteken; with the ones above, and should use a different outlined function. 9648ad8194SAndrew Litteken; The other difference here is that the predicate with swapped operands comes 9748ad8194SAndrew Litteken; first this time. 9848ad8194SAndrew Litteken 9948ad8194SAndrew Littekendefine void @outline_ugt1() { 10048ad8194SAndrew Litteken; CHECK-LABEL: @outline_ugt1( 10148ad8194SAndrew Litteken; CHECK-NEXT: entry: 10248ad8194SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 10348ad8194SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 104*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]]) 10548ad8194SAndrew Litteken; CHECK-NEXT: ret void 10648ad8194SAndrew Litteken; 10748ad8194SAndrew Littekenentry: 10848ad8194SAndrew Litteken %a = alloca i32, align 4 10948ad8194SAndrew Litteken %b = alloca i32, align 4 110*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 111*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 112*f4b925eeSMatt Arsenault %al = load i32, ptr %a 113*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 11448ad8194SAndrew Litteken %0 = icmp ugt i32 %al, %bl 11548ad8194SAndrew Litteken ret void 11648ad8194SAndrew Litteken} 11748ad8194SAndrew Litteken 11848ad8194SAndrew Littekendefine void @outline_ugt2() { 11948ad8194SAndrew Litteken; CHECK-LABEL: @outline_ugt2( 12048ad8194SAndrew Litteken; CHECK-NEXT: entry: 12148ad8194SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 12248ad8194SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 123*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]]) 12448ad8194SAndrew Litteken; CHECK-NEXT: ret void 12548ad8194SAndrew Litteken; 12648ad8194SAndrew Littekenentry: 12748ad8194SAndrew Litteken %a = alloca i32, align 4 12848ad8194SAndrew Litteken %b = alloca i32, align 4 129*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 130*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 131*f4b925eeSMatt Arsenault %al = load i32, ptr %a 132*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 13348ad8194SAndrew Litteken %0 = icmp ugt i32 %al, %bl 13448ad8194SAndrew Litteken ret void 13548ad8194SAndrew Litteken} 13648ad8194SAndrew Litteken 13748ad8194SAndrew Littekendefine void @outline_ult() { 13848ad8194SAndrew Litteken; CHECK-LABEL: @outline_ult( 13948ad8194SAndrew Litteken; CHECK-NEXT: entry: 14048ad8194SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 14148ad8194SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 142*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]]) 14348ad8194SAndrew Litteken; CHECK-NEXT: ret void 14448ad8194SAndrew Litteken; 14548ad8194SAndrew Littekenentry: 14648ad8194SAndrew Litteken %a = alloca i32, align 4 14748ad8194SAndrew Litteken %b = alloca i32, align 4 148*f4b925eeSMatt Arsenault store i32 2, ptr %a, align 4 149*f4b925eeSMatt Arsenault store i32 3, ptr %b, align 4 150*f4b925eeSMatt Arsenault %al = load i32, ptr %a 151*f4b925eeSMatt Arsenault %bl = load i32, ptr %b 15248ad8194SAndrew Litteken %0 = icmp ult i32 %bl, %al 15348ad8194SAndrew Litteken ret void 15448ad8194SAndrew Litteken} 15548ad8194SAndrew Litteken 156*f4b925eeSMatt Arsenault; CHECK: define internal void @outlined_ir_func_0(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]]) #0 { 15748ad8194SAndrew Litteken; CHECK: entry_to_outline: 158*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 2, ptr [[ARG0]], align 4 159*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 3, ptr [[ARG1]], align 4 160*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AL:%.*]] = load i32, ptr [[ARG0]], align 4 161*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BL:%.*]] = load i32, ptr [[ARG1]], align 4 16248ad8194SAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = icmp ugt i32 [[AL]], [[BL]] 16348ad8194SAndrew Litteken 164*f4b925eeSMatt Arsenault; CHECK: define internal void @outlined_ir_func_1(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]]) #0 { 16548ad8194SAndrew Litteken; CHECK: entry_to_outline: 166*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 2, ptr [[ARG0]], align 4 167*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 3, ptr [[ARG1]], align 4 168*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AL:%.*]] = load i32, ptr [[ARG0]], align 4 169*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BL:%.*]] = load i32, ptr [[ARG1]], align 4 17048ad8194SAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i32 [[AL]], [[BL]] 171