if (isa<PHINode>(I) || I->isEHPad() || isa<AllocaInst>(I) ||
I->getType()->isTokenTy())
return false;
- // Apart from loads and stores, we won't move anything that could
- // change memory or have sideeffects.
- if (!isa<StoreInst>(I) && !isa<LoadInst>(I) &&
- (I->mayHaveSideEffects() || I->mayHaveSideEffects()))
- return false;
// Everything must have only one use too, apart from stores which
// have no uses.
if (!isa<StoreInst>(I) && !I->hasOneUse())
if (!canReplaceOperandWithVariable(I0, OI))
// We can't create a PHI from this GEP.
return false;
- if ((isa<CallInst>(I0) || isa<InvokeInst>(I0)) && OI != 0)
- // Don't create indirect calls!
+ // Don't create indirect calls! The called value is the final operand.
+ if ((isa<CallInst>(I0) || isa<InvokeInst>(I0)) && OI == OE - 1) {
// FIXME: if the call was *already* indirect, we should do this.
return false;
+ }
++NumPHIsRequired;
}
}
; CHECK-NOT: load
; CHECK-NOT: store
+; The call should be commoned.
+define i32 @test13a(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {
+entry:
+ br i1 %flag, label %if.then, label %if.else
+
+if.then:
+ %sv1 = call i32 @bar(i32 %x)
+ br label %if.end
+
+if.else:
+ %sv2 = call i32 @bar(i32 %y)
+ br label %if.end
+
+if.end:
+ %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
+ ret i32 1
+}
+declare i32 @bar(i32)
+
+; CHECK-LABEL: test13a
+; CHECK: %[[x:.*]] = select i1 %flag
+; CHECK: call i32 @bar(i32 %[[x]])
+
; CHECK: !0 = !{!1, !1, i64 0}
; CHECK: !1 = !{!"float", !2}
-; CHECK: !2 = !{!"an example type tree"}
\ No newline at end of file
+; CHECK: !2 = !{!"an example type tree"}