[llvm-commits] CVS: llvm/test/CodeGen/X86/bitcast2.ll

2007-06-17 Thread Chris Lattner


Changes in directory llvm/test/CodeGen/X86:

bitcast2.ll added (r1.1)
---
Log message:

ensure we don't regress on these tests.  We generate aweful code in x86-32 for
these though.


---
Diffs of the changes:  (+13 -0)

 bitcast2.ll |   13 +
 1 files changed, 13 insertions(+)


Index: llvm/test/CodeGen/X86/bitcast2.ll
diff -c /dev/null llvm/test/CodeGen/X86/bitcast2.ll:1.1
*** /dev/null   Sun Jun 17 18:30:07 2007
--- llvm/test/CodeGen/X86/bitcast2.ll   Sun Jun 17 18:29:57 2007
***
*** 0 
--- 1,13 
+ ; RUN: llvm-as < %s | llc -march=x86-64 | grep movd | wc -l | grep 2
+ ; RUN: llvm-as < %s | llc -march=x86-64 | not grep rsp
+ 
+ define i64 @test1(double %A) {
+%B = bitcast double %A to i64
+ret i64 %B
+ }
+ 
+ define double @test2(i64 %A) {
+%B = bitcast i64 %A to double
+ret double %B
+ }
+ 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


Re: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp

2007-06-17 Thread Chris Lattner

On Jun 16, 2007, at 4:57 PM, Bill Wendling wrote:

> Revert patch. It regresses:
>
> define double @test2(i64 %A) {
>%B = bitcast i64 %A to double
>ret double %B
> }

Thanks Bill,

-Chris

___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


Re: [llvm-commits] CVS: llvm/lib/CodeGen/LiveIntervalAnalysis.cpp VirtRegMap.cpp

2007-06-17 Thread Evan Cheng
Hi Dan,

Is this necessary? ARM is already doing this by marking trivially re- 
materializable instructions with let isReMaterializable = 1.

Evan

On Jun 14, 2007, at 1:51 PM, Dan Gohman wrote:

>
>
> Changes in directory llvm/lib/CodeGen:
>
> LiveIntervalAnalysis.cpp updated: 1.246 -> 1.247
> VirtRegMap.cpp updated: 1.111 -> 1.112
> ---
> Log message:
>
> Add a target hook to allow loads from constant pools to be  
> rematerialized, and an
> implementation for x86.
>
>
> ---
> Diffs of the changes:  (+6 -3)
>
>  LiveIntervalAnalysis.cpp |6 --
>  VirtRegMap.cpp   |3 ++-
>  2 files changed, 6 insertions(+), 3 deletions(-)
>
>
> Index: llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
> diff -u llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.246 llvm/lib/ 
> CodeGen/LiveIntervalAnalysis.cpp:1.247
> --- llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.246   Fri Jun  8  
> 12:18:56 2007
> +++ llvm/lib/CodeGen/LiveIntervalAnalysis.cpp Thu Jun 14 15:50:44 2007
> @@ -336,12 +336,14 @@
>// time we see a vreg.
>if (interval.empty()) {
>  // Remember if the definition can be rematerialized. All  
> load's from fixed
> -// stack slots are re-materializable.
> +// stack slots are re-materializable. The target may permit  
> other loads to
> +// be re-materialized as well.
>  int FrameIdx = 0;
>  if (vi.DefInst &&
>  (tii_->isReMaterializable(vi.DefInst->getOpcode()) ||
>   (tii_->isLoadFromStackSlot(vi.DefInst, FrameIdx) &&
> -  mf_->getFrameInfo()->isFixedObjectIndex(FrameIdx
> +  mf_->getFrameInfo()->isFixedObjectIndex(FrameIdx)) ||
> + tii_->isOtherReMaterializableLoad(vi.DefInst)))
>interval.remat = vi.DefInst;
>
>  // Get the Idx of the defining instructions.
>
>
> Index: llvm/lib/CodeGen/VirtRegMap.cpp
> diff -u llvm/lib/CodeGen/VirtRegMap.cpp:1.111 llvm/lib/CodeGen/ 
> VirtRegMap.cpp:1.112
> --- llvm/lib/CodeGen/VirtRegMap.cpp:1.111 Thu Apr 26 13:59:33 2007
> +++ llvm/lib/CodeGen/VirtRegMap.cpp   Thu Jun 14 15:50:44 2007
> @@ -664,7 +664,8 @@
>  // If this instruction is being rematerialized, just remove it!
>  int FrameIdx;
>  if ((TID->Flags & M_REMATERIALIZIBLE) ||
> -TII->isLoadFromStackSlot(&MI, FrameIdx)) {
> +TII->isLoadFromStackSlot(&MI, FrameIdx) ||
> +TII->isOtherReMaterializableLoad(&MI)) {
>bool Remove = true;
>for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
>  MachineOperand &MO = MI.getOperand(i);
>
>
>
> ___
> llvm-commits mailing list
> llvm-commits@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


Re: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMInstrInfo.cpp ARMInstrInfo.h

2007-06-17 Thread Evan Cheng
Geeze. I was sure I would've been yelled at had I made it into a  
targetinstrinfo bit. :-)

Really didn't want to go with either approach. But I don't see a  
better alternative.

Evan

On Jun 15, 2007, at 2:37 PM, Chris Lattner wrote:

> On Jun 15, 2007, at 2:15 PM, Evan Cheng wrote:
>> Instructions with unique labels or embedded jumptables cannot be
>> duplicated during ifcvt.
>
> Please turn this into a targetinstrinfo bit.  Virtual methods should
> only be used for properties whose behavior is a property of the
> *operands* of the instruction in combination with the opcode.  This
> property seems to only depend on the opcode.
>
> -Chris
>
>> ---
>> Diffs of the changes:  (+31 -0)
>>
>>  ARMInstrInfo.cpp |   29 +
>>  ARMInstrInfo.h   |2 ++
>>  2 files changed, 31 insertions(+)
>>
>>
>> Index: llvm/lib/Target/ARM/ARMInstrInfo.cpp
>> diff -u llvm/lib/Target/ARM/ARMInstrInfo.cpp:1.36 llvm/lib/Target/
>> ARM/ARMInstrInfo.cpp:1.37
>> --- llvm/lib/Target/ARM/ARMInstrInfo.cpp:1.36Wed Jun 13 12:59:52  
>> 2007
>> +++ llvm/lib/Target/ARM/ARMInstrInfo.cpp Fri Jun 15 16:15:00 2007
>> @@ -446,6 +446,35 @@
>>return PIdx != -1 && MI->getOperand(PIdx).getImmedValue() !=
>> ARMCC::AL;
>>  }
>>
>> +bool ARMInstrInfo::CanBeDuplicated(const MachineInstr *MI) const {
>> +  switch (MI->getOpcode()) {
>> +  default: return true;
>> +  // These have unique labels.
>> +  case ARM::PICADD:
>> +  case ARM::PICLD:
>> +  case ARM::PICLDZH:
>> +  case ARM::PICLDZB:
>> +  case ARM::PICLDH:
>> +  case ARM::PICLDB:
>> +  case ARM::PICLDSH:
>> +  case ARM::PICLDSB:
>> +  case ARM::PICSTR:
>> +  case ARM::PICSTRH:
>> +  case ARM::PICSTRB:
>> +  case ARM::LEApcrel:
>> +  case ARM::LEApcrelJT:
>> +  case ARM::tPICADD:
>> +  case ARM::tLEApcrel:
>> +  case ARM::tLEApcrelJT:
>> +  case ARM::CONSTPOOL_ENTRY:
>> +  // These embed jumptables.
>> +  case ARM::BR_JTr:
>> +  case ARM::BR_JTm:
>> +  case ARM::BR_JTadd:
>> +return false;
>> +  }
>> +}
>> +
>>  bool ARMInstrInfo::PredicateInstruction(MachineInstr *MI,
>>  const std::vector
>> &Pred) const {
>>unsigned Opc = MI->getOpcode();
>>
>>
>> Index: llvm/lib/Target/ARM/ARMInstrInfo.h
>> diff -u llvm/lib/Target/ARM/ARMInstrInfo.h:1.13 llvm/lib/Target/ARM/
>> ARMInstrInfo.h:1.14
>> --- llvm/lib/Target/ARM/ARMInstrInfo.h:1.13  Tue May 29 13:42:18 2007
>> +++ llvm/lib/Target/ARM/ARMInstrInfo.h   Fri Jun 15 16:15:00 2007
>> @@ -106,6 +106,8 @@
>>// Predication support.
>>virtual bool isPredicated(const MachineInstr *MI) const;
>>
>> +  virtual bool CanBeDuplicated(const MachineInstr *MI) const;
>> +
>>virtual
>>bool PredicateInstruction(MachineInstr *MI,
>>  const std::vector
>> &Pred) const;
>>
>>
>>
>> ___
>> llvm-commits mailing list
>> llvm-commits@cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> ___
> llvm-commits mailing list
> llvm-commits@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Transforms/Scalar/GVNPRE.cpp

2007-06-17 Thread Owen Anderson


Changes in directory llvm/lib/Transforms/Scalar:

GVNPRE.cpp updated: 1.34 -> 1.35
---
Log message:

Don't perform an expensive check if it's not necessary.


---
Diffs of the changes:  (+12 -2)

 GVNPRE.cpp |   14 --
 1 files changed, 12 insertions(+), 2 deletions(-)


Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.34 
llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.35
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.34  Fri Jun 15 19:26:54 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp   Sun Jun 17 23:30:44 2007
@@ -329,7 +329,12 @@
 lhsValid = true;
 break;
   }
-  lhsValid &= !dependsOnInvoke(BO->getOperand(0));
+  
+  // Check for dependency on invoke insts
+  // NOTE: This check is expensive, so don't do it if we
+  // don't have to
+  if (lhsValid)
+lhsValid = !dependsOnInvoke(BO->getOperand(0));
 
   bool rhsValid = !isa(BO->getOperand(1));
   if (!rhsValid)
@@ -339,7 +344,12 @@
   rhsValid = true;
   break;
 }
-  rhsValid &= !dependsOnInvoke(BO->getOperand(1));
+  
+  // Check for dependency on invoke insts
+  // NOTE: This check is expensive, so don't do it if we
+  // don't have to
+  if (rhsValid)
+rhsValid = !dependsOnInvoke(BO->getOperand(1));
   
   if (!lhsValid || !rhsValid)
 set.erase(BO);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Transforms/Scalar/GVNPRE.cpp

2007-06-17 Thread Owen Anderson


Changes in directory llvm/lib/Transforms/Scalar:

GVNPRE.cpp updated: 1.35 -> 1.36
---
Log message:

Fix indentation.


---
Diffs of the changes:  (+6 -6)

 GVNPRE.cpp |   12 ++--
 1 files changed, 6 insertions(+), 6 deletions(-)


Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.35 
llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.36
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.35  Sun Jun 17 23:30:44 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp   Sun Jun 17 23:31:21 2007
@@ -338,12 +338,12 @@
 
   bool rhsValid = !isa(BO->getOperand(1));
   if (!rhsValid)
-  for (std::set::iterator I = set.begin(), E = set.end();
-   I != E; ++I)
-if (VN[*I] == VN[BO->getOperand(1)]) {
-  rhsValid = true;
-  break;
-}
+for (std::set::iterator I = set.begin(), E = set.end();
+ I != E; ++I)
+  if (VN[*I] == VN[BO->getOperand(1)]) {
+rhsValid = true;
+break;
+  }
   
   // Check for dependency on invoke insts
   // NOTE: This check is expensive, so don't do it if we



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Transforms/Scalar/GVNPRE.cpp

2007-06-17 Thread Owen Anderson


Changes in directory llvm/lib/Transforms/Scalar:

GVNPRE.cpp updated: 1.36 -> 1.37
---
Log message:

Cache the results of dependsOnInvoke()


---
Diffs of the changes:  (+18 -4)

 GVNPRE.cpp |   22 ++
 1 files changed, 18 insertions(+), 4 deletions(-)


Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.36 
llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.37
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.36  Sun Jun 17 23:31:21 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp   Sun Jun 17 23:42:29 2007
@@ -103,6 +103,7 @@
 
 std::map > availableOut;
 std::map > anticipatedIn;
+std::map invokeDep;
 
 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
   AU.setPreservesCFG();
@@ -135,6 +136,8 @@
std::map > 
availOut);
 void cleanup();
 void elimination();
+
+bool dependsOnInvoke(Value* V);
   
   };
   
@@ -285,11 +288,15 @@
   }
 }
 
-bool dependsOnInvoke(Value* V) {
+bool GVNPRE::dependsOnInvoke(Value* V) {
   if (!isa(V))
 return false;
 
   User* U = cast(V);
+  std::map::iterator I = invokeDep.find(U);
+  if (I != invokeDep.end())
+return I->second;
+  
   std::vector worklist(U->op_begin(), U->op_end());
   std::set visited;
   
@@ -304,9 +311,15 @@
   return true;
 
 User* curr = cast(current);
-for (unsigned i = 0; i < curr->getNumOperands(); ++i)
-  if (visited.find(curr->getOperand(i)) == visited.end())
-worklist.push_back(curr->getOperand(i));
+std::map::iterator CI = invokeDep.find(curr);
+if (CI != invokeDep.end()) {
+  if (CI->second)
+return true;
+} else {
+  for (unsigned i = 0; i < curr->getNumOperands(); ++i)
+if (visited.find(curr->getOperand(i)) == visited.end())
+  worklist.push_back(curr->getOperand(i));
+}
   }
   
   return false;
@@ -593,6 +606,7 @@
   createdExpressions.clear();
   availableOut.clear();
   anticipatedIn.clear();
+  invokeDep.clear();
 
   std::map > generatedExpressions;
   std::map > generatedPhis;



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits