[PATCH][PR16882] Ignore noreturn definitions when setting isPhysRegUsed.

Quentin Colombet qcolombet at apple.com
Tue Sep 24 13:08:31 PDT 2013


Hi Eric & Jim,

Thanks you both for the reviews.
Comments inlined.

On Sep 24, 2013, at 11:58 AM, Jim Grosbach <grosbach at apple.com> wrote:

> Seems OK. I wonder if it’s worth it calculating the set of no-return instructions ahead of time. Looking for the common case of there not being any at all seems a reasonable optimization, but in the case where we have one or more, just checking directly from the iterator rather than a lookup in a SmallPtrSet<> will probably be just as fast and be a bit simpler code?
I am not sure what you are proposing here.

Do you want to get rid of SmallPtrSet<> instance?

I.e., replace this:
+        if (!NoReturnInsts.count(&(*It))) {
+          MRI->setPhysRegUsed(Reg);
+          break;
+        }

By a check that It is a no-return instruction?

If yes, I do not think this is reasonable, because unless I am missing something, checking that the a MI has the NoReturn attribute is expensive:
1. Get to operand with the symbol.
2. Check that the symbol carries the NoReturn attribute.

For 1.,  you have to iterate through all the MI operands, unless again I am missing something.
In the end, this check looks like:
+      // Check if this instruction is a call to a noreturn function.
+      // In that case, all the definitions set by this instruction can
+      // be ignored.
+      if (IsExitBB && MI->isCall())
+        for (MachineInstr::mop_iterator MOI = MI->operands_begin(),
+               MOE = MI->operands_end(); MOI != MOE; ++MOI) {
+          MachineOperand &MO = *MOI;
+          if (!MO.isGlobal())
+            continue;
+          const Function *Func = dyn_cast<Function>(MO.getGlobal());
+          if (!Func || !Func->hasFnAttribute(Attribute::NoReturn))
+            continue;
+          NoReturnInsts.insert(MI);
+          break;
+        }

So, we may not want to do that for each registers (i.e., one call is checked several times).

Jim, what do you think?

Again, I may have missed a more direct way to access the noreturn attribute, and I would be glad to fix the patch accordingly!

Thanks,
Quentin

> 
> -Jim
> 
> On Sep 24, 2013, at 11:51 AM, Eric Christopher <echristo at gmail.com> wrote:
> 
>> Seems sane to me, Jim was one of the last people in here so he could
>> probably review as well.
>> 
>> -eric
>> 
>> On Tue, Sep 24, 2013 at 10:48 AM, Quentin Colombet <qcolombet at apple.com> wrote:
>>> Ping^3?
>>> 
>>> -Quentin
>>> 
>>> On Sep 17, 2013, at 10:54 AM, Quentin Colombet <qcolombet at apple.com> wrote:
>>> 
>>> Ping^2?
>>> 
>>> -Quentin
>>> 
>>> On Sep 10, 2013, at 10:54 AM, Quentin Colombet <qcolombet at apple.com> wrote:
>>> 
>>> Ping?
>>> 
>>> -Quentin
>>> 
>>> On Sep 3, 2013, at 2:16 PM, Quentin Colombet <qcolombet at apple.com> wrote:
>>> 
>>> Hi,
>>> 
>>> The proposed patch fixes PR16882:
>>> http://llvm.org/bugs/show_bug.cgi?id=16882.
>>> PR16882 reports a poor code generation issue where we were saving the link
>>> register before a call to a noreturn function, whereas it is not needed.
>>> 
>>> Thanks for your reviews.
>>> 
>>> ** Details **
>>> 
>>> PEI inserts a save/restore sequence for the link register, according to the
>>> information it gets from the MachineRegisterInfo.
>>> MachineRegisterInfo is populated by the VirtRegMap pass.
>>> This pass was not aware of noreturn calls and was registering the
>>> definitions of these calls the same way as regular operations.
>>> 
>>> 
>>> ** Proposed Solution **
>>> 
>>> Modify VirtRegPass so that it does not set the isPhysRegUsed information for
>>> registers only defined by noreturn calls.
>>> The rational is that a noreturn call is the "last instruction" of the
>>> program (if it returns the behavior is undefined), so everything that is
>>> defined by it cannot be used and will not interfere with anything else.
>>> Therefore, it is pointless to account for then.
>>> 
>>> 
>>> ** Experiments **
>>> 
>>> I have made functional tests on x86_64 with O3 -fomit-frame-pointer on the
>>> llvm test-suite + SPEC.
>>> I did the same for ARMv7s.
>>> 
>>> I have attached the performance numbers for ARMv7s (lower is better). These
>>> numbers only reports benches where the patch kicks in and the test runs for
>>> more than 1s (to avoid noise).
>>> The Reference column is LLVM r189613 and Test column is LLVM r189613 + the
>>> proposed patch.
>>> 
>>> Cheers,
>>> -Quentin
>>> <virtreg.svndiff>
>>> <noreturn_perf.txt>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130924/b9302fe1/attachment.html>


More information about the llvm-commits mailing list