1cce473e0SAndrew 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 3cce473e0SAndrew Litteken 4cce473e0SAndrew Litteken; This test checks that floating point commutative instructions are not treated 5cce473e0SAndrew Litteken; as commutative. Even though an ffadd is technically commutative, the order 6cce473e0SAndrew Litteken; of operands still needs to be enforced since the process of fadding floating 7cce473e0SAndrew Litteken; point values requires the order to be the same. 8cce473e0SAndrew Litteken 9cce473e0SAndrew Litteken; We make sure that we outline the identical regions from the first two 10cce473e0SAndrew Litteken; functions, but not the third. this is because the operands are in a different 11cce473e0SAndrew Litteken; order in a floating point instruction in this section. 12cce473e0SAndrew Litteken 13cce473e0SAndrew Littekendefine void @outline_from_fadd1() { 14cce473e0SAndrew Litteken; CHECK-LABEL: @outline_from_fadd1( 15cce473e0SAndrew Litteken; CHECK-NEXT: entry: 16cce473e0SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca double, align 4 17cce473e0SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca double, align 4 18cce473e0SAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca double, align 4 19*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]]) 20cce473e0SAndrew Litteken; CHECK-NEXT: ret void 21cce473e0SAndrew Litteken; 22cce473e0SAndrew Littekenentry: 23cce473e0SAndrew Litteken %a = alloca double, align 4 24cce473e0SAndrew Litteken %b = alloca double, align 4 25cce473e0SAndrew Litteken %c = alloca double, align 4 26*f4b925eeSMatt Arsenault store double 2.0, ptr %a, align 4 27*f4b925eeSMatt Arsenault store double 3.0, ptr %b, align 4 28*f4b925eeSMatt Arsenault store double 4.0, ptr %c, align 4 29*f4b925eeSMatt Arsenault %al = load double, ptr %a 30*f4b925eeSMatt Arsenault %bl = load double, ptr %b 31*f4b925eeSMatt Arsenault %cl = load double, ptr %c 32cce473e0SAndrew Litteken %0 = fadd double %al, %bl 33cce473e0SAndrew Litteken %1 = fadd double %al, %cl 34cce473e0SAndrew Litteken %2 = fadd double %bl, %cl 35cce473e0SAndrew Litteken ret void 36cce473e0SAndrew Litteken} 37cce473e0SAndrew Litteken 38cce473e0SAndrew Littekendefine void @outline_from_fadd2.0() { 39cce473e0SAndrew Litteken; CHECK-LABEL: @outline_from_fadd2.0( 40cce473e0SAndrew Litteken; CHECK-NEXT: entry: 41cce473e0SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca double, align 4 42cce473e0SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca double, align 4 43cce473e0SAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca double, align 4 44*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]]) 45cce473e0SAndrew Litteken; CHECK-NEXT: ret void 46cce473e0SAndrew Litteken; 47cce473e0SAndrew Littekenentry: 48cce473e0SAndrew Litteken %a = alloca double, align 4 49cce473e0SAndrew Litteken %b = alloca double, align 4 50cce473e0SAndrew Litteken %c = alloca double, align 4 51*f4b925eeSMatt Arsenault store double 2.0, ptr %a, align 4 52*f4b925eeSMatt Arsenault store double 3.0, ptr %b, align 4 53*f4b925eeSMatt Arsenault store double 4.0, ptr %c, align 4 54*f4b925eeSMatt Arsenault %al = load double, ptr %a 55*f4b925eeSMatt Arsenault %bl = load double, ptr %b 56*f4b925eeSMatt Arsenault %cl = load double, ptr %c 57cce473e0SAndrew Litteken %0 = fadd double %al, %bl 58cce473e0SAndrew Litteken %1 = fadd double %al, %cl 59cce473e0SAndrew Litteken %2 = fadd double %bl, %cl 60cce473e0SAndrew Litteken ret void 61cce473e0SAndrew Litteken} 62cce473e0SAndrew Litteken 63cce473e0SAndrew Littekendefine void @outline_from_flipped_fadd3.0() { 64cce473e0SAndrew Litteken; CHECK-LABEL: @outline_from_flipped_fadd3.0( 65cce473e0SAndrew Litteken; CHECK-NEXT: entry: 66cce473e0SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca double, align 4 67cce473e0SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca double, align 4 68cce473e0SAndrew Litteken; CHECK-NEXT: [[C:%.*]] = alloca double, align 4 69*f4b925eeSMatt Arsenault; CHECK-NEXT: store double 2.000000e+00, ptr [[A]], align 4 70*f4b925eeSMatt Arsenault; CHECK-NEXT: store double 3.000000e+00, ptr [[B]], align 4 71*f4b925eeSMatt Arsenault; CHECK-NEXT: store double 4.000000e+00, ptr [[C]], align 4 72*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AL:%.*]] = load double, ptr [[A]], align 8 73*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BL:%.*]] = load double, ptr [[B]], align 8 74*f4b925eeSMatt Arsenault; CHECK-NEXT: [[CL:%.*]] = load double, ptr [[C]], align 8 75cce473e0SAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = fadd double [[BL]], [[AL]] 76cce473e0SAndrew Litteken; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[CL]], [[AL]] 77cce473e0SAndrew Litteken; CHECK-NEXT: [[TMP2:%.*]] = fadd double [[CL]], [[BL]] 78cce473e0SAndrew Litteken; CHECK-NEXT: ret void 79cce473e0SAndrew Litteken; 80cce473e0SAndrew Littekenentry: 81cce473e0SAndrew Litteken %a = alloca double, align 4 82cce473e0SAndrew Litteken %b = alloca double, align 4 83cce473e0SAndrew Litteken %c = alloca double, align 4 84*f4b925eeSMatt Arsenault store double 2.0, ptr %a, align 4 85*f4b925eeSMatt Arsenault store double 3.0, ptr %b, align 4 86*f4b925eeSMatt Arsenault store double 4.0, ptr %c, align 4 87*f4b925eeSMatt Arsenault %al = load double, ptr %a 88*f4b925eeSMatt Arsenault %bl = load double, ptr %b 89*f4b925eeSMatt Arsenault %cl = load double, ptr %c 90cce473e0SAndrew Litteken %0 = fadd double %bl, %al 91cce473e0SAndrew Litteken %1 = fadd double %cl, %al 92cce473e0SAndrew Litteken %2 = fadd double %cl, %bl 93cce473e0SAndrew Litteken ret void 94cce473e0SAndrew Litteken} 95cce473e0SAndrew Litteken 96*f4b925eeSMatt Arsenault; CHECK: define internal void @outlined_ir_func_0(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) #0 { 97cce473e0SAndrew Litteken; CHECK: entry_to_outline: 98*f4b925eeSMatt Arsenault; CHECK-NEXT: store double 2.000000e+00, ptr [[ARG0]], align 4 99*f4b925eeSMatt Arsenault; CHECK-NEXT: store double 3.000000e+00, ptr [[ARG1]], align 4 100*f4b925eeSMatt Arsenault; CHECK-NEXT: store double 4.000000e+00, ptr [[ARG2]], align 4 101*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AL:%.*]] = load double, ptr [[ARG0]], align 8 102*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BL:%.*]] = load double, ptr [[ARG1]], align 8 103*f4b925eeSMatt Arsenault; CHECK-NEXT: [[CL:%.*]] = load double, ptr [[ARG2]], align 8 104cce473e0SAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = fadd double [[AL]], [[BL]] 105cce473e0SAndrew Litteken; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[AL]], [[CL]] 106cce473e0SAndrew Litteken; CHECK-NEXT: [[TMP2:%.*]] = fadd double [[BL]], [[CL]] 107cce473e0SAndrew Litteken 108