[PATCH] D12706: Handle non-constant shifts in computeKnownBits, and use computeKnownBits for constant folding in InstCombine/Simplify
Hal Finkel via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 23 08:28:49 PDT 2015
----- Original Message -----
> From: "Hal Finkel" <hfinkel at anl.gov>
> To: "James Molloy" <james at jamesmolloy.co.uk>
> Cc: llvm-commits at lists.llvm.org, regehr at cs.utah.edu, reviews+D12706+public+8f107d44c62a13e2 at reviews.llvm.org, "Philip
> Reames" <listmail at philipreames.com>, "david majnemer" <david.majnemer at gmail.com>, sanjoy at playingwithpointers.com
> Sent: Thursday, October 22, 2015 9:14:49 AM
> Subject: Re: [PATCH] D12706: Handle non-constant shifts in computeKnownBits, and use computeKnownBits for constant
> folding in InstCombine/Simplify
>
> ----- Original Message -----
> > From: "James Molloy" <james at jamesmolloy.co.uk>
> > To: reviews+D12706+public+8f107d44c62a13e2 at reviews.llvm.org,
> > "Philip Reames" <listmail at philipreames.com>,
> > hfinkel at anl.gov, "david majnemer" <david.majnemer at gmail.com>,
> > sanjoy at playingwithpointers.com
> > Cc: llvm-commits at lists.llvm.org, regehr at cs.utah.edu
> > Sent: Thursday, October 22, 2015 8:56:51 AM
> > Subject: Re: [PATCH] D12706: Handle non-constant shifts in
> > computeKnownBits, and use computeKnownBits for constant
> > folding in InstCombine/Simplify
> >
> >
> > Hi Hal,
> >
> >
> > I'm keen to get this committed so I can work on the follow-on
> > suggestion I made myself.
> >
> >
> > Will you get time to commit this soon? or is it OK if I commit it
> > on
> > your behalf instead?
>
> I'm planning on getting to this today. I need to fixup some ubsan
> tests for this it seems. If I don't get to this today, I'll let you
> know.
To provide a quick update (aside from the fact that, no, I did not end up with time to look at this yesterday), with this patch, a number of ubsan tests fail. The test failures are the same between x86_64 and PPC64, so it's not a backend problem. Furthermore, the compiler output for the tests themselves is unchanged, so the change seems to be in the runtime library.
A good example failure is this: test/ubsan/TestCases/Integer/shift.cpp (the first RUN line as an example):
// RUN: %clangxx -DLSH_OVERFLOW -DOP='<<' -fsanitize=shift-base -fno-sanitize-recover=shift %s -o %t1 && not %run %t1 2>&1 | FileCheck %s --check-prefix=CHECK-LSH_OVERFLOW
Instead of getting this:
runtime error: left shift of negative value -2147483648 ...
we're getting this (with this patch):
runtime error: left shift of 2147483648 by 1 places cannot be represented ...
The relevant check in handleShiftOutOfBoundsImpl in ubsan_handlers.cc looks like this:
} else if (LHSVal.isNegative()) {
R.setErrorType(ErrorType::InvalidShiftBase);
Diag(Loc, DL_Error, "left shift of negative value %0") << LHSVal;
} else {
R.setErrorType(ErrorType::InvalidShiftBase);
Diag(Loc, DL_Error,
"left shift of %0 by %1 places cannot be represented in type %2")
<< LHSVal << RHSVal << Data->LHSType;
where we have:
/// Is this a negative integer?
bool isNegative() const {
return getType().isSignedIntegerTy() && getSIntValue() < 0;
}
and:
SIntMax Value::getSIntValue() const {
CHECK(getType().isSignedIntegerTy());
if (isInlineInt()) {
// Val was zero-extended to ValueHandle. Sign-extend from original width
// to SIntMax.
const unsigned ExtraBits =
sizeof(SIntMax) * 8 - getType().getIntegerBitWidth();
return SIntMax(Val) << ExtraBits >> ExtraBits;
}
...
my guess here is that we're miscompiling LHSVal.isNegative() because we somehow believe that 'SIntMax(Val) << ExtraBits >> ExtraBits' can't be negative. If I have time to look at this further today, I will. If someone else would like to help out, please do.
Thanks again,
Hal
>
> -Hal
>
> >
> >
> > Cheers,
> >
> >
> > James
> >
> >
> > On Wed, 14 Oct 2015 at 18:49 Philip Reames via llvm-commits <
> > llvm-commits at lists.llvm.org > wrote:
> >
> >
> > reames accepted this revision.
> > reames added a comment.
> > This revision is now accepted and ready to land.
> >
> > LGTM w/minor comment addressed
> >
> > Are you planning on implementing the follow on suggestions? If not,
> > we should make sure they get tracked either as TODOs or bugs.
> >
> >
> > ================
> > Comment at: lib/Analysis/ValueTracking.cpp:990
> > @@ +989,3 @@
> > +
> > + computeKnownBits(I->getOperand(1), KnownZero, KnownOne, DL, Depth
> > +
> > 1, Q);
> > +
> > ----------------
> > It would be more clearly correct to use the two temporaries for
> > this
> > calculation. The current code is correct, but slightly confusing.
> >
> >
> > http://reviews.llvm.org/D12706
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list