|  | Commit message (Collapse) | Author | Age | Files | Lines | 
|---|
| | 
| 
| 
| 
| 
| | when a break/continue won't cross a try block.
llvm-svn: 60998 | 
| | 
| 
| 
| 
| 
| | (Saving the stack isn't implemented right now :)
llvm-svn: 60925 | 
| | 
| 
| 
| | llvm-svn: 59881 | 
| | 
| 
| 
| 
| 
| | Patch by Fariborz!
llvm-svn: 59377 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | landing pads.
 - Primarily a cleanliness issue instead of a performance issue (this
   eliminates all blocks w/o predecessors on 176.gcc/expr.c), but this
   also allows subsequent code to recognize it is unreachable and
   potentially avoid IRgen.
llvm-svn: 59211 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | - Use dotted notation for blocks related to a particular statement
   type.
 - Use .end for landing pads.
No functionality change in NDEBUG mode. :)
llvm-svn: 59210 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | - Indicates that caller is done with the block and it can be dropped
   if it has no predecessors. Useful for callers who need to make
   landing pads but which may not be reached.
No functionality change.
llvm-svn: 59207 | 
| | 
| 
| 
| 
| 
| 
| 
| | more confusing ifelse.
Use dotted names for if blocks (if.then vs ifthen).
llvm-svn: 59201 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | - Split out "simple" statements which can easily handle IR generation
   when there is no insert point. These are generally statements which
   start by emitting a new block or are only containers for other
   statements.
 - This fixes a regression in emitting dummy blocks, notably for case
   statements.
 - This also fixes spurious emission of a number of debug stoppoint
   intrinsic instructions.
Remove unneeded sw.body block, just clear the insertion point.
Lift out CodeGenFunction::EmitStopPoint which calls into the
CGDebugInfo class when generating debug info.
Normalize definitions of Emit{Break,Continue}Stmt and usage of
ErrorUnsupported.
llvm-svn: 59118 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | CodeGenFunction.cpp.  Change VisitConditionalOperator to use
constant fold instead of codegen'ing a constant conditional.
Change ForStmt to use EmitBranchOnBoolExpr, this shrinks
expr.c very slightly to 40239 lines.
llvm-svn: 59113 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | have a condition that is an &&/||.  Before we used to compile things like this:
int test() {
  if (x && y) foo(); else bar();
}
into:
	%0 = load i32* @x		; <i32> [#uses=1]
	%1 = icmp ne i32 %0, 0		; <i1> [#uses=1]
	br i1 %1, label %land_rhs, label %land_cont
land_rhs:		; preds = %entry
	%2 = load i32* @y		; <i32> [#uses=1]
	%3 = icmp ne i32 %2, 0		; <i1> [#uses=1]
	br label %land_cont
land_cont:		; preds = %land_rhs, %entry
	%4 = phi i1 [ false, %entry ], [ %3, %land_rhs ]		; <i1> [#uses=1]
	br i1 %4, label %ifthen, label %ifelse
ifthen:		; preds = %land_cont
	%call = call i32 (...)* @foo()		; <i32> [#uses=0]
	br label %ifend
ifelse:		; preds = %land_cont
	%call1 = call i32 (...)* @bar()		; <i32> [#uses=0]
	br label %ifend
ifend:		; preds = %ifelse, %ifthen
Now we turn it into the much more svelte code:
        %0 = load i32* @x               ; <i32> [#uses=1]
        %1 = icmp ne i32 %0, 0          ; <i1> [#uses=1]
        br i1 %1, label %land_lhs_true, label %ifelse
land_lhs_true:          ; preds = %entry
        %2 = load i32* @y               ; <i32> [#uses=1]
        %3 = icmp ne i32 %2, 0          ; <i1> [#uses=1]
        br i1 %3, label %ifthen, label %ifelse
ifthen:         ; preds = %land_lhs_true
        %call = call i32 (...)* @foo()          ; <i32> [#uses=0]
        br label %ifend
ifelse:         ; preds = %land_lhs_true, %entry
        %call1 = call i32 (...)* @bar()         ; <i32> [#uses=0]
        br label %ifend
ifend:          ; preds = %ifelse, %ifthen
Note the lack of a phi node.
This shrinks the -O0 .ll file for 176.gcc/expr.c from 43176 to 40267 lines.
llvm-svn: 59111 | 
| | 
| 
| 
| | llvm-svn: 59103 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | - EmitStmt is no longer required to finish with a current insertion
   point defined (i.e. it does not need to make dummy
   blocks). Instead, it can clear the insertion point in the builder
   which indicates that the current insertion point is unreachable.
 - CodeGenFunction provides HaveInsertPoint and EnsureInsertPoint
   which respectively test if there is an insert point and ensure an
   insertion point exists (by making a dummy block).
 - Clearly mark functions in CodeGenFunction which can be called with
   no insertion point defined. Currently this is a limited set, and
   EmitStmt simply EnsureInsertPoint()s before emitting subsequent IR.
Remove EmitDummyBlock, which is no longer needed. Clients who haven't
already cleared the insertion point (typically via EmitBranch) can do
so by hand.
Remove isDummyBlock, which has effectively been renamed to
HaveInsertPoint.
The main thrust of this change is that we no longer have create dummy
blocks just to destroy them a short time later in EmitBlock in the
common case that there is no unreachable code following something like
a goto. 
Additionally, this means that we are not using the hokey condition in
isDummyBlock that a block without a name is a dummy block. Guess how
well that works when we never emit block names!
llvm-svn: 59089 | 
| | 
| 
| 
| 
| 
| | invariants.
llvm-svn: 59085 | 
| | 
| 
| 
| 
| 
| 
| | - Emits an unconditional branch, with extra logic to avoid generating
   spurious branches out of dummy blocks.
llvm-svn: 59037 | 
| | 
| 
| 
| 
| 
| 
| 
| | the size of the -O0 output on some cases.  For example, on expr.c from
176.gcc, it shrinks the .ll file from 43164 to 42835 lines, and removed
references to two external symbols.
llvm-svn: 59034 | 
| | 
| 
| 
| 
| 
| 
| | condition is a constant.  This shrinks -O0 codegen by quite a bit
on some cases.
llvm-svn: 59033 | 
| | 
| 
| 
| 
| 
| 
| | "dummy" blocks (blocks just used to make sure we have a place to dump
code to).
llvm-svn: 59022 | 
| | 
| 
| 
| 
| 
| | - Was confusing and only used in one small part of the code.
llvm-svn: 59020 | 
| | 
| 
| 
| 
| 
| | - No functionality change.
llvm-svn: 59017 | 
| | 
| 
| 
| | llvm-svn: 58940 | 
| | 
| 
| 
| 
| 
| | assert.
llvm-svn: 57721 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| | simplifies clients.
Also, add assert that RegionStack is empty when the CGDebugInfo is
destroyed.
llvm-svn: 57684 | 
| | 
| 
| 
| | llvm-svn: 57392 | 
| | 
| 
| 
| 
| 
| | scoped decl chain.
llvm-svn: 57192 | 
| | 
| 
| 
| 
| 
| 
| | handling blocks.
 - This has false positives, but at least prevents miscompiles.
llvm-svn: 56958 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | - Provides a basic primitive to jump to an arbitrary basic block,
   through the finally code.
 - Only used for return statements and rethrow currently. Still need
   to handle break, continue and goto.
 - Code still needs to be shuffled around to live elsewhere.
llvm-svn: 56827 | 
| | 
| 
| 
| | llvm-svn: 56762 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | - Add CodeGenFunction::{EmitReturnOfRValue, EmitIvarOffset}
 - Factor EmitLValueForIvar out of EmitObjCIvarRefLValue.
No non-error functionality change (some unsupported errors are
degraded to asserts for the time being).
llvm-svn: 56543 | 
| | 
| 
| 
| | llvm-svn: 56102 | 
| | 
| 
| 
| | llvm-svn: 56101 | 
| | 
| 
| 
| 
| 
| 
| | - For the time being this means our emitted code is somewhat worse,
   especially for aggregates. This will be fixed.
llvm-svn: 56013 | 
| | 
| 
| 
| | llvm-svn: 55983 | 
| | 
| 
| 
| 
| 
| | Add CodeGenFunction::EmitMemSetToZero and make AggExprEmitter::EmitAggregateClear use it.
llvm-svn: 55573 | 
| | 
| 
| 
| 
| 
| | - Notably VLAs
llvm-svn: 55544 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | Implement Obj-C lvalue message sends (aggregate returns).
Update several places to emit more precise ErrorUnsupported warnings
  for currently unimplemented Obj-C features (main missing chunks are
  property references, Obj-C exception handling, and the for ... in
  syntax).
llvm-svn: 55234 | 
| | 
| 
| 
| 
| 
| 
| | - We are beyond the point where this shows up often and when it does
   generating miscompiled files is bad.
llvm-svn: 54836 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | - Kill unnecessary #includes in .cpp files. This is an automatic
   sweep so some things removed are actually used, but happen to be
   included by a previous header. I tried to get rid of the obvious
   examples and this was the easiest way to trim the #includes in one
   fell swoop.
 - We now return to regularly scheduled development.
llvm-svn: 54632 | 
| | 
| 
| 
| 
| 
| | - Remove internal uses of AST.h
llvm-svn: 54628 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | - Follows emission scheme used by llvm-gcc, i.e. invent an id for
   each label whose address is taken and replace each indirect goto by
   a switch to each possible target.
 - Currently we emit a switch for each indirect goto instead of
   merging them as llvm-gcc does.
llvm-svn: 54318 | 
| | 
| 
| 
| | llvm-svn: 54100 | 
| | 
| 
| 
| | llvm-svn: 54099 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | - Fix multiple issues with the way case ranges were emitted, see test
   cases details about the specific issues.
 - The root issue was not being careful about how basic blocks were
   emitted which led to them being chained together incorrectly,
   resulting in improper control flow.
 - Fixes <rdar://problem/6098585>
llvm-svn: 54006 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | - Also cleaned up emission slightly 
 - Inspection of the code revealed several other bugs, however. Case
   ranges are not properly wired and can result in switch cases being
   dropped or even infinite loops. See: <rdar://problem/6098585>
Completes: <rdar://problem/6094119>
llvm-svn: 53975 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | qualifier in the lvalue, and changes lvalue loads/stores to honor 
the volatile flag.  Places which need some further attention are marked 
with FIXMEs.
Patch by Cédric Venet.
llvm-svn: 52264 | 
| | 
| 
| 
| 
| 
| | Also take care of freeing memory at the right places.
llvm-svn: 51553 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | llvm::Type::isSingleValueType. Currently these two functions have
the same behavior, but soon isFirstClassType will return true for
struct and array types.
Clang may some day want to use of isFirstClassType for some of
these some day as an optimization, but it'll require some
consideration.
llvm-svn: 51446 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | actually work (instead of crashing llc), and there's enough info emitted 
to get line number information in gdb. This should hopefully be helpful 
for debugging non-working programs.
I got rid of the begin/endregion calls because the implementation wasn't 
working; someone who knows the debugging info a bit better might try to 
add it. I really have no clue how a compiler is supposed to emit them.
This commit shouldn't have any effect without -g.
llvm-svn: 51404 | 
| | 
| 
| 
| 
| 
| | ret.
llvm-svn: 51403 | 
| | 
| 
| 
| | llvm-svn: 50968 |