On Dec 18, 2007, at 1:32 PM, Christopher Lamb wrote: > Fold subtracts into integer compares vs. zero. This improves > generate code for this case on X86 > from
Very nice xform! Please add a testcase to Transforms/Instcombine Also: > if (isa<UndefValue>(Op1)) // X icmp undef -> undef > return ReplaceInstUsesWith(I, UndefValue::get(Type::Int1Ty)); > - > + > + // (icmp cond (sub m A) 0) -> > + // (icmp cond m A) > + { > + ConstantInt *C1, *C2; > + Value *A; This code can be simplified in two ways: first, you can drop the first version of the pattern: compares (and other binops, where possible) are canonicalized so that any constant will be on the RHS. This means you don't have to test to see if the LHS is a constant. Second, if you sink this down into this "if" block: // See if we are doing a comparison between a constant and an instruction that // can be folded into the comparison. if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) { then you can turn the first match into just: if (CI->isNullValue() && match(Op0, ...) Finally, is "m" really required to be a constant? This xform seems valid for any "m" and "A", and more general is good. Thanks Christopher! -Chris > + // Check both arguments of the compare for a matching subtract. > + if (match(Op0, m_ConstantInt(C1)) && C1->getValue() == 0 && > + match(Op1, m_Sub(m_ConstantInt(C2), m_Value(A)))) { > + // We managed to fold the add into the RHS of the select > condition. > + return new ICmpInst(I.getPredicate(), A, C2); > + } else if (match(Op1, m_ConstantInt(C1)) && C1->getValue() == > 0 && > + match(Op0, m_Sub(m_ConstantInt(C2), m_Value(A)))) { > + // We managed to fold the add into the LHS of the select > condition. > + return new ICmpInst(I.getPredicate(), C2, A); > + } > + } > + > // icmp <global/alloca*/null>, <global/alloca*/null> - Global/ > Stack value > // addresses never equal each other! We already know that Op0 ! > = Op1. > if ((isa<GlobalValue>(Op0) || isa<AllocaInst>(Op0) || > > > _______________________________________________ > llvm-commits mailing list > llvm-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits