[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / prelegalizercombiner-br.mir
blob0647de44c4b812eba9620c35480d5d5be69b7ceb
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -debugify-and-strip-all-safe -O0 -run-pass=aarch64-prelegalizer-combiner --aarch64prelegalizercombinerhelper-only-enable-rule="opt_brcond_by_inverting_cond" -global-isel -verify-machineinstrs %s -o - | FileCheck %s
4 # Need asserts for the only-enable-rule to work.
6 # REQUIRES: asserts
8 --- |
9   target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
10   target triple = "arm64-apple-ios5.0.0"
12   define i32 @foo(i32 %a, i32 %b) {
13   entry:
14     %cmp = icmp sgt i32 %a, 0
15     br i1 %cmp, label %if.then, label %if.end
17   if.then:
18     %add = add nsw i32 %b, %a
19     %add1 = add nsw i32 %a, %b
20     br label %return
22   if.end:
23     %mul = mul nsw i32 %b, %b
24     %add2 = add nuw nsw i32 %mul, 2
25     br label %return
27   return:
28     %retval.0 = phi i32 [ %add1, %if.then ], [ %add2, %if.end ]
29     ret i32 %retval.0
30   }
32   define void @dont_combine_same_block() { ret void }
34 ...
35 ---
36 name:            foo
37 tracksRegLiveness: true
38 body:             |
39   ; CHECK-LABEL: name: foo
40   ; CHECK: bb.0.entry:
41   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
42   ; CHECK:   liveins: $w0, $w1
43   ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
44   ; CHECK:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
45   ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
46   ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
47   ; CHECK:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(sgt), [[COPY]](s32), [[C]]
48   ; CHECK:   [[C2:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
49   ; CHECK:   [[XOR:%[0-9]+]]:_(s1) = G_XOR [[ICMP]], [[C2]]
50   ; CHECK:   G_BRCOND [[XOR]](s1), %bb.2
51   ; CHECK:   G_BR %bb.1
52   ; CHECK: bb.1.if.then:
53   ; CHECK:   successors: %bb.3(0x80000000)
54   ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = nsw G_ADD [[COPY1]], [[COPY]]
55   ; CHECK:   [[ADD1:%[0-9]+]]:_(s32) = nsw G_ADD [[ADD]], [[COPY1]]
56   ; CHECK:   G_BR %bb.3
57   ; CHECK: bb.2.if.end:
58   ; CHECK:   successors: %bb.3(0x80000000)
59   ; CHECK:   [[MUL:%[0-9]+]]:_(s32) = nsw G_MUL [[COPY1]], [[COPY1]]
60   ; CHECK:   [[ADD2:%[0-9]+]]:_(s32) = nuw nsw G_ADD [[MUL]], [[C1]]
61   ; CHECK: bb.3.return:
62   ; CHECK:   [[PHI:%[0-9]+]]:_(s32) = G_PHI [[ADD1]](s32), %bb.1, [[ADD2]](s32), %bb.2
63   ; CHECK:   $w0 = COPY [[PHI]](s32)
64   ; CHECK:   RET_ReallyLR implicit $w0
65   bb.1.entry:
66     liveins: $w0, $w1
68     %0:_(s32) = COPY $w0
69     %1:_(s32) = COPY $w1
70     %2:_(s32) = G_CONSTANT i32 0
71     %5:_(s32) = G_CONSTANT i32 2
72     %3:_(s1) = G_ICMP intpred(sgt), %0(s32), %2
73     G_BRCOND %3(s1), %bb.2
74     G_BR %bb.3
76   bb.2.if.then:
77     %7:_(s32) = nsw G_ADD %1, %0
78     %8:_(s32) = nsw G_ADD %7, %1
79     G_BR %bb.4
81   bb.3.if.end:
82     %4:_(s32) = nsw G_MUL %1, %1
83     %6:_(s32) = nuw nsw G_ADD %4, %5
85   bb.4.return:
86     %10:_(s32) = G_PHI %8(s32), %bb.2, %6(s32), %bb.3
87     $w0 = COPY %10(s32)
88     RET_ReallyLR implicit $w0
90 ...
91 ---
92 name:            dont_combine_same_block
93 tracksRegLiveness: true
94 body:             |
95   ; CHECK-LABEL: name: dont_combine_same_block
96   ; CHECK: bb.0:
97   ; CHECK:   successors: %bb.1(0x80000000)
98   ; CHECK:   liveins: $w0, $w1
99   ; CHECK:   %cond:_(s1) = G_IMPLICIT_DEF
100   ; CHECK:   G_BRCOND %cond(s1), %bb.1
101   ; CHECK:   G_BR %bb.1
102   ; CHECK: bb.1:
103   ; CHECK:   RET_ReallyLR
104   bb.0:
105     liveins: $w0, $w1
106     %cond:_(s1) = G_IMPLICIT_DEF
108     ; The G_BRCOND and G_BR have the same target here. Don't change anything.
109     G_BRCOND %cond(s1), %bb.1
110     G_BR %bb.1
111   bb.1:
112     RET_ReallyLR