1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple aarch64 -run-pass=aarch64-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
4 # Check that we can fold a G_SEXT_INREG fed by a G_ASHR/G_LSHR into a G_SBFX.
8 name: sextinreg_ashr_to_sbfx
9 tracksRegLiveness: true
14 ; CHECK-LABEL: name: sextinreg_ashr_to_sbfx
16 ; CHECK: %x:_(s32) = COPY $w0
17 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 5
18 ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 10
19 ; CHECK: %sext_inreg:_(s32) = G_SBFX %x, %lsb(s32), [[C]]
20 ; CHECK: $w0 = COPY %sext_inreg(s32)
21 ; CHECK: RET_ReallyLR implicit $w0
23 %lsb:_(s32) = G_CONSTANT i32 5
24 %shift:_(s32) = G_ASHR %x, %lsb
25 %sext_inreg:_(s32) = G_SEXT_INREG %shift, 10
26 $w0 = COPY %sext_inreg
27 RET_ReallyLR implicit $w0
31 name: sextinreg_lshr_to_sbfx
32 tracksRegLiveness: true
37 ; CHECK-LABEL: name: sextinreg_lshr_to_sbfx
39 ; CHECK: %x:_(s32) = COPY $w0
40 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 5
41 ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 10
42 ; CHECK: %sext_inreg:_(s32) = G_SBFX %x, %lsb(s32), [[C]]
43 ; CHECK: $w0 = COPY %sext_inreg(s32)
44 ; CHECK: RET_ReallyLR implicit $w0
46 %lsb:_(s32) = G_CONSTANT i32 5
47 %shift:_(s32) = G_LSHR %x, %lsb
48 %sext_inreg:_(s32) = G_SEXT_INREG %shift, 10
49 $w0 = COPY %sext_inreg
50 RET_ReallyLR implicit $w0
55 name: dont_apply_no_constant
56 tracksRegLiveness: true
61 ; AArch64 needs a constant on the shift for this combine.
63 ; CHECK-LABEL: name: dont_apply_no_constant
65 ; CHECK: %x:_(s32) = COPY $w0
66 ; CHECK: %y:_(s32) = COPY $w0
67 ; CHECK: %shift:_(s32) = G_LSHR %x, %y(s32)
68 ; CHECK: %sext_inreg:_(s32) = G_SEXT_INREG %shift, 10
69 ; CHECK: $w0 = COPY %sext_inreg(s32)
70 ; CHECK: RET_ReallyLR implicit $w0
73 %shift:_(s32) = G_LSHR %x, %y
74 %sext_inreg:_(s32) = G_SEXT_INREG %shift, 10
75 $w0 = COPY %sext_inreg
76 RET_ReallyLR implicit $w0
80 name: dont_apply_shift_imm_too_large
81 tracksRegLiveness: true
87 ; LSB must be in 0-31.
89 ; CHECK-LABEL: name: dont_apply_shift_imm_too_large
91 ; CHECK: %x:_(s32) = COPY $w0
92 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 32
93 ; CHECK: %shift:_(s32) = G_ASHR %x, %lsb(s32)
94 ; CHECK: %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1
95 ; CHECK: $w0 = COPY %sext_inreg(s32)
96 ; CHECK: RET_ReallyLR implicit $w0
98 %lsb:_(s32) = G_CONSTANT i32 32
99 %shift:_(s32) = G_ASHR %x, %lsb
100 %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1
101 $w0 = COPY %sext_inreg
102 RET_ReallyLR implicit $w0
106 name: dont_apply_negative_shift_imm
107 tracksRegLiveness: true
113 ; LSB must be in 0-31.
115 ; CHECK-LABEL: name: dont_apply_negative_shift_imm
116 ; CHECK: liveins: $w0
117 ; CHECK: %x:_(s32) = COPY $w0
118 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 -1
119 ; CHECK: %shift:_(s32) = G_ASHR %x, %lsb(s32)
120 ; CHECK: %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1
121 ; CHECK: $w0 = COPY %sext_inreg(s32)
122 ; CHECK: RET_ReallyLR implicit $w0
124 %lsb:_(s32) = G_CONSTANT i32 -1
125 %shift:_(s32) = G_ASHR %x, %lsb
126 %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1
127 $w0 = COPY %sext_inreg
128 RET_ReallyLR implicit $w0
132 name: dont_apply_more_than_one_use
133 tracksRegLiveness: true
138 ; CHECK-LABEL: name: dont_apply_more_than_one_use
139 ; CHECK: liveins: $w0
140 ; CHECK: %x:_(s32) = COPY $w0
141 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 1
142 ; CHECK: %shift:_(s32) = G_ASHR %x, %lsb(s32)
143 ; CHECK: %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1
144 ; CHECK: %mul:_(s32) = G_MUL %shift, %sext_inreg
145 ; CHECK: $w0 = COPY %mul(s32)
146 ; CHECK: RET_ReallyLR implicit $w0
148 %lsb:_(s32) = G_CONSTANT i32 1
149 %shift:_(s32) = G_ASHR %x, %lsb
150 %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1
151 %mul:_(s32) = G_MUL %shift, %sext_inreg
153 RET_ReallyLR implicit $w0