[llvm-commits] [llvm] r60857 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/add-with-overflow.ll

Evan Cheng echeng at apple.com
Wed Dec 10 17:15:47 PST 2008


On Dec 10, 2008, at 2:36 PM, Bill Wendling wrote:

> Author: void
> Date: Wed Dec 10 16:36:00 2008
> New Revision: 60857
>
> URL: http://llvm.org/viewvc/llvm-project?rev=60857&view=rev
> Log:
> If ADD, SUB, or MUL have an overflow bit that's used, don't do  
> transformation on
> them. The DAG combiner expects that nodes that are transformed have  
> one value
> result.
>
> Modified:
>    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>    llvm/trunk/test/CodeGen/X86/add-with-overflow.ll
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=60857&r1=60856&r2=60857&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Dec 10  
> 16:36:00 2008
> @@ -966,6 +966,11 @@
>     SDValue FoldedVOp = SimplifyVBinOp(N);
>     if (FoldedVOp.getNode()) return FoldedVOp;
>   }
> +
> +  if (N->getNumValues() != 1)
> +    // FIXME: DAG combiner cannot handle multiple return values on  
> arithmetic
> +    //        operators.

"Return values" is not exactly the right way to put it. How about  
"cannot handle arithmetic operators whose implicit definitions are  
being used" or "cannot handle arithmetic operators which produce  
multiple results"?

Evan

>
> +    return SDValue();
>
>   // fold (add x, undef) -> undef
>   if (N0.getOpcode() == ISD::UNDEF)
> @@ -1161,6 +1166,11 @@
>     SDValue FoldedVOp = SimplifyVBinOp(N);
>     if (FoldedVOp.getNode()) return FoldedVOp;
>   }
> +
> +  if (N->getNumValues() != 1)
> +    // FIXME: DAG combiner cannot handle multiple return values on  
> arithmetic
> +    //        operators.
> +    return SDValue();
>
>   // fold (sub x, x) -> 0
>   if (N0 == N1)
> @@ -1220,6 +1230,11 @@
>     if (FoldedVOp.getNode()) return FoldedVOp;
>   }
>
> +  if (N->getNumValues() != 1)
> +    // FIXME: DAG combiner cannot handle multiple return values on  
> arithmetic
> +    //        operators.
> +    return SDValue();
> +
>   // fold (mul x, undef) -> 0
>   if (N0.getOpcode() == ISD::UNDEF || N1.getOpcode() == ISD::UNDEF)
>     return DAG.getConstant(0, VT);
>
> Modified: llvm/trunk/test/CodeGen/X86/add-with-overflow.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/add-with-overflow.ll?rev=60857&r1=60856&r2=60857&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/test/CodeGen/X86/add-with-overflow.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/add-with-overflow.ll Wed Dec 10  
> 16:36:00 2008
> @@ -1,7 +1,7 @@
> -; RUN: llvm-as < %s | llc -march=x86 | grep {jo} | count 1
> -; RUN: llvm-as < %s | llc -march=x86 | grep {jc} | count 1
> -; RUN: llvm-as < %s | llc -march=x86 -fast | grep {jo} | count 1
> -; RUN: llvm-as < %s | llc -march=x86 -fast | grep {jc} | count 1
> +; RUN: llvm-as < %s | llc -march=x86 | grep {jo} | count 2
> +; RUN: llvm-as < %s | llc -march=x86 | grep {jc} | count 2
> +; RUN: llvm-as < %s | llc -march=x86 -fast | grep {jo} | count 2
> +; RUN: llvm-as < %s | llc -march=x86 -fast | grep {jc} | count 2
>
> @ok = internal constant [4 x i8] c"%d\0A\00"
> @no = internal constant [4 x i8] c"no\0A\00"
> @@ -38,6 +38,38 @@
>   ret i1 false
> }
>
> +define i1 @func3() nounwind {
> +entry:
> +  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 0, i32 0)
> +  %sum = extractvalue {i32, i1} %t, 0
> +  %obit = extractvalue {i32, i1} %t, 1
> +  br i1 %obit, label %carry, label %normal
> +
> +normal:
> +  %t1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x  
> i8]* @ok, i32 0, i32 0), i32 %sum ) nounwind
> +  ret i1 true
> +
> +carry:
> +  %t2 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x  
> i8]* @no, i32 0, i32 0) ) nounwind
> +  ret i1 false
> +}
> +
> +define i1 @func4() nounwind {
> +entry:
> +  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 0, i32 0)
> +  %sum = extractvalue {i32, i1} %t, 0
> +  %obit = extractvalue {i32, i1} %t, 1
> +  br i1 %obit, label %carry, label %normal
> +
> +normal:
> +  %t1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x  
> i8]* @ok, i32 0, i32 0), i32 %sum ) nounwind
> +  ret i1 true
> +
> +carry:
> +  %t2 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x  
> i8]* @no, i32 0, i32 0) ) nounwind
> +  ret i1 false
> +}
> +
> declare i32 @printf(i8*, ...) nounwind
> declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32)
> declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list