mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
[InstCombine] Sanitize undef vector constant to 1 in X*(2^C) with X << C (PR47133)
While x*undef is undef, shift-by-undef is poison, which we must avoid introducing. Also log2(iN undef) is *NOT* iN undef, because log2(iN undef) u< N. See https://bugs.llvm.org/show_bug.cgi?id=47133 (cherry picked from commit 12d93a27e7b78d58dd00817cb737f273d2dba8ae)
This commit is contained in:
parent
f0d66a02ba
commit
7b99daf6d1
@ -216,7 +216,11 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {
|
||||
|
||||
if (match(&I, m_Mul(m_Value(NewOp), m_Constant(C1)))) {
|
||||
// Replace X*(2^C) with X << C, where C is either a scalar or a vector.
|
||||
if (Constant *NewCst = getLogBase2(NewOp->getType(), C1)) {
|
||||
// Note that we need to sanitize undef multipliers to 1,
|
||||
// to avoid introducing poison.
|
||||
Constant *SafeC1 = Constant::replaceUndefsWith(
|
||||
C1, ConstantInt::get(C1->getType()->getScalarType(), 1));
|
||||
if (Constant *NewCst = getLogBase2(NewOp->getType(), SafeC1)) {
|
||||
BinaryOperator *Shl = BinaryOperator::CreateShl(NewOp, NewCst);
|
||||
|
||||
if (I.hasNoUnsignedWrap())
|
||||
|
@ -216,7 +216,7 @@ define <2 x i1> @test13_vector(<2 x i64> %X, <2 x %S*> %P) nounwind {
|
||||
define <2 x i1> @test13_vector2(i64 %X, <2 x %S*> %P) nounwind {
|
||||
; CHECK-LABEL: @test13_vector2(
|
||||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> undef, i64 [[X:%.*]], i32 0
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i64> [[DOTSPLATINSERT]], <i64 2, i64 undef>
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i64> [[DOTSPLATINSERT]], <i64 2, i64 0>
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <2 x i64> [[TMP1]], <i64 -4, i64 undef>
|
||||
; CHECK-NEXT: [[C:%.*]] = shufflevector <2 x i1> [[TMP2]], <2 x i1> undef, <2 x i32> zeroinitializer
|
||||
; CHECK-NEXT: ret <2 x i1> [[C]]
|
||||
@ -231,7 +231,7 @@ define <2 x i1> @test13_vector2(i64 %X, <2 x %S*> %P) nounwind {
|
||||
define <2 x i1> @test13_vector3(i64 %X, <2 x %S*> %P) nounwind {
|
||||
; CHECK-LABEL: @test13_vector3(
|
||||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> undef, i64 [[X:%.*]], i32 0
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i64> [[DOTSPLATINSERT]], <i64 2, i64 undef>
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i64> [[DOTSPLATINSERT]], <i64 2, i64 0>
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <2 x i64> [[TMP1]], <i64 4, i64 undef>
|
||||
; CHECK-NEXT: [[C:%.*]] = shufflevector <2 x i1> [[TMP2]], <2 x i1> undef, <2 x i32> zeroinitializer
|
||||
; CHECK-NEXT: ret <2 x i1> [[C]]
|
||||
|
Loading…
Reference in New Issue
Block a user