| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Where previously LLVM might emit code like this:
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %al, %cl
jne .LBB4_2
it now emits this:
ucomisd %xmm1, %xmm0
jne .LBB4_2
jp .LBB4_2
It has fewer instructions and uses fewer registers, but it does
have more branches. And in the case that this code is followed by
a non-fallthrough edge, it may be followed by a jmp instruction,
resulting in three branch instructions in sequence. Some effort
is made to avoid this situation.
To achieve this, X86ISelLowering.cpp now recognizes FCMP_OEQ and
FCMP_UNE in lowered form, and replace them with code that emits
two branches, except in the case where it would require converting
a fall-through edge to an explicit branch.
Also, X86InstrInfo.cpp's branch analysis and transform code now
knows now to handle blocks with multiple conditional branches. It
uses loops instead of having fixed checks for up to two
instructions. It can now analyze and transform code generated
from FCMP_OEQ and FCMP_UNE.
llvm-svn: 57873
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
the copy instruction from the instruction list before asking the
target to create the new instruction. This gets the old instruction
out of the way so that it doesn't interfere with the target's
rematerialization code. In the case of x86, this helps it find
more cases where EFLAGS is not live.
Also, in the X86InstrInfo.cpp, teach isSafeToClobberEFLAGS to check
to see if it reached the end of the block after scanning each
instruction, instead of just before. This lets it notice when the
end of the block is only two instructions away, without doing any
additional scanning.
These changes allow rematerialization to clobber EFLAGS in more
cases, for example using xor instead of mov to set the return value
to zero in the included testcase.
llvm-svn: 57872
|
| |
|
|
|
|
| |
that NaNs are less common.
llvm-svn: 57871
|
| |
|
|
| |
llvm-svn: 57870
|
| |
|
|
| |
llvm-svn: 57869
|
| |
|
|
| |
llvm-svn: 57864
|
| |
|
|
| |
llvm-svn: 57863
|
| |
|
|
|
|
|
|
|
| |
for strange asm conditions earlier. In this case, we have a
double being passed in an integer reg class. Convert to like
sized integer register so that we allocate the right number
for the class (two i32's for the f64 in this case).
llvm-svn: 57862
|
| |
|
|
|
|
| |
that a denominator cannot be zero even when the result of an '/' or '%' expression is unknown.
llvm-svn: 57855
|
| |
|
|
|
|
| |
compound assignment when the result of the assignment is not known.
llvm-svn: 57852
|
| |
|
|
|
|
| |
compound assignment is UnknownVal().
llvm-svn: 57851
|
| |
|
|
|
|
| |
on id<protocol>.
llvm-svn: 57850
|
| |
|
|
| |
llvm-svn: 57847
|
| |
|
|
|
|
|
|
|
|
| |
is re-written by the callback to branch directly to the compiled code
in future invocations.
Added back in range-based memory permission functions for the updating of
the stub on Darwin.
llvm-svn: 57846
|
| |
|
|
| |
llvm-svn: 57845
|
| |
|
|
| |
llvm-svn: 57844
|
| |
|
|
| |
llvm-svn: 57843
|
| |
|
|
|
|
| |
of ObjC qualified id types to be consistent with gcc. This changes a handful of test case errors into warnings (diff will tell you which cases have changed).
llvm-svn: 57841
|
| |
|
|
|
|
|
|
|
| |
result type when the result type is legal but
not the operand type. Add additional support
for EXTRACT_SUBVECTOR and CONCAT_VECTORS,
needed to handle such cases.
llvm-svn: 57840
|
| |
|
|
|
|
|
|
| |
sensible for vectors being scalarized. Note
that this method can't return anything very
sensible when splitting non-power-of-two vectors.
llvm-svn: 57839
|
| |
|
|
| |
llvm-svn: 57838
|
| |
|
|
|
|
| |
with TLI.getPointerTy for a small simplification.
llvm-svn: 57837
|
| |
|
|
|
|
|
|
| |
the condition of a SELECT node. Make sure that the
correct extension type (any-, sign- or zero-extend)
is used.
llvm-svn: 57836
|
| |
|
|
| |
llvm-svn: 57834
|
| |
|
|
|
|
| |
use an MVT::i1 and simplify the code while there.
llvm-svn: 57833
|
| |
|
|
| |
llvm-svn: 57832
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
LowerOperation if it doesn't know what else to do.
This methods should probably be factorized some,
but this is good enough for the moment. Have
LowerATOMIC_BINARY_64 use EXTRACT_ELEMENT rather
than assuming the operand is a BUILD_PAIR (if it
is then getNode will automagically simplify the
EXTRACT_ELEMENT). This way LowerATOMIC_BINARY_64
usable from LegalizeTypes.
llvm-svn: 57831
|
| |
|
|
| |
llvm-svn: 57829
|
| |
|
|
| |
llvm-svn: 57828
|
| |
|
|
| |
llvm-svn: 57827
|
| |
|
|
| |
llvm-svn: 57820
|
| |
|
|
| |
llvm-svn: 57818
|
| |
|
|
|
|
| |
strcmp when needed.
llvm-svn: 57817
|
| |
|
|
| |
llvm-svn: 57816
|
| |
|
|
| |
llvm-svn: 57815
|
| |
|
|
| |
llvm-svn: 57814
|
| |
|
|
| |
llvm-svn: 57813
|
| |
|
|
|
|
| |
weird errors about property attributes being unknown.
llvm-svn: 57812
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
crash.m:8:12: error: type name requires a specifier or qualifier
@property (readonlyx, getter=isAwesome) int _awesome;
^
crash.m:8:29: error: expected ';' at end of declaration list
@property (readonlyx, getter=isAwesome) int _awesome;
^
crash.m:8:39: error: expected identifier or '('
@property (readonlyx, getter=isAwesome) int _awesome;
^
we now get:
crash.m:8:12: error: unknown property attribute 'readonlyx'
@property (readonlyx, getter=isAwesome) int _awesome;
^
Also, we can eliminate isObjCPropertyAttribute now.
llvm-svn: 57811
|
| |
|
|
| |
llvm-svn: 57810
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
ParseObjCPropertyAttribute. Before, on this code (where
a comma was forgotten):
@property (readonly getter=isAwesome) int _awesome;
we emitted:
crash.m:9:11: error: expected ')'
@property (readonly getter=isAwesome) int _awesome;
^
crash.m:9:37: error: type name requires a specifier or qualifier
@property (readonly getter=isAwesome) int _awesome;
^
crash.m:9:37: error: expected identifier or '('
crash.m:9:37: error: expected ';' at end of declaration list
crash.m:9:1: error: @property requires fields to be named
@property (readonly getter=isAwesome) int _awesome;
^
now we emit:
crash.m:9:21: error: expected ')'
@property (readonly getter=isAwesome) int _awesome;
^
crash.m:9:11: error: to match this '('
@property (readonly getter=isAwesome) int _awesome;
^
llvm-svn: 57809
|
| |
|
|
| |
llvm-svn: 57808
|
| |
|
|
| |
llvm-svn: 57807
|
| |
|
|
| |
llvm-svn: 57806
|
| |
|
|
|
|
| |
@property (readonly) int : 4;
llvm-svn: 57805
|
| |
|
|
|
|
|
| |
occurs, skip to an @ or ; instead of to a } or ;. Properties
don't necessarily live in {}'s.
llvm-svn: 57804
|
| |
|
|
|
|
|
|
|
|
| |
Check for @end in ParseObjCInterfaceDeclList instead of in each caller
Handle @required and @optional with the same code
Add some fixmes about some apparently objc2 code that is being accepted
in objc1.
llvm-svn: 57803
|
| |
|
|
|
|
|
|
|
|
|
| |
where it would reject @required in non-protocols, but then go
ahead and tag methods with required anyway. Instead, if we see
this in something other than a protocol, just ignore the request.
Also, improve error recovery a bit when we see something bogus
inside an interface.
llvm-svn: 57798
|
| |
|
|
|
|
| |
to make it easier to understand. No functionality change.
llvm-svn: 57797
|
| |
|
|
|
|
| |
move it to its own predicate to make it more clear.
llvm-svn: 57796
|