[InstCombine] Copy flags of extractelement for extelt -> icmp combine (#86366)
Fixes #86164
This commit is contained in:
parent
e8d5223ce4
commit
b3fe27f2be
@ -1058,6 +1058,17 @@ public:
|
||||
static CmpInst *Create(OtherOps Op, Predicate predicate, Value *S1,
|
||||
Value *S2, const Twine &Name, BasicBlock *InsertAtEnd);
|
||||
|
||||
/// Construct a compare instruction, given the opcode, the predicate,
|
||||
/// the two operands and the instruction to copy the flags from. Optionally
|
||||
/// (if InstBefore is specified) insert the instruction into a BasicBlock
|
||||
/// right before the specified instruction. The specified Instruction is
|
||||
/// allowed to be a dereferenced end iterator. Create a CmpInst
|
||||
static CmpInst *CreateWithCopiedFlags(OtherOps Op, Predicate Pred, Value *S1,
|
||||
Value *S2,
|
||||
const Instruction *FlagsSource,
|
||||
const Twine &Name = "",
|
||||
Instruction *InsertBefore = nullptr);
|
||||
|
||||
/// Get the opcode casted to the right type
|
||||
OtherOps getOpcode() const {
|
||||
return static_cast<OtherOps>(Instruction::getOpcode());
|
||||
|
||||
@ -4623,6 +4623,16 @@ CmpInst::Create(OtherOps Op, Predicate predicate, Value *S1, Value *S2,
|
||||
S1, S2, Name);
|
||||
}
|
||||
|
||||
CmpInst *CmpInst::CreateWithCopiedFlags(OtherOps Op, Predicate Pred, Value *S1,
|
||||
Value *S2,
|
||||
const Instruction *FlagsSource,
|
||||
const Twine &Name,
|
||||
Instruction *InsertBefore) {
|
||||
CmpInst *Inst = Create(Op, Pred, S1, S2, Name, InsertBefore);
|
||||
Inst->copyIRFlags(FlagsSource);
|
||||
return Inst;
|
||||
}
|
||||
|
||||
void CmpInst::swapOperands() {
|
||||
if (ICmpInst *IC = dyn_cast<ICmpInst>(this))
|
||||
IC->swapOperands();
|
||||
|
||||
@ -487,7 +487,9 @@ Instruction *InstCombinerImpl::visitExtractElementInst(ExtractElementInst &EI) {
|
||||
// extelt (cmp X, Y), Index --> cmp (extelt X, Index), (extelt Y, Index)
|
||||
Value *E0 = Builder.CreateExtractElement(X, Index);
|
||||
Value *E1 = Builder.CreateExtractElement(Y, Index);
|
||||
return CmpInst::Create(cast<CmpInst>(SrcVec)->getOpcode(), Pred, E0, E1);
|
||||
CmpInst *SrcCmpInst = cast<CmpInst>(SrcVec);
|
||||
return CmpInst::CreateWithCopiedFlags(SrcCmpInst->getOpcode(), Pred, E0, E1,
|
||||
SrcCmpInst);
|
||||
}
|
||||
|
||||
if (auto *I = dyn_cast<Instruction>(SrcVec)) {
|
||||
|
||||
@ -341,6 +341,17 @@ define i1 @extractelt_vector_fcmp_constrhs_dynidx(<2 x float> %arg, i32 %idx) {
|
||||
ret i1 %ext
|
||||
}
|
||||
|
||||
define i1 @extractelt_vector_fcmp_copy_flags(<4 x float> %x) {
|
||||
; CHECK-LABEL: @extractelt_vector_fcmp_copy_flags(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x float> [[X:%.*]], i64 2
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = fcmp nsz arcp oeq float [[TMP1]], 0.000000e+00
|
||||
; CHECK-NEXT: ret i1 [[TMP2]]
|
||||
;
|
||||
%cmp = fcmp nsz arcp oeq <4 x float> %x, zeroinitializer
|
||||
%r = extractelement <4 x i1> %cmp, i32 2
|
||||
ret i1 %r
|
||||
}
|
||||
|
||||
define i1 @extractelt_vector_fcmp_not_cheap_to_scalarize_multi_use(<2 x float> %arg0, <2 x float> %arg1, <2 x float> %arg2, i32 %idx) {
|
||||
;
|
||||
; CHECK-LABEL: @extractelt_vector_fcmp_not_cheap_to_scalarize_multi_use(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user