forked from OSchip/llvm-project
35 lines
830 B
LLVM
35 lines
830 B
LLVM
|
; RUN: llc -mtriple=aarch64 < %s | FileCheck %s
|
||
|
|
||
|
; Check that we optimize out AND instructions and ADD/SUB instructions
|
||
|
; modulo the shift size to take advantage of the implicit mod done on
|
||
|
; the shift amount value by the variable shift/rotate instructions.
|
||
|
|
||
|
define i32 @test1(i32 %x, i64 %y) {
|
||
|
; CHECK-LABEL: test1:
|
||
|
; CHECK-NOT: and
|
||
|
; CHECK: lsr
|
||
|
%sh_prom = trunc i64 %y to i32
|
||
|
%shr = lshr i32 %x, %sh_prom
|
||
|
ret i32 %shr
|
||
|
}
|
||
|
|
||
|
define i64 @test2(i32 %x, i64 %y) {
|
||
|
; CHECK-LABEL: test2:
|
||
|
; CHECK-NOT: orr
|
||
|
; CHECK-NOT: sub
|
||
|
; CHECK: neg
|
||
|
; CHECK: asr
|
||
|
%sub9 = sub nsw i32 64, %x
|
||
|
%sh_prom12.i = zext i32 %sub9 to i64
|
||
|
%shr.i = ashr i64 %y, %sh_prom12.i
|
||
|
ret i64 %shr.i
|
||
|
}
|
||
|
|
||
|
define i64 @test3(i64 %x, i64 %y) {
|
||
|
; CHECK-LABEL: test3:
|
||
|
; CHECK-NOT: add
|
||
|
; CHECK: lsl
|
||
|
%add = add nsw i64 64, %x
|
||
|
%shl = shl i64 %y, %add
|
||
|
ret i64 %shl
|
||
|
}
|