xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/rot-02.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test removal of AND operations that don't affect last 6 bits of rotate amount
2*9880d681SAndroid Build Coastguard Worker; operand.
3*9880d681SAndroid Build Coastguard Worker;
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Test that AND is not removed when some lower 6 bits are not set.
7*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %val, i32 %amt) {
8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
9*9880d681SAndroid Build Coastguard Worker; CHECK: nil{{[lf]}} %r3, 31
10*9880d681SAndroid Build Coastguard Worker; CHECK: rll %r2, %r2, 0(%r3)
11*9880d681SAndroid Build Coastguard Worker  %and = and i32 %amt, 31
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker  %inv = sub i32 32, %and
14*9880d681SAndroid Build Coastguard Worker  %parta = shl i32 %val, %and
15*9880d681SAndroid Build Coastguard Worker  %partb = lshr i32 %val, %inv
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker  %rotl = or i32 %parta, %partb
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker  ret i32 %rotl
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; Test removal of AND mask with only bottom 6 bits set.
23*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %val, i32 %amt) {
24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
25*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nil{{[lf]}} %r3, 63
26*9880d681SAndroid Build Coastguard Worker; CHECK: rll %r2, %r2, 0(%r3)
27*9880d681SAndroid Build Coastguard Worker  %and = and i32 %amt, 63
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker  %inv = sub i32 32, %and
30*9880d681SAndroid Build Coastguard Worker  %parta = shl i32 %val, %and
31*9880d681SAndroid Build Coastguard Worker  %partb = lshr i32 %val, %inv
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker  %rotl = or i32 %parta, %partb
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker  ret i32 %rotl
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; Test removal of AND mask including but not limited to bottom 6 bits.
39*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %val, i32 %amt) {
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
41*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nil{{[lf]}} %r3, 255
42*9880d681SAndroid Build Coastguard Worker; CHECK: rll %r2, %r2, 0(%r3)
43*9880d681SAndroid Build Coastguard Worker  %and = and i32 %amt, 255
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker  %inv = sub i32 32, %and
46*9880d681SAndroid Build Coastguard Worker  %parta = shl i32 %val, %and
47*9880d681SAndroid Build Coastguard Worker  %partb = lshr i32 %val, %inv
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker  %rotl = or i32 %parta, %partb
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker  ret i32 %rotl
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; Test removal of AND mask from RLLG.
55*9880d681SAndroid Build Coastguard Workerdefine i64 @f4(i64 %val, i64 %amt) {
56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
57*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nil{{[lf]}} %r3, 63
58*9880d681SAndroid Build Coastguard Worker; CHECK: rllg %r2, %r2, 0(%r3)
59*9880d681SAndroid Build Coastguard Worker  %and = and i64 %amt, 63
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker  %inv = sub i64 64, %and
62*9880d681SAndroid Build Coastguard Worker  %parta = shl i64 %val, %and
63*9880d681SAndroid Build Coastguard Worker  %partb = lshr i64 %val, %inv
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker  %rotl = or i64 %parta, %partb
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker  ret i64 %rotl
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker; Test that AND is not entirely removed if the result is reused.
71*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32 %val, i32 %amt) {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
73*9880d681SAndroid Build Coastguard Worker; CHECK: rll %r2, %r2, 0(%r3)
74*9880d681SAndroid Build Coastguard Worker; CHECK: nil{{[lf]}} %r3, 63
75*9880d681SAndroid Build Coastguard Worker; CHECK: ar %r2, %r3
76*9880d681SAndroid Build Coastguard Worker  %and = and i32 %amt, 63
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker  %inv = sub i32 32, %and
79*9880d681SAndroid Build Coastguard Worker  %parta = shl i32 %val, %and
80*9880d681SAndroid Build Coastguard Worker  %partb = lshr i32 %val, %inv
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker  %rotl = or i32 %parta, %partb
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  %reuse = add i32 %and, %rotl
85*9880d681SAndroid Build Coastguard Worker  ret i32 %reuse
86*9880d681SAndroid Build Coastguard Worker}
87