[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AArch64 / GlobalISel / translate-constant-dag.ll
blobe86f9ff3ecdb4f1f994f12ea81b2b220138d19a4
1 ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 ; RUN: llc -mtriple aarch64 -O0 -stop-after=instruction-select -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s
4 %dag = type { { { i8, { i8 } }, { { i8, { i8 } }, { i8 } } }, { { i8, { i8 } }, { i8 } } }
6 define void @test_const(%dag* %dst) {
7   ; CHECK-LABEL: name: test_const
8   ; CHECK: bb.1.entry:
9   ; CHECK:   liveins: $x0
10   ; CHECK:   [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
11   ; CHECK:   [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 10
12   ; CHECK:   [[MOVi32imm1:%[0-9]+]]:gpr32 = MOVi32imm 20
13   ; CHECK:   [[MOVi32imm2:%[0-9]+]]:gpr32 = MOVi32imm 50
14   ; CHECK:   STRBBui [[MOVi32imm]], [[COPY]], 0 :: (store 1 into %ir.dst)
15   ; CHECK:   STRBBui [[MOVi32imm1]], [[COPY]], 1 :: (store 1 into %ir.dst + 1)
16   ; CHECK:   STRBBui [[MOVi32imm]], [[COPY]], 2 :: (store 1 into %ir.dst + 2)
17   ; CHECK:   STRBBui [[MOVi32imm1]], [[COPY]], 3 :: (store 1 into %ir.dst + 3)
18   ; CHECK:   STRBBui [[MOVi32imm2]], [[COPY]], 4 :: (store 1 into %ir.dst + 4)
19   ; CHECK:   STRBBui [[MOVi32imm]], [[COPY]], 5 :: (store 1 into %ir.dst + 5)
20   ; CHECK:   STRBBui [[MOVi32imm1]], [[COPY]], 6 :: (store 1 into %ir.dst + 6)
21   ; CHECK:   STRBBui [[MOVi32imm1]], [[COPY]], 7 :: (store 1 into %ir.dst + 7)
22   ; CHECK:   STRBBui [[MOVi32imm]], [[COPY]], 0 :: (store 1 into %ir.dst)
23   ; CHECK:   STRBBui [[MOVi32imm1]], [[COPY]], 1 :: (store 1 into %ir.dst + 1)
24   ; CHECK:   STRBBui [[MOVi32imm]], [[COPY]], 2 :: (store 1 into %ir.dst + 2)
25   ; CHECK:   STRBBui [[MOVi32imm1]], [[COPY]], 3 :: (store 1 into %ir.dst + 3)
26   ; CHECK:   STRBBui [[MOVi32imm1]], [[COPY]], 4 :: (store 1 into %ir.dst + 4)
27   ; CHECK:   STRBBui [[MOVi32imm]], [[COPY]], 5 :: (store 1 into %ir.dst + 5)
28   ; CHECK:   STRBBui [[MOVi32imm1]], [[COPY]], 6 :: (store 1 into %ir.dst + 6)
29   ; CHECK:   STRBBui [[MOVi32imm1]], [[COPY]], 7 :: (store 1 into %ir.dst + 7)
30   ; CHECK:   RET_ReallyLR
31 entry:
32  %updated = insertvalue
33    ; Check that we're visiting constants with shared parts
34    ; (deduplicated via LLVMContext, forming a proper DAG) correctly:
35    %dag {
36      { { i8, { i8 } }, { { i8, { i8 } }, { i8 } } } {
37        { i8, { i8 } } {
38          i8 10,
39          { i8 } { i8 20 }
40        },
41        { { i8, { i8 } }, { i8 } } {
42          { i8, { i8 } } {
43            i8 10,
44            { i8 } { i8 20 }
45          },
46          { i8 } { i8 20 }
47        }
48      },
49      { { i8, { i8 } }, { i8 } } {
50        { i8, { i8 } } {
51          i8 10,
52          { i8 } { i8 20 }
53        },
54        { i8 } { i8 20 }
55      }
56    },
57    { { i8, { i8 } }, { i8 } } {
58      { i8, { i8 } } {
59        i8 10,
60        { i8 } { i8 20 }
61      },
62      { i8 } { i8 50 }
63    },
64    0,
65    1
66  store %dag %updated, %dag* %dst
67  ; 10, 20, 10, 20, 50, 10, 20, 20 sequence is expected
69  store
70    ; Check that we didn't overwrite a previously seen constant
71    ; while processing an insertvalue into it:
72    %dag {
73      { { i8, { i8 } }, { { i8, { i8 } }, { i8 } } } {
74        { i8, { i8 } } {
75          i8 10,
76          { i8 } { i8 20 }
77        },
78        { { i8, { i8 } }, { i8 } } {
79          { i8, { i8 } } {
80            i8 10,
81            { i8 } { i8 20 }
82          },
83          { i8 } { i8 20 }
84        }
85      },
86      { { i8, { i8 } }, { i8 } } {
87        { i8, { i8 } } {
88          i8 10,
89          { i8 } { i8 20 }
90        },
91        { i8 } { i8 20 }
92      }
93    },
94    %dag* %dst
95  ; 10, 20, 10, 20, 20, 10, 20, 20 sequence is expected
96  ret void