Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc -mtriple=aarch64 < %s | FileCheck %s
      2 
      3 ; Check that we optimize out AND instructions and ADD/SUB instructions
      4 ; modulo the shift size to take advantage of the implicit mod done on
      5 ; the shift amount value by the variable shift/rotate instructions.
      6 
      7 define i32 @test1(i32 %x, i64 %y) {
      8 ; CHECK-LABEL: test1:
      9 ; CHECK-NOT: and
     10 ; CHECK: lsr
     11   %sh_prom = trunc i64 %y to i32
     12   %shr = lshr i32 %x, %sh_prom
     13   ret i32 %shr
     14 }
     15 
     16 define i64 @test2(i32 %x, i64 %y) {
     17 ; CHECK-LABEL: test2:
     18 ; CHECK-NOT: orr
     19 ; CHECK-NOT: sub
     20 ; CHECK: neg
     21 ; CHECK: asr
     22   %sub9 = sub nsw i32 64, %x
     23   %sh_prom12.i = zext i32 %sub9 to i64
     24   %shr.i = ashr i64 %y, %sh_prom12.i
     25   ret i64 %shr.i
     26 }
     27 
     28 define i64 @test3(i64 %x, i64 %y) {
     29 ; CHECK-LABEL: test3:
     30 ; CHECK-NOT: add
     31 ; CHECK: lsl
     32   %add = add nsw i64 64, %x
     33   %shl = shl i64 %y, %add
     34   ret i64 %shl
     35 }