Commit Graph

40 Commits

Author SHA1 Message Date
John McCall f4ddf94ecb Compute and preserve alignment more faithfully in IR-generation.
Introduce an Address type to bundle a pointer value with an
alignment.  Introduce APIs on CGBuilderTy to work with Address
values.  Change core APIs on CGF/CGM to traffic in Address where
appropriate.  Require alignments to be non-zero.  Update a ton
of code to compute and propagate alignment information.

As part of this, I've promoted CGBuiltin's EmitPointerWithAlignment
helper function to CGF and made use of it in a number of places in
the expression emitter.

The end result is that we should now be significantly more correct
when performing operations on objects that are locally known to
be under-aligned.  Since alignment is not reliably tracked in the
type system, there are inherent limits to this, but at least we
are no longer confused by standard operations like derived-to-base
conversions and array-to-pointer decay.  I've also fixed a large
number of bugs where we were applying the complete-object alignment
to a pointer instead of the non-virtual alignment, although most of
these were hidden by the very conservative approach we took with
member alignment.

Also, because IRGen now reliably asserts on zero alignments, we
should no longer be subject to an absurd but frustrating recurring
bug where an incomplete type would report a zero alignment and then
we'd naively do a alignmentAtOffset on it and emit code using an
alignment equal to the largest power-of-two factor of the offset.

We should also now be emitting much more aggressive alignment
attributes in the presence of over-alignment.  In particular,
field access now uses alignmentAtOffset instead of min.

Several times in this patch, I had to change the existing
code-generation pattern in order to more effectively use
the Address APIs.  For the most part, this seems to be a strict
improvement, like doing pointer arithmetic with GEPs instead of
ptrtoint.  That said, I've tried very hard to not change semantics,
but it is likely that I've failed in a few places, for which I
apologize.

ABIArgInfo now always carries the assumed alignment of indirect and
indirect byval arguments.  In order to cut down on what was already
a dauntingly large patch, I changed the code to never set align
attributes in the IR on non-byval indirect arguments.  That is,
we still generate code which assumes that indirect arguments have
the given alignment, but we don't express this information to the
backend except where it's semantically required (i.e. on byvals).
This is likely a minor regression for those targets that did provide
this information, but it'll be trivial to add it back in a later
patch.

I partially punted on applying this work to CGBuiltin.  Please
do not add more uses of the CreateDefaultAligned{Load,Store}
APIs; they will be going away eventually.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@246985 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-08 08:05:57 +00:00
Reid Kleckner 4574f723bd Evaluate union cast subexpressions when the cast value is unused
Fixes PR23597.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237839 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-20 21:59:25 +00:00
David Blaikie 1d7abba8db Update Clang tests to handle explicitly typed load changes in LLVM.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230795 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-27 21:19:58 +00:00
David Blaikie ca540a101d Update Clang tests to handle explicitly typed gep changes in LLVM.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230783 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-27 19:18:17 +00:00
Stephen Lin 93ab6bf534 CHECK-LABEL-ify some code gen tests to improve diagnostic experience when tests fail.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188447 91177308-0d34-0410-b5e6-96231b3b80d8
2013-08-15 06:47:53 +00:00
Benjamin Kramer 47f5a065fc Make test pass in Release builds, which use a different naming scheme for llvm values.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162771 91177308-0d34-0410-b5e6-96231b3b80d8
2012-08-28 18:11:31 +00:00
Michael Liao 212f80d2ef Merge test case for PR13704 into exprs.c to reduce test cases
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162769 91177308-0d34-0410-b5e6-96231b3b80d8
2012-08-28 17:46:11 +00:00
John McCall 8d3d6c9355 Ensure an insertion point at the end of a statement-expression.
Fixes PR8967.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123360 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-13 02:03:06 +00:00
John McCall fd569004b7 Silly special case: never load when dereferencing void*.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120905 91177308-0d34-0410-b5e6-96231b3b80d8
2010-12-04 12:43:24 +00:00
John McCall 85515d64c1 First pass at implementing the intent of ANSI C DR106.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120904 91177308-0d34-0410-b5e6-96231b3b80d8
2010-12-04 12:29:11 +00:00
Daniel Dunbar f52697a589 Improve test coverage.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111712 91177308-0d34-0410-b5e6-96231b3b80d8
2010-08-21 02:46:28 +00:00
Daniel Dunbar 986b5d156d tests: Fix test to not depend on instruction names.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107186 91177308-0d34-0410-b5e6-96231b3b80d8
2010-06-29 18:34:40 +00:00
Chris Lattner ce88d0f015 tweak test to pass on windows
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107040 91177308-0d34-0410-b5e6-96231b3b80d8
2010-06-28 18:29:14 +00:00
Chris Lattner 4ac0d83090 Fix UnitTests/2004-02-02-NegativeZero.c, which regressed when
I broke negate of FP values.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107019 91177308-0d34-0410-b5e6-96231b3b80d8
2010-06-28 17:12:37 +00:00
Chris Lattner f70d857cbd merge two tests.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106971 91177308-0d34-0410-b5e6-96231b3b80d8
2010-06-27 01:08:03 +00:00
Chris Lattner 9269d5c05b Implement rdar://7530813 - collapse multiple GEP instructions in IRgen
This avoids generating two gep's for common array operations.  Before
we would generate something like:

  %tmp = load i32* %X.addr                        ; <i32> [#uses=1]
  %arraydecay = getelementptr inbounds [100 x i32]* %A, i32 0, i32 0 ; <i32*> [#uses=1]
  %arrayidx = getelementptr inbounds i32* %arraydecay, i32 %tmp ; <i32*> [#uses=1]
  %tmp1 = load i32* %arrayidx                     ; <i32> [#uses=1]

Now we generate:

  %tmp = load i32* %X.addr                        ; <i32> [#uses=1]
  %arrayidx = getelementptr inbounds [100 x i32]* %A, i32 0, i32 %tmp ; <i32*> [#uses=1]
  %tmp1 = load i32* %arrayidx                     ; <i32> [#uses=1]

Less IR is better at -O0.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106966 91177308-0d34-0410-b5e6-96231b3b80d8
2010-06-26 23:03:20 +00:00
Chris Lattner a4d71455f0 Implement support for -fwrapv, rdar://7221421
As part of this, pull together trapv handling into the same enum.

This also add support for NSW multiplies.

This also makes PCH disagreement on overflow behavior silent, since it
really doesn't matter except for warnings and codegen (no macros get 
defined etc).



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106956 91177308-0d34-0410-b5e6-96231b3b80d8
2010-06-26 21:25:03 +00:00
Chris Lattner e70ffd6311 implement rdar://7432000 - signed negate should codegen as NSW.
While I'm in there, adjust pointer to member adjustments as well.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106955 91177308-0d34-0410-b5e6-96231b3b80d8
2010-06-26 20:27:24 +00:00
Daniel Dunbar a5728872c7 Update tests to use %clang_cc1 instead of 'clang-cc' or 'clang -cc1'.
- This is designed to make it obvious that %clang_cc1 is a "test variable"
   which is substituted. It is '%clang_cc1' instead of '%clang -cc1' because it
   can be useful to redefine what gets run as 'clang -cc1' (for example, to set
   a default target).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91446 91177308-0d34-0410-b5e6-96231b3b80d8
2009-12-15 20:14:24 +00:00
Chris Lattner c08582ba5e add 'F' to a bunch of libm builtins so that codegen doesn't die on them,
pointed out by Charles Davis.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90736 91177308-0d34-0410-b5e6-96231b3b80d8
2009-12-07 02:09:14 +00:00
Mike Stump 1eb4433ac4 Remove tabs, and whitespace cleanups.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81346 91177308-0d34-0410-b5e6-96231b3b80d8
2009-09-09 15:08:12 +00:00
Mike Stump c36541e7bf Prep for new warning.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76638 91177308-0d34-0410-b5e6-96231b3b80d8
2009-07-21 20:52:43 +00:00
Chris Lattner 7a574ccd52 implement l-value codegen of comma expr
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71595 91177308-0d34-0410-b5e6-96231b3b80d8
2009-05-12 21:28:12 +00:00
Chris Lattner 654599454c fix PR4067: [Linux kernel] cannot aggregate codegen stmtexpr as lvalue
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70067 91177308-0d34-0410-b5e6-96231b3b80d8
2009-04-25 19:35:26 +00:00
Chris Lattner f0a990c2aa fix PR4026: Clang can't codegen __func__ without implicit cast
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69747 91177308-0d34-0410-b5e6-96231b3b80d8
2009-04-21 23:00:09 +00:00
Daniel Dunbar 9034558f2f Support member reference on ?: of struct type.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67603 91177308-0d34-0410-b5e6-96231b3b80d8
2009-03-24 02:38:23 +00:00
Daniel Dunbar d7d5f0223b Rename clang to clang-cc.
Tests and drivers updated, still need to shuffle dirs.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67602 91177308-0d34-0410-b5e6-96231b3b80d8
2009-03-24 02:24:46 +00:00
Chris Lattner 40f929242a fix the more complex cases by actually codegen'ing the right expr :)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67219 91177308-0d34-0410-b5e6-96231b3b80d8
2009-03-18 18:30:44 +00:00
Chris Lattner 75dfedaf70 add codegen support for casting an element to a union.
There are some more complex cases (_Complex and structs)
that I'm still working on.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67218 91177308-0d34-0410-b5e6-96231b3b80d8
2009-03-18 18:28:57 +00:00
Chris Lattner 8cc9d08eb8 fix PR3809, codegen for inc/dec of function pointers.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67165 91177308-0d34-0410-b5e6-96231b3b80d8
2009-03-18 04:25:13 +00:00
Chris Lattner c3953a61f7 teach codegen to handle noop casts as lvalues.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67164 91177308-0d34-0410-b5e6-96231b3b80d8
2009-03-18 04:02:57 +00:00
Chris Lattner e5ed15195b finish off codegen support for sub of pointer to functions,
finishing off rdar://6520707


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64295 91177308-0d34-0410-b5e6-96231b3b80d8
2009-02-11 07:21:43 +00:00
Nuno Lopes a468d34bed fix folding of '*doubleArray'
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59647 91177308-0d34-0410-b5e6-96231b3b80d8
2008-11-19 17:44:31 +00:00
Nuno Lopes f9ef0c675b fix folding of comma if given a non-constant operand.
Eli please take a look, as I'm not sure if this gets the extension warning in the right place

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59422 91177308-0d34-0410-b5e6-96231b3b80d8
2008-11-16 20:09:07 +00:00
Chris Lattner 3cc5e5b526 Fix a bug where we didn't promote 'const float' (or typedefs) to
double in some places.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52846 91177308-0d34-0410-b5e6-96231b3b80d8
2008-06-27 22:48:56 +00:00
Chris Lattner a269ebfd91 implement codegen support for sizeof(void), fixing PR2080.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47429 91177308-0d34-0410-b5e6-96231b3b80d8
2008-02-21 05:45:29 +00:00
Chris Lattner 6860f3cef7 Fix PR1921 by promoting negative indices to intptrty.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46599 91177308-0d34-0410-b5e6-96231b3b80d8
2008-01-31 04:12:50 +00:00
Chris Lattner 01e3c9e06d fix a problem reported by Eli, caused by not keeping bool as i1
when in a register.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46552 91177308-0d34-0410-b5e6-96231b3b80d8
2008-01-30 07:01:17 +00:00
Chris Lattner 8f925280ab Fix a crash reported by Seo Sanghyeon.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45530 91177308-0d34-0410-b5e6-96231b3b80d8
2008-01-03 06:36:51 +00:00
Chris Lattner efdd1574e3 Fix PR1895: a crash on an ugly gcc extension.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45505 91177308-0d34-0410-b5e6-96231b3b80d8
2008-01-02 21:54:09 +00:00