mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-11 23:16:11 +00:00
[InstCombine][SSE4a] Fix assertion failure in the insertq/insertqi combining logic.
This fixes a similar issue to the one already fixed by r280804 (revieved in D24256). Revision 280804 fixed the problem with unsafe dyn_casts in the extrq/extrqi combining logic. However, it turns out that even the insertq/insertqi logic was affected by the same problem. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280807 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fd11478c26
commit
2fdf2bfd1f
@ -722,10 +722,10 @@ static Value *simplifyX86insertq(IntrinsicInst &II, Value *Op0, Value *Op1,
|
||||
Constant *C0 = dyn_cast<Constant>(Op0);
|
||||
Constant *C1 = dyn_cast<Constant>(Op1);
|
||||
ConstantInt *CI00 =
|
||||
C0 ? dyn_cast<ConstantInt>(C0->getAggregateElement((unsigned)0))
|
||||
C0 ? dyn_cast_or_null<ConstantInt>(C0->getAggregateElement((unsigned)0))
|
||||
: nullptr;
|
||||
ConstantInt *CI10 =
|
||||
C1 ? dyn_cast<ConstantInt>(C1->getAggregateElement((unsigned)0))
|
||||
C1 ? dyn_cast_or_null<ConstantInt>(C1->getAggregateElement((unsigned)0))
|
||||
: nullptr;
|
||||
|
||||
// Constant Fold - insert bottom Length bits starting at the Index'th bit.
|
||||
@ -1919,7 +1919,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
// See if we're dealing with constant values.
|
||||
Constant *C1 = dyn_cast<Constant>(Op1);
|
||||
ConstantInt *CI11 =
|
||||
C1 ? dyn_cast<ConstantInt>(C1->getAggregateElement((unsigned)1))
|
||||
C1 ? dyn_cast_or_null<ConstantInt>(C1->getAggregateElement((unsigned)1))
|
||||
: nullptr;
|
||||
|
||||
// Attempt to simplify to a constant, shuffle vector or INSERTQI call.
|
||||
|
@ -177,6 +177,15 @@ define <2 x i64> @test_insertq_constant_undef(<2 x i64> %x, <2 x i64> %y) {
|
||||
ret <2 x i64> %1
|
||||
}
|
||||
|
||||
define <2 x i64> @test_insertq_call_constexpr(<2 x i64> %x) {
|
||||
; CHECK-LABEL: @test_insertq_call_constexpr(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> bitcast (<16 x i8> trunc (<16 x i16> bitcast (<4 x i64> <i64 0, i64 undef, i64 2, i64 undef> to <16 x i16>) to <16 x i8>) to <2 x i64>))
|
||||
; CHECK-NEXT: ret <2 x i64> [[TMP1]]
|
||||
;
|
||||
%1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> bitcast (<16 x i8> trunc (<16 x i16> bitcast (<4 x i64> <i64 0, i64 undef, i64 2, i64 undef> to <16 x i16>) to <16 x i8>) to <2 x i64>))
|
||||
ret <2 x i64> %1
|
||||
}
|
||||
|
||||
;
|
||||
; INSERTQI
|
||||
;
|
||||
@ -213,6 +222,15 @@ define <2 x i64> @test_insertqi_constant(<2 x i64> %v, <2 x i64> %i) {
|
||||
ret <2 x i64> %1
|
||||
}
|
||||
|
||||
define <2 x i64> @test_insertqi_call_constexpr(<2 x i64> %x) {
|
||||
; CHECK-LABEL: @test_insertqi_call_constexpr(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> bitcast (<16 x i8> trunc (<16 x i16> bitcast (<4 x i64> <i64 0, i64 undef, i64 2, i64 undef> to <16 x i16>) to <16 x i8>) to <2 x i64>), i8 48, i8 3)
|
||||
; CHECK-NEXT: ret <2 x i64> [[TMP1]]
|
||||
;
|
||||
%1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> bitcast (<16 x i8> trunc (<16 x i16> bitcast (<4 x i64> <i64 0, i64 undef, i64 2, i64 undef> to <16 x i16>) to <16 x i8>) to <2 x i64>), i8 48, i8 3)
|
||||
ret <2 x i64> %1
|
||||
}
|
||||
|
||||
; The result of this insert is the second arg, since the top 64 bits of
|
||||
; the result are undefined, and we copy the bottom 64 bits from the
|
||||
; second arg
|
||||
|
Loading…
x
Reference in New Issue
Block a user