[PATCH] D31539: Hoisting invariant.group in LICM

Sanjoy Das via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 31 18:59:36 PDT 2017


sanjoy requested changes to this revision.
sanjoy added a comment.
This revision now requires changes to proceed.

Comments inline.



================
Comment at: lib/Transforms/Scalar/LICM.cpp:495
+  // TODO can I do this without casting to Instruction?
+  if (auto *PointerOperandInst = dyn_cast<Instruction>(LI->getPointerOperand()))
+    return DT->properlyDominates(PointerOperandInst->getParent(),
----------------
You can use `Loop::isLoopInvariant` here.


================
Comment at: lib/Transforms/Scalar/LICM.cpp:571
 
+    if (isLoadInvariantGroupInLoop(LI, DT, CurLoop))
+      return true;
----------------
I'm not sure that that the langref lets you do this.  What it allows for is

```
%a = *ptr, !invariant.group
%b = *ptr, !invariant.group
```

to

```
%a = *ptr, !invariant.group
%b = %a
```

which is slightly different from what you're doing here.

So I'd recommend changing the langref wording to be more like what we have for `!invariant.load`.


================
Comment at: lib/Transforms/Scalar/LICM.cpp:877
       // drop.  It is a compile time optimization, not required for correctness.
       !isGuaranteedToExecute(I, DT, CurLoop, SafetyInfo))
+    I.dropUnknownNonDebugMetadata({LLVMContext::MD_invariant_group,
----------------
This bit does not look correct.  Why can't these attributes be control dependent?


================
Comment at: test/Transforms/LICM/hoist-invariant-group-load.ll:39
+; CHECK-LABEL: define void @hoist2(
+define void @hoist2(i8** dereferenceable(8)) {
+entry:
----------------
Please use `-instnamer` to name all the instructions.  Otherwise editing the tests will be painful.


https://reviews.llvm.org/D31539





More information about the llvm-commits mailing list