[InstSimplify] Re-enable select ?, undef, X -> X transform when X is provably not poison
Follow up from the transform being removed in D83360. If X is probably not poison, then the transform is safe. Still plan to remove or adjust the code from ConstantFolding after this. Differential Revision: https://reviews.llvm.org/D83440
This commit is contained in:
@@ -4118,6 +4118,17 @@ static Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
|
||||
if (TrueVal == FalseVal)
|
||||
return TrueVal;
|
||||
|
||||
// If the true or false value is undef, we can fold to the other value as
|
||||
// long as the other value isn't poison.
|
||||
// select ?, undef, X -> X
|
||||
if (isa<UndefValue>(TrueVal) &&
|
||||
isGuaranteedNotToBeUndefOrPoison(FalseVal, Q.CxtI, Q.DT))
|
||||
return FalseVal;
|
||||
// select ?, X, undef -> X
|
||||
if (isa<UndefValue>(FalseVal) &&
|
||||
isGuaranteedNotToBeUndefOrPoison(TrueVal, Q.CxtI, Q.DT))
|
||||
return TrueVal;
|
||||
|
||||
// Deal with partial undef vector constants: select ?, VecC, VecC' --> VecC''
|
||||
Constant *TrueC, *FalseC;
|
||||
if (TrueVal->getType()->isVectorTy() && match(TrueVal, m_Constant(TrueC)) &&
|
||||
|
||||
@@ -794,8 +794,7 @@ define <2 x i32> @true_undef_vec(i1 %cond, <2 x i32> %x) {
|
||||
; These can be folded because the other value is guaranteed not to be poison.
|
||||
define i32 @false_undef_true_constant(i1 %cond) {
|
||||
; CHECK-LABEL: @false_undef_true_constant(
|
||||
; CHECK-NEXT: [[S:%.*]] = select i1 [[COND:%.*]], i32 10, i32 undef
|
||||
; CHECK-NEXT: ret i32 [[S]]
|
||||
; CHECK-NEXT: ret i32 10
|
||||
;
|
||||
%s = select i1 %cond, i32 10, i32 undef
|
||||
ret i32 %s
|
||||
@@ -803,8 +802,7 @@ define i32 @false_undef_true_constant(i1 %cond) {
|
||||
|
||||
define i32 @true_undef_false_constant(i1 %cond) {
|
||||
; CHECK-LABEL: @true_undef_false_constant(
|
||||
; CHECK-NEXT: [[S:%.*]] = select i1 [[COND:%.*]], i32 undef, i32 20
|
||||
; CHECK-NEXT: ret i32 [[S]]
|
||||
; CHECK-NEXT: ret i32 20
|
||||
;
|
||||
%s = select i1 %cond, i32 undef, i32 20
|
||||
ret i32 %s
|
||||
@@ -830,8 +828,7 @@ define <2 x i32> @true_undef_false_constant_vec(i1 %cond) {
|
||||
define i32 @false_undef_true_freeze(i1 %cond, i32 %x) {
|
||||
; CHECK-LABEL: @false_undef_true_freeze(
|
||||
; CHECK-NEXT: [[XF:%.*]] = freeze i32 [[X:%.*]]
|
||||
; CHECK-NEXT: [[S:%.*]] = select i1 [[COND:%.*]], i32 [[XF]], i32 undef
|
||||
; CHECK-NEXT: ret i32 [[S]]
|
||||
; CHECK-NEXT: ret i32 [[XF]]
|
||||
;
|
||||
%xf = freeze i32 %x
|
||||
%s = select i1 %cond, i32 %xf, i32 undef
|
||||
@@ -841,8 +838,7 @@ define i32 @false_undef_true_freeze(i1 %cond, i32 %x) {
|
||||
define i32 @false_undef_false_freeze(i1 %cond, i32 %x) {
|
||||
; CHECK-LABEL: @false_undef_false_freeze(
|
||||
; CHECK-NEXT: [[XF:%.*]] = freeze i32 [[X:%.*]]
|
||||
; CHECK-NEXT: [[S:%.*]] = select i1 [[COND:%.*]], i32 undef, i32 [[XF]]
|
||||
; CHECK-NEXT: ret i32 [[S]]
|
||||
; CHECK-NEXT: ret i32 [[XF]]
|
||||
;
|
||||
%xf = freeze i32 %x
|
||||
%s = select i1 %cond, i32 undef, i32 %xf
|
||||
|
||||
Reference in New Issue
Block a user