mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-08 13:00:43 +00:00
45b5f7e457
We had a hack in SDAGBuilder in place to work around this but now we can avoid that. Call BuildExactSDIV from BuildSDIV so DAGCombiner can perform this trick automatically. The added check in DAGCombiner is necessary to prevent exact sdiv by pow2 from regressing as the target-specific pow2 lowering is not aware of exact bits yet. This is mostly covered by existing tests. One side effect is that we get the better lowering for exact vector sdivs now too :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240891 91177308-0d34-0410-b5e6-96231b3b80d8
30 lines
614 B
LLVM
30 lines
614 B
LLVM
; RUN: llc -march=x86 -mattr=+sse2 < %s | FileCheck %s
|
|
|
|
define i32 @test1(i32 %x) {
|
|
%div = sdiv exact i32 %x, 25
|
|
ret i32 %div
|
|
; CHECK-LABEL: test1:
|
|
; CHECK: imull $-1030792151, 4(%esp)
|
|
; CHECK-NEXT: ret
|
|
}
|
|
|
|
define i32 @test2(i32 %x) {
|
|
%div = sdiv exact i32 %x, 24
|
|
ret i32 %div
|
|
; CHECK-LABEL: test2:
|
|
; CHECK: sarl $3
|
|
; CHECK-NEXT: imull $-1431655765
|
|
; CHECK-NEXT: ret
|
|
}
|
|
|
|
define <4 x i32> @test3(<4 x i32> %x) {
|
|
%div = sdiv exact <4 x i32> %x, <i32 24, i32 24, i32 24, i32 24>
|
|
ret <4 x i32> %div
|
|
; CHECK-LABEL: test3:
|
|
; CHECK: psrad $3,
|
|
; CHECK: pmuludq
|
|
; CHECK: pmuludq
|
|
; CHECK-NOT: psrad
|
|
; CHECK: ret
|
|
}
|