xref: /llvm-project/llvm/test/Transforms/IROutliner/outlining-larger-size-commutative.ll (revision 47f528217ed82121882bcf2722c743360237c409)
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