diff --git a/lib/Target/Sparc/SparcV8ISelSimple.cpp b/lib/Target/Sparc/SparcV8ISelSimple.cpp index 68bc28a0f32..c93ced515ed 100644 --- a/lib/Target/Sparc/SparcV8ISelSimple.cpp +++ b/lib/Target/Sparc/SparcV8ISelSimple.cpp @@ -1016,6 +1016,16 @@ static inline BasicBlock *getBlockAfter(BasicBlock *BB) { /// static SetCondInst *canFoldSetCCIntoBranch(Value *V) { return 0; // disable. + if (SetCondInst *SCI = dyn_cast(V)) + if (SCI->hasOneUse()) { + BranchInst *User = dyn_cast(SCI->use_back()); + if (User + && (SCI->getNext() == User) + && (getClassB(SCI->getOperand(0)->getType()) != cLong) + && User->isConditional() && (User->getCondition() == V)) + return SCI; + } + return 0; } /// visitBranchInst - Handles conditional and unconditional branches. diff --git a/lib/Target/SparcV8/SparcV8ISelSimple.cpp b/lib/Target/SparcV8/SparcV8ISelSimple.cpp index 68bc28a0f32..c93ced515ed 100644 --- a/lib/Target/SparcV8/SparcV8ISelSimple.cpp +++ b/lib/Target/SparcV8/SparcV8ISelSimple.cpp @@ -1016,6 +1016,16 @@ static inline BasicBlock *getBlockAfter(BasicBlock *BB) { /// static SetCondInst *canFoldSetCCIntoBranch(Value *V) { return 0; // disable. + if (SetCondInst *SCI = dyn_cast(V)) + if (SCI->hasOneUse()) { + BranchInst *User = dyn_cast(SCI->use_back()); + if (User + && (SCI->getNext() == User) + && (getClassB(SCI->getOperand(0)->getType()) != cLong) + && User->isConditional() && (User->getCondition() == V)) + return SCI; + } + return 0; } /// visitBranchInst - Handles conditional and unconditional branches.