- Sep 01, 2010
-
-
Chris Lattner authored
instead of hoisting them, just fold them away. This occurs in the testcase for PR8041, for example. llvm-svn: 112669
-
Bill Wendling authored
int x(int t) { if (t & 256) return -26; return 0; } We generate this: tst.w r0, #256 mvn r0, #25 it eq moveq r0, #0 while gcc generates this: ands r0, r0, #256 it ne mvnne r0, #25 bx lr Scandalous really! During ISel time, we can look for this particular pattern. One where we have a "MOVCC" that uses the flag off of a CMPZ that itself is comparing an AND instruction to 0. Something like this (greatly simplified): %r0 = ISD::AND ... ARMISD::CMPZ %r0, 0 @ sets [CPSR] %r0 = ARMISD::MOVCC 0, -26 @ reads [CPSR] All we have to do is convert the "ISD::AND" into an "ARM::ANDS" that sets [CPSR] when it's zero. The zero value will all ready be in the %r0 register and we only need to change it if the AND wasn't zero. Easy! llvm-svn: 112664
-
Devang Patel authored
llvm-svn: 112659
-
- Aug 31, 2010
-
-
Owen Anderson authored
llvm-svn: 112635
-
Devang Patel authored
llvm-svn: 112631
-
Devang Patel authored
Remember byval argument's frame index during argument lowering and use this info to emit debug info. Fixes Radar 8367011. llvm-svn: 112623
-
Owen Anderson authored
llvm-svn: 112621
-
Chris Lattner authored
llvm-svn: 112617
-
Owen Anderson authored
llvm-svn: 112615
-
Chris Lattner authored
llvm-svn: 112613
-
Owen Anderson authored
I have not been able to find a way to test each in isolation, for a few reasons: 1) The ability to look-through non-i1 BinaryOperator's requires the ability to look through non-constant ICmps in order for it to ever trigger. 2) The ability to do LVI-powered PHI value determination only matters in cases that ProcessBranchOnPHI can't handle. Since it already handles all the cases without other instructions in the def-use chain between the PHI and the branch, it requires the ability to look through ICmps and/or BinaryOperators as well. llvm-svn: 112611
-
Jim Grosbach authored
llvm-svn: 112610
-
Owen Anderson authored
llvm-svn: 112592
-
Owen Anderson authored
llvm-svn: 112591
-
Owen Anderson authored
More Chris-inspired JumpThreading fixes: use ConstantExpr to correctly constant-fold undef, and be more careful with its return value. This actually exposed an infinite recursion bug in ComputeValueKnownInPredecessors which theoretically already existed (in JumpThreading's handling of and/or of i1's), but never manifested before. This patch adds a tracking set to prevent this case. llvm-svn: 112589
-
Owen Anderson authored
Remove r111665, which implemented store-narrowing in InstCombine. Chris discovered a miscompilation in it, and it's not easily fixable at the optimizer level. I'll investigate reimplementing it in DAGCombine. llvm-svn: 112575
-
Anton Korobeynikov authored
llvm-svn: 112555
-
Owen Anderson authored
llvm-svn: 112554
-
- Aug 30, 2010
-
-
Bob Wilson authored
Auto-upgrade the old intrinsic and update tests. llvm-svn: 112507
-
Chris Lattner authored
1) nuke ConstDataCoalSection, which is dead. 2) revise my previous patch for rdar://8018335, which was completely wrong. Specifically, it doesn't make sense to mark __TEXT,__const_coal as PURE_INSTRUCTIONS, because it is for readonly data. templates (it turns out) go to const_coal_nt. The real fix for rdar://8018335 was to give ConstTextCoalSection a section kind of ReadOnly instead of Text. llvm-svn: 112496
-
Michael J. Spencer authored
llvm-svn: 112486
-
NAKAMURA Takumi authored
llvm-svn: 112485
-
Michael J. Spencer authored
llvm-svn: 112483
-
Michael J. Spencer authored
The CMake build didn't define TEST_COMPILE_CXX_CMD. The tests assumed gcc. llvm-svn: 112480
-
Duncan Sands authored
llvm-svn: 112469
-
- Aug 29, 2010
-
-
Chris Lattner authored
out of loops, just delete them. llvm-svn: 112451
-
Dan Gohman authored
This has the side effect of reversing the order of most of IVUser's results. llvm-svn: 112442
-
Dan Gohman authored
llvm-svn: 112426
-
Dan Gohman authored
llvm-svn: 112425
-
Kalle Raiskila authored
The IDX was treated as byte index, not element index. llvm-svn: 112422
-
Bob Wilson authored
IR add/sub operations with one or both operands sign- or zero-extended. Auto-upgrade the old intrinsics. llvm-svn: 112416
-
Chris Lattner authored
llvm-svn: 112398
-
Chris Lattner authored
llvm-svn: 112396
-
- Aug 28, 2010
-
-
Chris Lattner authored
llvm-svn: 112386
-
Chris Lattner authored
insertp[sd] $0, which is a noop. Before: _f32: ## @f32 pshufd $1, %xmm1, %xmm2 pshufd $1, %xmm0, %xmm3 addss %xmm2, %xmm3 addss %xmm1, %xmm0 ## kill: XMM0<def> XMM0<kill> XMM0<def> insertps $0, %xmm0, %xmm0 insertps $16, %xmm3, %xmm0 ret after: _f32: ## @f32 movdqa %xmm0, %xmm2 addss %xmm1, %xmm2 pshufd $1, %xmm1, %xmm1 pshufd $1, %xmm0, %xmm3 addss %xmm1, %xmm3 movdqa %xmm2, %xmm0 insertps $16, %xmm3, %xmm0 ret The extra movs are due to a random (poor) scheduling decision. llvm-svn: 112379
-
Chris Lattner authored
when the top elements of a vector are undefined. This happens all the time for X86-64 ABI stuff because only the low 2 elements of a 4 element vector are defined. For example, on: _Complex float f32(_Complex float A, _Complex float B) { return A+B; } We used to produce (with SSE2, SSE4.1+ uses insertps): _f32: ## @f32 movdqa %xmm0, %xmm2 addss %xmm1, %xmm2 pshufd $16, %xmm2, %xmm2 pshufd $1, %xmm1, %xmm1 pshufd $1, %xmm0, %xmm0 addss %xmm1, %xmm0 pshufd $16, %xmm0, %xmm1 movdqa %xmm2, %xmm0 unpcklps %xmm1, %xmm0 ret We now produce: _f32: ## @f32 movdqa %xmm0, %xmm2 addss %xmm1, %xmm2 pshufd $1, %xmm1, %xmm1 pshufd $1, %xmm0, %xmm3 addss %xmm1, %xmm3 movaps %xmm2, %xmm0 unpcklps %xmm3, %xmm0 ret This implements rdar://8368414 llvm-svn: 112378
-
Benjamin Kramer authored
llvm-svn: 112364
-
Chris Lattner authored
being actively maintained, improved, or extended. llvm-svn: 112356
-
Chris Lattner authored
I'm aware of, aren't maintained, and LVI will be replacing their value. nlewycky approved this on irc. llvm-svn: 112355
-
Chris Lattner authored
like this: struct S { float A, B, C, D; }; struct S g; struct S bar() { struct S A = g; ++A.B; A.A = 42; return A; } we now generate: _bar: ## @bar ## BB#0: ## %entry movq _g@GOTPCREL(%rip), %rax movss 12(%rax), %xmm0 pshufd $16, %xmm0, %xmm0 movss 4(%rax), %xmm2 movss 8(%rax), %xmm1 pshufd $16, %xmm1, %xmm1 unpcklps %xmm0, %xmm1 addss LCPI1_0(%rip), %xmm2 pshufd $16, %xmm2, %xmm2 movss LCPI1_1(%rip), %xmm0 pshufd $16, %xmm0, %xmm0 unpcklps %xmm2, %xmm0 ret instead of: _bar: ## @bar ## BB#0: ## %entry movq _g@GOTPCREL(%rip), %rax movss 12(%rax), %xmm0 pshufd $16, %xmm0, %xmm0 movss 4(%rax), %xmm2 movss 8(%rax), %xmm1 pshufd $16, %xmm1, %xmm1 unpcklps %xmm0, %xmm1 addss LCPI1_0(%rip), %xmm2 movd %xmm2, %eax shlq $32, %rax addq $1109917696, %rax ## imm = 0x42280000 movd %rax, %xmm0 ret llvm-svn: 112345
-