[PATCH] D46026: [ICP] Do not attempt type matching for variable length arguments.
Taewook Oh via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 25 00:40:00 PDT 2018
twoh updated this revision to Diff 143868.
twoh added a comment.
Addressing comment from @mssimpso. Thanks!
Repository:
rL LLVM
https://reviews.llvm.org/D46026
Files:
lib/Transforms/Utils/CallPromotionUtils.cpp
test/Transforms/PGOProfile/indirect_call_promotion_vla.ll
Index: test/Transforms/PGOProfile/indirect_call_promotion_vla.ll
===================================================================
--- /dev/null
+++ test/Transforms/PGOProfile/indirect_call_promotion_vla.ll
@@ -0,0 +1,28 @@
+; RUN: opt < %s -pgo-icall-prom -S | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+%struct.A = type { i8 }
+%struct.B = type { i8 }
+ at foo = common global i32 (%struct.A*, ...)* null, align 8
+
+define i32 @func1(%struct.B* %x, ...) {
+entry:
+ ret i32 0
+}
+
+define i32 @bar(%struct.A* %x) {
+entry:
+ %tmp = load i32 (%struct.A*, ...)*, i32 (%struct.A*, ...)** @foo, align 8
+; CHECK: [[CMP:%[0-9]+]] = icmp eq i32 (%struct.A*, ...)* %tmp, bitcast (i32 (%struct.B*, ...)* @func1 to i32 (%struct.A*, ...)*)
+; CHECK: br i1 [[CMP]], label %if.true.direct_targ, label %if.false.orig_indirect, !prof [[BRANCH_WEIGHT:![0-9]+]]
+; CHECK: if.true.direct_targ:
+; CHECK: [[DIRCALL_RET:%[0-9]+]] = call i32 (%struct.B*, ...) @func1
+; CHECK: br label %if.end.icp
+ %call = call i32 (%struct.A*, ...) %tmp(%struct.A* %x, i32 0), !prof !1
+ ret i32 %call
+}
+
+; CHECK: [[BRANCH_WEIGHT]] = !{!"branch_weights", i32 1500, i32 100}
+!1 = !{!"VP", i32 0, i64 1600, i64 -2545542355363006406, i64 1500}
Index: lib/Transforms/Utils/CallPromotionUtils.cpp
===================================================================
--- lib/Transforms/Utils/CallPromotionUtils.cpp
+++ lib/Transforms/Utils/CallPromotionUtils.cpp
@@ -389,12 +389,14 @@
// Inspect the arguments of the call site. If an argument's type doesn't
// match the corresponding formal argument's type in the callee, bitcast it
// to the correct type.
- for (Use &U : CS.args()) {
- unsigned ArgNo = CS.getArgumentNo(&U);
- Type *FormalTy = Callee->getFunctionType()->getParamType(ArgNo);
- Type *ActualTy = U.get()->getType();
+ auto CalleeType = Callee->getFunctionType();
+ auto CalleeParamNum = CalleeType->getNumParams();
+ for (unsigned ArgNo = 0; ArgNo < CalleeParamNum; ++ArgNo) {
+ auto *Arg = CS.getArgument(ArgNo);
+ Type *FormalTy = CalleeType->getParamType(ArgNo);
+ Type *ActualTy = Arg->getType();
if (FormalTy != ActualTy) {
- auto *Cast = CastInst::Create(Instruction::BitCast, U.get(), FormalTy, "",
+ auto *Cast = CastInst::Create(Instruction::BitCast, Arg, FormalTy, "",
CS.getInstruction());
CS.setArgument(ArgNo, Cast);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46026.143868.patch
Type: text/x-patch
Size: 2503 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180425/bd2570c3/attachment.bin>
More information about the llvm-commits
mailing list