1*47f52821SAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*47f52821SAndrew Litteken; RUN: opt -S -p iroutliner,verify -ir-outlining-no-cost < %s | FileCheck %s 3*47f52821SAndrew Litteken 4*47f52821SAndrew Litteken; This test checks that commutative instructions where the operands are 5*47f52821SAndrew Litteken; swapped are outlined as the same function. 6*47f52821SAndrew Litteken 7*47f52821SAndrew Litteken; It also checks that non-commutative instructions outlined as different 8*47f52821SAndrew Litteken; functions when the operands are swapped; 9*47f52821SAndrew Litteken 10*47f52821SAndrew Litteken; These are identical functions, except that in the flipped functions, 11*47f52821SAndrew Litteken; the operands in the adds are commuted. However, since add instructions 12*47f52821SAndrew Litteken; are commutative, we should still outline from all four as the same 13*47f52821SAndrew Litteken; instruction. 14*47f52821SAndrew Litteken 15*47f52821SAndrew Littekendefine void @function1(i32 %a, i32 %b) { 16*47f52821SAndrew Litteken; CHECK-LABEL: @function1( 17*47f52821SAndrew Litteken; CHECK-NEXT: entry: 18*47f52821SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_1:%.*]] 19*47f52821SAndrew Litteken; CHECK: block_0: 20*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[A:%.*]], [[B:%.*]] 21*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[TMP4:%.*]], 1 22*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP0]], [[TMP0]] 23*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP0]] 24*47f52821SAndrew Litteken; CHECK-NEXT: br i1 [[TMP3]], label [[BLOCK_1]], label [[BLOCK_2:%.*]] 25*47f52821SAndrew Litteken; CHECK: block_1: 26*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP4]] = phi i32 [ [[TMP1]], [[BLOCK_0:%.*]] ], [ 0, [[ENTRY:%.*]] ] 27*47f52821SAndrew Litteken; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[B]]) 28*47f52821SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_0]] 29*47f52821SAndrew Litteken; CHECK: block_2: 30*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP2]], [[TMP2]] 31*47f52821SAndrew Litteken; CHECK-NEXT: ret void 32*47f52821SAndrew Litteken; 33*47f52821SAndrew Littekenentry: 34*47f52821SAndrew Litteken br label %block_1 35*47f52821SAndrew Litteken 36*47f52821SAndrew Littekenblock_0: 37*47f52821SAndrew Litteken %0 = add i32 %a, %b 38*47f52821SAndrew Litteken %1 = add i32 %4, 1 39*47f52821SAndrew Litteken %2 = add i32 %0, %0 40*47f52821SAndrew Litteken %3 = icmp sgt i32 %0, %0 41*47f52821SAndrew Litteken br i1 %3, label %block_1, label %block_2 42*47f52821SAndrew Litteken 43*47f52821SAndrew Littekenblock_1: 44*47f52821SAndrew Litteken %4 = phi i32 [ %1, %block_0 ], [ 0, %entry ] 45*47f52821SAndrew Litteken %5 = add i32 %b, %b 46*47f52821SAndrew Litteken br label %block_0 47*47f52821SAndrew Litteken 48*47f52821SAndrew Littekenblock_2: 49*47f52821SAndrew Litteken %6 = add i32 %2, %2 50*47f52821SAndrew Litteken ret void 51*47f52821SAndrew Litteken} 52*47f52821SAndrew Litteken 53*47f52821SAndrew Littekendefine void @function2(i32 %a, i32 %b) { 54*47f52821SAndrew Litteken; CHECK-LABEL: @function2( 55*47f52821SAndrew Litteken; CHECK-NEXT: entry: 56*47f52821SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_1:%.*]] 57*47f52821SAndrew Litteken; CHECK: block_0: 58*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = sub i32 [[A:%.*]], [[B:%.*]] 59*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP1:%.*]] = add i32 1, [[TMP4:%.*]] 60*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP0]], [[TMP0]] 61*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP0]] 62*47f52821SAndrew Litteken; CHECK-NEXT: br i1 [[TMP3]], label [[BLOCK_1]], label [[BLOCK_2:%.*]] 63*47f52821SAndrew Litteken; CHECK: block_1: 64*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP4]] = phi i32 [ [[TMP1]], [[BLOCK_0:%.*]] ], [ 0, [[ENTRY:%.*]] ] 65*47f52821SAndrew Litteken; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[B]]) 66*47f52821SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_0]] 67*47f52821SAndrew Litteken; CHECK: block_2: 68*47f52821SAndrew Litteken; CHECK-NEXT: [[TMP5:%.*]] = sub i32 [[TMP2]], [[TMP2]] 69*47f52821SAndrew Litteken; CHECK-NEXT: ret void 70*47f52821SAndrew Litteken; 71*47f52821SAndrew Littekenentry: 72*47f52821SAndrew Litteken br label %block_1 73*47f52821SAndrew Litteken 74*47f52821SAndrew Littekenblock_0: 75*47f52821SAndrew Litteken %0 = sub i32 %a, %b 76*47f52821SAndrew Litteken %1 = add i32 1, %4 77*47f52821SAndrew Litteken %2 = add i32 %0, %0 78*47f52821SAndrew Litteken %3 = icmp sgt i32 %0, %0 79*47f52821SAndrew Litteken br i1 %3, label %block_1, label %block_2 80*47f52821SAndrew Litteken 81*47f52821SAndrew Littekenblock_1: 82*47f52821SAndrew Litteken %4 = phi i32 [ %1, %block_0 ], [ 0, %entry ] 83*47f52821SAndrew Litteken %5 = add i32 %b, %b 84*47f52821SAndrew Litteken br label %block_0 85*47f52821SAndrew Litteken 86*47f52821SAndrew Littekenblock_2: 87*47f52821SAndrew Litteken %6 = sub i32 %2, %2 88*47f52821SAndrew Litteken ret void 89*47f52821SAndrew Litteken} 90