[llvm-commits] [llvm] r152497 - in /llvm/trunk: lib/Analysis/InstructionSimplify.cpp test/Transforms/InstCombine/2012-03-10-InstCombine.ll

Duncan Sands baldrick at free.fr
Sat Mar 10 10:06:56 PST 2012


Hi Bill,

> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Sat Mar 10 11:56:03 2012
> @@ -1609,23 +1609,33 @@
>       if (llvm::isKnownNonNull(LHSPtr) || llvm::isKnownNonNull(RHSPtr)) {
>         // If both sides are different identified objects, they aren't equal
>         // unless they're null.
> -      if (LHSPtr != RHSPtr&&  llvm::isIdentifiedObject(RHSPtr))
> -        return ConstantInt::get(ITy, CmpInst::isFalseWhenEqual(Pred));
> +      if (LHSPtr != RHSPtr&&  llvm::isIdentifiedObject(RHSPtr)&&
> +          (Pred == CmpInst::ICMP_EQ || Pred == CmpInst::FCMP_UEQ))

these are pointers, so why the floating point compare predicate FCMP_UEQ?
Likewise below.

Ciao, Duncan.

> +        return ConstantInt::get(ITy, false);
>
>         // A local identified object (alloca or noalias call) can't equal any
>         // incoming argument, unless they're both null.
> -      if (isa<Instruction>(LHSPtr)&&  isa<Argument>(RHSPtr))
> -        return ConstantInt::get(ITy, CmpInst::isFalseWhenEqual(Pred));
> +      if (isa<Instruction>(LHSPtr)&&  isa<Argument>(RHSPtr)&&
> +          (Pred == CmpInst::ICMP_EQ || Pred == CmpInst::FCMP_UEQ))
> +        return ConstantInt::get(ITy, false);
>       }
>
>       // Assume that the constant null is on the right.
> -    if (llvm::isKnownNonNull(LHSPtr)&&  isa<ConstantPointerNull>(RHSPtr))
> -      return ConstantInt::get(ITy, CmpInst::isFalseWhenEqual(Pred));
> +    if (llvm::isKnownNonNull(LHSPtr)&&  isa<ConstantPointerNull>(RHSPtr)) {
> +      if (Pred == CmpInst::ICMP_EQ || Pred == CmpInst::FCMP_UEQ)
> +        return ConstantInt::get(ITy, false);
> +      else if (Pred == CmpInst::ICMP_NE || Pred == CmpInst::FCMP_ONE)
> +        return ConstantInt::get(ITy, true);
> +    }
>     } else if (isa<Argument>(LHSPtr)) {
>       RHSPtr = RHSPtr->stripInBoundsOffsets();
>       // An alloca can't be equal to an argument.
> -    if (isa<AllocaInst>(RHSPtr))
> -      return ConstantInt::get(ITy, CmpInst::isFalseWhenEqual(Pred));
> +    if (isa<AllocaInst>(RHSPtr)) {
> +      if (Pred == CmpInst::ICMP_EQ || Pred == CmpInst::FCMP_UEQ)
> +        return ConstantInt::get(ITy, false);
> +      else if (Pred == CmpInst::ICMP_NE || Pred == CmpInst::FCMP_ONE)
> +        return ConstantInt::get(ITy, true);
> +    }
>     }
>
>     // If we are comparing with zero then try hard since this is a common case.
>
> Added: llvm/trunk/test/Transforms/InstCombine/2012-03-10-InstCombine.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2012-03-10-InstCombine.ll?rev=152497&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/2012-03-10-InstCombine.ll (added)
> +++ llvm/trunk/test/Transforms/InstCombine/2012-03-10-InstCombine.ll Sat Mar 10 11:56:03 2012
> @@ -0,0 +1,35 @@
> +; RUN: opt<  %s -instcombine | FileCheck %s
> +
> +; Derived from gcc.c-torture/execute/frame-address.c
> +
> +; CHECK:     @func
> +; CHECK:     return:
> +; CHECK-NOT: ret i32 0
> +; CHECK:     ret i32 %retval
> +
> +define i32 @func(i8* %c, i8* %f) nounwind uwtable readnone noinline ssp {
> +entry:
> +  %d = alloca i8, align 1
> +  store i8 0, i8* %d, align 1
> +  %cmp = icmp ugt i8* %d, %c
> +  br i1 %cmp, label %if.else, label %if.then
> +
> +if.then:                                          ; preds = %entry
> +  %cmp2 = icmp ule i8* %d, %f
> +  %not.cmp1 = icmp uge i8* %c, %f
> +  %.cmp2 = and i1 %cmp2, %not.cmp1
> +  %land.ext = zext i1 %.cmp2 to i32
> +  br label %return
> +
> +if.else:                                          ; preds = %entry
> +  %cmp5 = icmp uge i8* %d, %f
> +  %not.cmp3 = icmp ule i8* %c, %f
> +  %.cmp5 = and i1 %cmp5, %not.cmp3
> +  %land.ext7 = zext i1 %.cmp5 to i32
> +  br label %return
> +
> +return:                                           ; preds = %if.else, %if.then
> +  %retval.0 = phi i32 [ %land.ext, %if.then ], [ %land.ext7, %if.else ]
> +  ret i32 %retval.0
> +}
> +
>
>
> _______________________________________________
> 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