[llvm-commits] [llvm] r60343 - /llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
Chris Lattner
clattner at apple.com
Mon Dec 1 21:00:49 PST 2008
On Dec 1, 2008, at 12:23 AM, Bill Wendling wrote:
> Author: void
> Date: Mon Dec 1 02:23:25 2008
> New Revision: 60343
>
> URL: http://llvm.org/viewvc/llvm-project?rev=60343&view=rev
> Log:
> Reduce copy-and-paste code by splitting out the code into its own
> function.
Thanks! Next step:
> +Instruction *InstCombiner::FoldOrWithConstants(BinaryOperator &I,
> + Value *A, Value *B,
> Value *C) {
> + Value *Op1 = I.getOperand(1);
> +
> + if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
> + if (CI->getValue() == 1) {
Now that this is a function, there is no need to nest this. Just use
early outs to keep it linear and unnested.
>
> + Value *V1 = 0, *C2 = 0;
> + if (match(Op1, m_And(m_Value(V1), m_Value(C2)))) {
> + ConstantInt *CI2 = dyn_cast<ConstantInt>(C2);
> +
> + if (!CI2) {
> + std::swap(V1, C2);
> + CI2 = dyn_cast<ConstantInt>(C2);
> + }
No need to test for this. and(cst, V) will be canonicalized to and(V,
cst). All commutative operations commute constants to their RHS.
>
> +
> + if (CI2) {
> + APInt NegTwo = -APInt(CI2->getValue().getBitWidth(), 2,
> true);
You're still testing magic constants. Please generalize this.
>
> + if (CI2->getValue().eq(NegTwo)) {
I think you can use == instead of .eq.
>
> + if (V1 == B) {
> + Instruction *NewOp =
> + InsertNewInstBefore(BinaryOperator::CreateAnd(A,
> CI), I);
> + return BinaryOperator::CreateOr(NewOp, B);
> + }
> + if (V1 == A) {
> + Instruction *NewOp =
> + InsertNewInstBefore(BinaryOperator::CreateAnd(B,
> CI), I);
> + return BinaryOperator::CreateOr(NewOp, A);
> + }
Please merge these two if's.
-Chris
More information about the llvm-commits
mailing list