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