1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; Test removal of AND operations that don't affect last 6 bits of rotate amount
3; operand.
4;
5; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
6
7; Test that AND is not removed when some lower 5 bits are not set.
8define i32 @f1(i32 %val, i32 %amt) {
9; CHECK-LABEL: f1:
10; CHECK:       # %bb.0:
11; CHECK-NEXT:    nill %r3, 15
12; CHECK-NEXT:    rll %r2, %r2, 0(%r3)
13; CHECK-NEXT:    br %r14
14  %and = and i32 %amt, 15
15
16  %inv = sub i32 32, %and
17  %parta = shl i32 %val, %and
18  %partb = lshr i32 %val, %inv
19
20  %rotl = or i32 %parta, %partb
21
22  ret i32 %rotl
23}
24
25; Test removal of AND mask with only bottom 6 bits set.
26define i32 @f2(i32 %val, i32 %amt) {
27; CHECK-LABEL: f2:
28; CHECK:       # %bb.0:
29; CHECK-NEXT:    rll %r2, %r2, 0(%r3)
30; CHECK-NEXT:    br %r14
31  %and = and i32 %amt, 63
32
33  %inv = sub i32 32, %and
34  %parta = shl i32 %val, %and
35  %partb = lshr i32 %val, %inv
36
37  %rotl = or i32 %parta, %partb
38
39  ret i32 %rotl
40}
41
42; Test removal of AND mask including but not limited to bottom 6 bits.
43define i32 @f3(i32 %val, i32 %amt) {
44; CHECK-LABEL: f3:
45; CHECK:       # %bb.0:
46; CHECK-NEXT:    rll %r2, %r2, 0(%r3)
47; CHECK-NEXT:    br %r14
48  %and = and i32 %amt, 255
49
50  %inv = sub i32 32, %and
51  %parta = shl i32 %val, %and
52  %partb = lshr i32 %val, %inv
53
54  %rotl = or i32 %parta, %partb
55
56  ret i32 %rotl
57}
58
59; Test removal of AND mask from RLLG.
60define i64 @f4(i64 %val, i64 %amt) {
61; CHECK-LABEL: f4:
62; CHECK:       # %bb.0:
63; CHECK-NEXT:    rllg %r2, %r2, 0(%r3)
64; CHECK-NEXT:    br %r14
65  %and = and i64 %amt, 63
66
67  %inv = sub i64 64, %and
68  %parta = shl i64 %val, %and
69  %partb = lshr i64 %val, %inv
70
71  %rotl = or i64 %parta, %partb
72
73  ret i64 %rotl
74}
75
76; Test that AND is not entirely removed if the result is reused.
77define i32 @f5(i32 %val, i32 %amt) {
78; CHECK-LABEL: f5:
79; CHECK:       # %bb.0:
80; CHECK-NEXT:    rll %r2, %r2, 0(%r3)
81; CHECK-NEXT:    nilf %r3, 63
82; CHECK-NEXT:    ar %r2, %r3
83; CHECK-NEXT:    br %r14
84  %and = and i32 %amt, 63
85
86  %inv = sub i32 32, %and
87  %parta = shl i32 %val, %and
88  %partb = lshr i32 %val, %inv
89
90  %rotl = or i32 %parta, %partb
91
92  %reuse = add i32 %and, %rotl
93  ret i32 %reuse
94}
95