| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
llvm-svn: 162201
|
| |
|
|
| |
llvm-svn: 162196
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The DAGCombiner tries to optimise a BUILD_VECTOR by checking if it
consists purely of get_vector_elts from one or two source vectors. If
so, it either makes a concat_vectors node or a shufflevector node.
However, it doesn't check the element type width of the underlying
vector, so if you have this sequence:
Node0: v4i16 = ...
Node1: i32 = extract_vector_elt Node0
Node2: i32 = extract_vector_elt Node0
Node3: v16i8 = BUILD_VECTOR Node1, Node2, ...
It will attempt to:
Node0: v4i16 = ...
NewNode1: v16i8 = concat_vectors Node0, ...
Where this is actually invalid because the element width is completely
different. This causes an assertion failure on DAG legalization stage.
Fix:
If output item type of BUILD_VECTOR differs from input item type.
Make concat_vectors based on input element type and then bitcast it to the output vector type. So the case described above will transformed to:
Node0: v4i16 = ...
NewNode1: v8i16 = concat_vectors Node0, ...
NewNode2: v16i8 = bitcast NewNode1
llvm-svn: 162195
|
| |
|
|
| |
llvm-svn: 162194
|
| |
|
|
| |
llvm-svn: 162193
|
| |
|
|
| |
llvm-svn: 162192
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
this allows for better code generation.
Added a new DAGCombine transformation to convert FMAX and FMIN to FMANC and
FMINC, which are commutative.
For example:
movaps %xmm0, %xmm1
movsd LC(%rip), %xmm0
minsd %xmm1, %xmm0
becomes:
minsd LC(%rip), %xmm0
llvm-svn: 162187
|
| |
|
|
| |
llvm-svn: 162186
|
| |
|
|
| |
llvm-svn: 162180
|
| |
|
|
|
|
|
| |
These nodes are no longer needed because the peephole pass can fold
CMOV+AND into ANDCC etc.
llvm-svn: 162179
|
| |
|
|
|
|
| |
class, but the base class methods aren't virtual so it just increased call overhead.
llvm-svn: 162178
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This turns common i1 patterns into predicated instructions:
(add (zext cc), x) -> (select cc (add x, 1), x)
(add (sext cc), x) -> (select cc (add x, -1), x)
For a function like:
unsigned f(unsigned s, int x) {
return s + (x>0);
}
We now produce:
cmp r1, #0
it gt
addgt.w r0, r0, #1
Instead of:
movs r2, #0
cmp r1, #0
it gt
movgt r2, #1
add r0, r2
llvm-svn: 162177
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add these transformations to the existing add/sub ones:
(and (select cc, -1, c), x) -> (select cc, x, (and, x, c))
(or (select cc, 0, c), x) -> (select cc, x, (or, x, c))
(xor (select cc, 0, c), x) -> (select cc, x, (xor, x, c))
The selects can then be transformed to a single predicated instruction
by peephole.
This transformation will make it possible to eliminate the ISD::CAND,
COR, and CXOR custom DAG nodes.
llvm-svn: 162176
|
| |
|
|
|
|
| |
single IR instruction.
llvm-svn: 162175
|
| |
|
|
| |
llvm-svn: 162174
|
| |
|
|
|
|
| |
to shrink from double to float.
llvm-svn: 162173
|
| |
|
|
|
|
| |
better compare/branch code.
llvm-svn: 162172
|
| |
|
|
|
|
| |
Make sure the generic pattern is used.
llvm-svn: 162170
|
| |
|
|
|
|
| |
functional change intended.
llvm-svn: 162166
|
| |
|
|
| |
llvm-svn: 162165
|
| |
|
|
| |
llvm-svn: 162164
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
arithmetic instructions. However, when small data types are used, a truncate
node appears between the SETCC node and the arithmetic operation. This patch
adds support for this pattern.
Before:
xorl %esi, %edi
testb %dil, %dil
setne %al
ret
After:
xorb %dil, %sil
setne %al
ret
rdar://12081007
llvm-svn: 162160
|
| |
|
|
|
|
|
|
|
| |
operations
so other unexpected operations don't slip through. Based on patch by Logan Chien.
PR11786/PR13186.
llvm-svn: 162146
|
| |
|
|
|
|
| |
SSAUpdater was created and destroyed without being initialized.
llvm-svn: 162137
|
| |
|
|
| |
llvm-svn: 162136
|
| |
|
|
|
|
|
|
|
|
| |
No new tests are added.
All tests in ExecutionEngine/MCJIT that have been failing pass after this patch
is applied (when "make check" is done on a mips board).
Patch by Petar Jovanovic.
llvm-svn: 162135
|
| |
|
|
|
|
| |
<rdar://problem/10545247>
llvm-svn: 162131
|
| |
|
|
|
|
|
|
|
| |
PEI can't handle the pseudo-instructions. This can be removed when the
pseudo-instructions are replaced by normal predicated instructions.
Fixes PR13628.
llvm-svn: 162130
|
| |
|
|
|
|
| |
Patch by Vladimir Medic.
llvm-svn: 162124
|
| |
|
|
|
|
|
|
|
|
| |
The previous fix only checked for simple cycles, use a set to catch longer
cycles too.
Drop the broken check from the ObjectSizeOffsetEvaluator. The BoundsChecking
pass doesn't have to deal with invalid IR like InstCombine does.
llvm-svn: 162120
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
make it more consistent with its intended semantics.
The `linker_private_weak_def_auto' linkage type was meant to automatically hide
globals which never had their addresses taken. It has nothing to do with the
`linker_private' linkage type, which outputs the symbols with a `l' (ell) prefix
among other things.
The intended semantic is more like the `linkonce_odr' linkage type.
Change the name of the linkage type to `linkonce_odr_auto_hide'. And therefore
changing the semantics so that it produces the correct output for the linker.
Note: The old linkage name `linker_private_weak_def_auto' will still parse but
is not a synonym for `linkonce_odr_auto_hide'. This should be removed in 4.0.
<rdar://problem/11754934>
llvm-svn: 162114
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
multiple edges between two blocks is linear. If the caller is iterating all
edges leaving a BB that would be a square time algorithm. It is more efficient
to have the callers handle that case.
Currently the only callers are:
* GVN: already avoids the multiple edge case.
* Verifier: could only hit this assert when looking at an invalid invoke. Since
it already rejects the invoke, just avoid computing the dominance for it.
llvm-svn: 162113
|
| |
|
|
| |
llvm-svn: 162107
|
| |
|
|
|
|
| |
legalizer may call us with an overly large type.
llvm-svn: 162101
|
| |
|
|
|
|
|
|
|
| |
Increment the MBB iterator at the top of the loop to properly handle the
current (and previous) instructions getting erased.
This fixes PR13625.
llvm-svn: 162099
|
| |
|
|
|
|
|
|
| |
unreachable code due to constant propagation.
Fixes PR13621.
llvm-svn: 162098
|
| |
|
|
|
|
|
|
| |
I really need to find a way to automate this, but I can't come up with a regex
that has no false positives while handling tricky cases like custom check
prefixes.
llvm-svn: 162097
|
| |
|
|
| |
llvm-svn: 162094
|
| |
|
|
|
|
| |
errors about whether to convert Idx to ArrayRef<Constant *> or ArrayRef<Value *> like ConstantFolder and TargetFolder.
llvm-svn: 162090
|
| |
|
|
| |
llvm-svn: 162089
|
| |
|
|
|
|
| |
reduce to only a single call to it thus allowing it to be inlined by the compiler.
llvm-svn: 162088
|
| |
|
|
|
|
|
| |
include/llvm/IntrinsicsHexagon.td: Hexagon_Intrinsic is the base class
for all Hexagon intrinsics and not altivec intrinsics.
llvm-svn: 162087
|
| |
|
|
| |
llvm-svn: 162086
|
| |
|
|
| |
llvm-svn: 162085
|
| |
|
|
| |
llvm-svn: 162082
|
| |
|
|
|
|
|
|
| |
printed if the number of tests are less than the number of default threads.
Thanks to Vinson Lee, reported in PR13620.
llvm-svn: 162078
|
| |
|
|
|
|
|
| |
templated union at the request of Richard Smith. This makes it
substantially easier to type. =]
llvm-svn: 162072
|
| |
|
|
|
|
|
|
|
|
| |
It is not my plan to duplicate the entire ARM instruction set with
predicated versions. We need a way of representing predicated
instructions in SSA form without requiring a separate opcode.
Then the pseudo-instructions can go away.
llvm-svn: 162061
|
| |
|
|
|
|
| |
Use the target independent select analysis hooks.
llvm-svn: 162060
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Select instructions pick one of two virtual registers based on a
condition, like x86 cmov. On targets like ARM that support predication,
selects can sometimes be eliminated by predicating the instruction
defining one of the operands.
Teach PeepholeOptimizer to recognize select instructions, and ask the
target to optimize them.
llvm-svn: 162059
|