mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-20 21:14:28 +00:00

As detailed on D22726, much of the shift combining code assume constant values will fit into a uint64_t value and calls ConstantSDNode::getZExtValue where it probably shouldn't (leading to asserts). Using APInt directly avoids this problem but we encounter other assertions if we attempt to compare/operate on 2 APInt of different bitwidths. This patch adds a helper function to ensure that 2 APInt values are zero extended as required so that they can be safely used together. I've only added an initial example use for this to the '(SHIFT (SHIFT x, c1), c2) --> (SHIFT x, (ADD c1, c2))' combines. Further cases can easily be added as required. Differential Revision: https://reviews.llvm.org/D23007 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278141 91177308-0d34-0410-b5e6-96231b3b80d8
119 lines
2.9 KiB
LLVM
119 lines
2.9 KiB
LLVM
; RUN: llc < %s -march=x86
|
|
; RUN: llc < %s -march=x86-64
|
|
|
|
;
|
|
; Scalars
|
|
;
|
|
|
|
define void @test_lshr_i128(i128 %x, i128 %a, i128* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = lshr i128 %x, %a
|
|
store i128 %0, i128* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_ashr_i128(i128 %x, i128 %a, i128* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = ashr i128 %x, %a
|
|
store i128 %0, i128* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_shl_i128(i128 %x, i128 %a, i128* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = shl i128 %x, %a
|
|
store i128 %0, i128* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_lshr_i128_outofrange(i128 %x, i128* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = lshr i128 %x, -1
|
|
store i128 %0, i128* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_ashr_i128_outofrange(i128 %x, i128* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = ashr i128 %x, -1
|
|
store i128 %0, i128* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_shl_i128_outofrange(i128 %x, i128* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = shl i128 %x, -1
|
|
store i128 %0, i128* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
;
|
|
; Vectors
|
|
;
|
|
|
|
define void @test_lshr_v2i128(<2 x i128> %x, <2 x i128> %a, <2 x i128>* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = lshr <2 x i128> %x, %a
|
|
store <2 x i128> %0, <2 x i128>* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_ashr_v2i128(<2 x i128> %x, <2 x i128> %a, <2 x i128>* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = ashr <2 x i128> %x, %a
|
|
store <2 x i128> %0, <2 x i128>* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_shl_v2i128(<2 x i128> %x, <2 x i128> %a, <2 x i128>* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = shl <2 x i128> %x, %a
|
|
store <2 x i128> %0, <2 x i128>* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_lshr_v2i128_outofrange(<2 x i128> %x, <2 x i128>* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = lshr <2 x i128> %x, <i128 -1, i128 -1>
|
|
store <2 x i128> %0, <2 x i128>* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_ashr_v2i128_outofrange(<2 x i128> %x, <2 x i128>* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = ashr <2 x i128> %x, <i128 -1, i128 -1>
|
|
store <2 x i128> %0, <2 x i128>* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_shl_v2i128_outofrange(<2 x i128> %x, <2 x i128>* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = shl <2 x i128> %x, <i128 -1, i128 -1>
|
|
store <2 x i128> %0, <2 x i128>* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_lshr_v2i128_outofrange_sum(<2 x i128> %x, <2 x i128>* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = lshr <2 x i128> %x, <i128 -1, i128 -1>
|
|
%1 = lshr <2 x i128> %0, <i128 1, i128 1>
|
|
store <2 x i128> %1, <2 x i128>* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_ashr_v2i128_outofrange_sum(<2 x i128> %x, <2 x i128>* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = ashr <2 x i128> %x, <i128 -1, i128 -1>
|
|
%1 = ashr <2 x i128> %0, <i128 1, i128 1>
|
|
store <2 x i128> %1, <2 x i128>* %r, align 16
|
|
ret void
|
|
}
|
|
|
|
define void @test_shl_v2i128_outofrange_sum(<2 x i128> %x, <2 x i128>* nocapture %r) nounwind {
|
|
entry:
|
|
%0 = shl <2 x i128> %x, <i128 -1, i128 -1>
|
|
%1 = shl <2 x i128> %0, <i128 1, i128 1>
|
|
store <2 x i128> %1, <2 x i128>* %r, align 16
|
|
ret void
|
|
}
|