mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Revert "[IR] Ignore bitcasts of function pointers which are only used as callees in callbase instruction"
This reverts commit 167ea67d This causes a bunch of build failures: * http://lab.llvm.org:8011/#/builders/121/builds/6287 * http://green.lab.llvm.org/green/job/clang-stage1-RA/19915
This commit is contained in:
parent
5b9f135c28
commit
298bb15218
@ -1637,14 +1637,6 @@ bool Function::hasAddressTaken(const User **PutOffender,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isa<BitCastOperator>(FU) && isa<ConstantExpr>(FU) &&
|
||||
llvm::all_of(FU->uses(), [](const Use &U) {
|
||||
if (const CallBase *CB = dyn_cast<CallBase>(U.getUser()))
|
||||
return CB->isCallee(&U);
|
||||
return false;
|
||||
}))
|
||||
continue;
|
||||
|
||||
const auto *Call = dyn_cast<CallBase>(FU);
|
||||
if (!Call) {
|
||||
if (IgnoreAssumeLikeCalls) {
|
||||
|
@ -2131,26 +2131,13 @@ processGlobal(GlobalValue &GV,
|
||||
return processInternalGlobal(GVar, GS, GetTLI, LookupDomTree) || Changed;
|
||||
}
|
||||
|
||||
static void SetCallBaseFastCallingConv(Use &U) {
|
||||
CallBase *CB = dyn_cast<CallBase>(U.getUser());
|
||||
if (!CB || !CB->isCallee(&U))
|
||||
return;
|
||||
CB->setCallingConv(CallingConv::Fast);
|
||||
}
|
||||
|
||||
/// Walk all of the direct calls of the specified function, changing them to
|
||||
/// FastCC.
|
||||
static void ChangeCalleesToFastCall(Function *F) {
|
||||
for (Use &U : F->uses()) {
|
||||
User *FU = U.getUser();
|
||||
if (isa<BlockAddress>(FU))
|
||||
for (User *U : F->users()) {
|
||||
if (isa<BlockAddress>(U))
|
||||
continue;
|
||||
if (isa<BitCastOperator>(FU) && isa<ConstantExpr>(FU)) {
|
||||
for (Use &BU : FU->uses())
|
||||
SetCallBaseFastCallingConv(BU);
|
||||
continue;
|
||||
}
|
||||
SetCallBaseFastCallingConv(U);
|
||||
cast<CallBase>(U)->setCallingConv(CallingConv::Fast);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2162,25 +2149,13 @@ static AttributeList StripAttr(LLVMContext &C, AttributeList Attrs,
|
||||
return Attrs;
|
||||
}
|
||||
|
||||
static void SetCallBaseAttributes(Use &U, Function *F, Attribute::AttrKind A) {
|
||||
CallBase *CB = dyn_cast<CallBase>(U.getUser());
|
||||
if (!CB || !CB->isCallee(&U))
|
||||
return;
|
||||
CB->setAttributes(StripAttr(F->getContext(), CB->getAttributes(), A));
|
||||
}
|
||||
|
||||
static void RemoveAttribute(Function *F, Attribute::AttrKind A) {
|
||||
F->setAttributes(StripAttr(F->getContext(), F->getAttributes(), A));
|
||||
for (Use &U : F->uses()) {
|
||||
User *FU = U.getUser();
|
||||
if (isa<BlockAddress>(FU))
|
||||
for (User *U : F->users()) {
|
||||
if (isa<BlockAddress>(U))
|
||||
continue;
|
||||
if (isa<BitCastOperator>(FU) && isa<ConstantExpr>(FU)) {
|
||||
for (Use &BU : FU->uses())
|
||||
SetCallBaseAttributes(BU, F, A);
|
||||
continue;
|
||||
}
|
||||
SetCallBaseAttributes(U, F, A);
|
||||
CallBase *CB = cast<CallBase>(U);
|
||||
CB->setAttributes(StripAttr(F->getContext(), CB->getAttributes(), A));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,30 +0,0 @@
|
||||
; RUN: opt < %s -print-callgraph -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: Call graph node <<null function>><<{{.*}}>> #uses=0
|
||||
; CHECK-NEXT: CS<None> calls function 'foo'
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'bar'<<{{.*}}>> #uses=1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'foo'<<{{.*}}>> #uses=1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'test'<<{{.*}}>> #uses=0
|
||||
; CHECK-NEXT: CS<{{.*}}> calls function 'bar'
|
||||
; CHECK-NEXT: CS<{{.*}}> calls external node
|
||||
|
||||
define internal i32 @foo() {
|
||||
entry:
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
define internal i32 @bar(float()* %arg) {
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
define internal i32 @test() {
|
||||
%v1 = call i32 @bar(float()* bitcast (i32()* @foo to float()*))
|
||||
%v2 = call float bitcast (i32()* @foo to float()*)()
|
||||
%v3 = fptoui float %v2 to i32
|
||||
%v4 = add i32 %v1, %v3
|
||||
ret i32 %v4
|
||||
}
|
||||
|
@ -1,27 +0,0 @@
|
||||
; RUN: opt < %s -print-callgraph -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: Call graph node <<null function>><<{{.*}}>> #uses=0
|
||||
; CHECK-NEXT: CS<None> calls function 'foo'
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'bar'<<{{.*}}>> #uses=1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'foo'<<{{.*}}>> #uses=1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'test'<<{{.*}}>> #uses=0
|
||||
; CHECK-NEXT: CS<{{.*}}> calls function 'bar'
|
||||
|
||||
define internal i32 @foo() {
|
||||
entry:
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
define internal i32 @bar(float()* %arg) {
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
define internal i32 @test() {
|
||||
%v1 = call i32 @bar(float()* bitcast (i32()* @foo to float()*))
|
||||
%v2 = add i32 %v1, 6
|
||||
ret i32 %v2
|
||||
}
|
||||
|
@ -1,23 +0,0 @@
|
||||
; RUN: opt < %s -print-callgraph -disable-output 2>&1 | FileCheck %s
|
||||
; CHECK: Call graph node <<null function>><<{{.*}}>> #uses=0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'foo'<<{{.*}}>> #uses=0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'test_bitcast_callees'<<{{.*}}>> #uses=0
|
||||
; CHECK-NEXT: CS<{{.*}}> calls external node
|
||||
; CHECK-NEXT: CS<{{.*}}> calls external node
|
||||
|
||||
define internal i32 @foo() {
|
||||
entry:
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
define internal float @test_bitcast_callees() {
|
||||
%v1 = call float bitcast (i32()* @foo to float()*)()
|
||||
%v2 = fadd float %v1, 1.0
|
||||
%v3 = call i8 bitcast (i32()* @foo to i8()*)()
|
||||
%v4 = uitofp i8 %v3 to float
|
||||
%v5 = fadd float %v2, %v4
|
||||
ret float %v5
|
||||
}
|
||||
|
@ -1,26 +0,0 @@
|
||||
; RUN: opt < %s -print-callgraph -disable-output 2>&1 | FileCheck %s
|
||||
; CHECK: Call graph node <<null function>><<{{.*}}>> #uses=0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'foo'<<{{.*}}>> #uses=0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: Call graph node for function: 'test_bitcast_callees2'<<{{.*}}>> #uses=0
|
||||
; CHECK-NEXT: CS<{{.*}}> calls external node
|
||||
; CHECK-NEXT: CS<{{.*}}> calls external node
|
||||
; CHECK-NEXT: CS<{{.*}}> calls external node
|
||||
|
||||
define internal i32 @foo() {
|
||||
entry:
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
define internal float @test_bitcast_callees2() {
|
||||
%v1 = call float bitcast (i32()* @foo to float()*)()
|
||||
%v2 = fadd float %v1, 1.0
|
||||
%v3 = call float bitcast (i32()* @foo to float()*)()
|
||||
%v4 = fadd float %v3, %v2
|
||||
%v5 = call i8 bitcast (i32()* @foo to i8()*)()
|
||||
%v6 = uitofp i8 %v5 to float
|
||||
%v7 = fadd float %v4, %v6
|
||||
ret float %v7
|
||||
}
|
||||
|
@ -36,15 +36,10 @@
|
||||
; FIXME we should recognize this as UB and make it an unreachable.
|
||||
|
||||
define dso_local i16 @foo(i16 %a) {
|
||||
; IS__TUNIT____-LABEL: define {{[^@]+}}@foo
|
||||
; IS__TUNIT____-SAME: (i16 [[A:%.*]]) {
|
||||
; IS__TUNIT____-NEXT: [[CALL:%.*]] = call i16 @bar()
|
||||
; IS__TUNIT____-NEXT: ret i16 [[CALL]]
|
||||
;
|
||||
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@foo
|
||||
; IS__CGSCC_OPM-SAME: (i16 [[A:%.*]]) {
|
||||
; IS__CGSCC_OPM-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar to i16 (i16)*)(i16 [[A]])
|
||||
; IS__CGSCC_OPM-NEXT: ret i16 [[CALL]]
|
||||
; NOT_CGSCC_NPM-LABEL: define {{[^@]+}}@foo
|
||||
; NOT_CGSCC_NPM-SAME: (i16 [[A:%.*]]) {
|
||||
; NOT_CGSCC_NPM-NEXT: [[CALL:%.*]] = call i16 @bar()
|
||||
; NOT_CGSCC_NPM-NEXT: ret i16 [[CALL]]
|
||||
;
|
||||
; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@foo
|
||||
@ -61,8 +56,9 @@ define internal i16 @bar(i16 %p1, i16 %p2) {
|
||||
; IS__TUNIT____-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
; IS__TUNIT____-NEXT: ret i16 0
|
||||
;
|
||||
; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@bar
|
||||
; IS__CGSCC_OPM-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) {
|
||||
; IS__CGSCC_OPM-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
; IS__CGSCC_OPM-NEXT: ret i16 0
|
||||
;
|
||||
; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
@ -90,16 +86,11 @@ define internal i16 @bar2(i16 %p1, i16 %p2) {
|
||||
; IS__TUNIT____-NEXT: [[A:%.*]] = add i16 [[P1]], [[P2]]
|
||||
; IS__TUNIT____-NEXT: ret i16 [[A]]
|
||||
;
|
||||
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@bar2
|
||||
; IS__CGSCC_OPM-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) {
|
||||
; IS__CGSCC_OPM-NEXT: [[A:%.*]] = add i16 [[P1]], [[P2]]
|
||||
; IS__CGSCC_OPM-NEXT: ret i16 [[A]]
|
||||
;
|
||||
; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@bar2
|
||||
; IS__CGSCC_NPM-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR0]] {
|
||||
; IS__CGSCC_NPM-NEXT: [[A:%.*]] = add i16 [[P1]], [[P2]]
|
||||
; IS__CGSCC_NPM-NEXT: ret i16 [[A]]
|
||||
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
; IS__CGSCC____-LABEL: define {{[^@]+}}@bar2
|
||||
; IS__CGSCC____-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
; IS__CGSCC____-NEXT: [[A:%.*]] = add i16 [[P1]], [[P2]]
|
||||
; IS__CGSCC____-NEXT: ret i16 [[A]]
|
||||
;
|
||||
%a = add i16 %p1, %p2
|
||||
ret i16 %a
|
||||
@ -112,17 +103,11 @@ define internal i16 @bar2(i16 %p1, i16 %p2) {
|
||||
; been provided),
|
||||
|
||||
define dso_local i16 @vararg_tests(i16 %a) {
|
||||
; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@vararg_tests
|
||||
; NOT_CGSCC_OPM-SAME: (i16 [[A:%.*]]) {
|
||||
; NOT_CGSCC_OPM-NEXT: [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 noundef 7)
|
||||
; NOT_CGSCC_OPM-NEXT: [[ADD:%.*]] = add i16 7, [[CALL2]]
|
||||
; NOT_CGSCC_OPM-NEXT: ret i16 [[ADD]]
|
||||
;
|
||||
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@vararg_tests
|
||||
; IS__CGSCC_OPM-SAME: (i16 [[A:%.*]]) {
|
||||
; IS__CGSCC_OPM-NEXT: [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 7)
|
||||
; IS__CGSCC_OPM-NEXT: [[ADD:%.*]] = add i16 7, [[CALL2]]
|
||||
; IS__CGSCC_OPM-NEXT: ret i16 [[ADD]]
|
||||
; CHECK-LABEL: define {{[^@]+}}@vararg_tests
|
||||
; CHECK-SAME: (i16 [[A:%.*]]) {
|
||||
; CHECK-NEXT: [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 noundef 7)
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add i16 7, [[CALL2]]
|
||||
; CHECK-NEXT: ret i16 [[ADD]]
|
||||
;
|
||||
%call1 = call i16 (i16, ...) @vararg_prop(i16 7, i16 8, i16 %a)
|
||||
%call2 = call i16 bitcast (i16 (i16, i16, ...) * @vararg_no_prop to i16 (i16) *) (i16 7)
|
||||
@ -133,7 +118,7 @@ define dso_local i16 @vararg_tests(i16 %a) {
|
||||
define internal i16 @vararg_prop(i16 %p1, ...) {
|
||||
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
; IS__CGSCC____-LABEL: define {{[^@]+}}@vararg_prop
|
||||
; IS__CGSCC____-SAME: (i16 returned [[P1:%.*]], ...) #[[ATTR0:[0-9]+]] {
|
||||
; IS__CGSCC____-SAME: (i16 returned [[P1:%.*]], ...) #[[ATTR0]] {
|
||||
; IS__CGSCC____-NEXT: ret i16 7
|
||||
;
|
||||
ret i16 %p1
|
||||
@ -145,14 +130,10 @@ define internal i16 @vararg_no_prop(i16 %p1, i16 %p2, ...) {
|
||||
; IS__TUNIT____-SAME: (i16 returned [[P1:%.*]], i16 [[P2:%.*]], ...) #[[ATTR0]] {
|
||||
; IS__TUNIT____-NEXT: ret i16 7
|
||||
;
|
||||
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@vararg_no_prop
|
||||
; IS__CGSCC_OPM-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]], ...) {
|
||||
; IS__CGSCC_OPM-NEXT: ret i16 [[P1]]
|
||||
;
|
||||
; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@vararg_no_prop
|
||||
; IS__CGSCC_NPM-SAME: (i16 returned [[P1:%.*]], i16 [[P2:%.*]], ...) #[[ATTR0]] {
|
||||
; IS__CGSCC_NPM-NEXT: ret i16 7
|
||||
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
; IS__CGSCC____-LABEL: define {{[^@]+}}@vararg_no_prop
|
||||
; IS__CGSCC____-SAME: (i16 returned [[P1:%.*]], i16 [[P2:%.*]], ...) #[[ATTR0]] {
|
||||
; IS__CGSCC____-NEXT: ret i16 7
|
||||
;
|
||||
ret i16 %p1
|
||||
}
|
||||
|
@ -23,14 +23,10 @@ define internal i16 @bar(i16 %p1, i16 %p2) {
|
||||
; IS__TUNIT____-SAME: (i16 [[P1:%.*]], i16 returned [[P2:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
; IS__TUNIT____-NEXT: ret i16 [[P2]]
|
||||
;
|
||||
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@bar
|
||||
; IS__CGSCC_OPM-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) {
|
||||
; IS__CGSCC_OPM-NEXT: ret i16 [[P2]]
|
||||
;
|
||||
; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@bar
|
||||
; IS__CGSCC_NPM-SAME: (i16 [[P1:%.*]], i16 returned [[P2:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
; IS__CGSCC_NPM-NEXT: ret i16 [[P2]]
|
||||
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
||||
; IS__CGSCC____-LABEL: define {{[^@]+}}@bar
|
||||
; IS__CGSCC____-SAME: (i16 [[P1:%.*]], i16 returned [[P2:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
; IS__CGSCC____-NEXT: ret i16 [[P2]]
|
||||
;
|
||||
ret i16 %p2
|
||||
}
|
||||
@ -39,5 +35,5 @@ define internal i16 @bar(i16 %p1, i16 %p2) {
|
||||
;.
|
||||
; IS__TUNIT____: attributes #[[ATTR0]] = { nofree nosync nounwind readnone willreturn }
|
||||
;.
|
||||
; IS__CGSCC_NPM: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind readnone willreturn }
|
||||
; IS__CGSCC____: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind readnone willreturn }
|
||||
;.
|
||||
|
@ -1,27 +0,0 @@
|
||||
; RUN: opt < %s -globalopt -S | FileCheck %s
|
||||
|
||||
; Check that fastccc is not set on
|
||||
; function "bar" because its address is taken
|
||||
; when no optional parameters are passed to
|
||||
; hasAddressTaken() as it returns "true"
|
||||
; If the optional parameter corresponding to
|
||||
; ignore llvmassumelike is passed to
|
||||
; hasAddressTaken() then this test would fail.
|
||||
|
||||
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
|
||||
|
||||
; CHECK-NOT: define internal fastcc void @bar() {
|
||||
; CHECK: define internal void @bar() {
|
||||
define internal void @bar() {
|
||||
entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: define void @foo() local_unnamed_addr {
|
||||
define void @foo() {
|
||||
entry:
|
||||
%c = bitcast void()* @bar to i8*
|
||||
call void @llvm.lifetime.start.p0i8(i64 4, i8* %c)
|
||||
ret void
|
||||
}
|
||||
|
@ -1,29 +0,0 @@
|
||||
; RUN: opt < %s -globalopt -S | FileCheck %s
|
||||
|
||||
; Check that globalopt doesn't set fastcc on
|
||||
; functions and their call sites if its hasAddressTaken()
|
||||
; is true. "foo" function's hasAddressTaken() is
|
||||
; true so globalopt should not set fastcc on it
|
||||
; and its call sites. However, for "bar" fastcc must be set.
|
||||
|
||||
; CHECK-NOT: define internal fastcc i32 @foo() {
|
||||
; CHECK: define internal i32 @foo() {
|
||||
define internal i32 @foo() {
|
||||
entry:
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
; CHECK: define internal fastcc i32 @bar(float ()* %arg) unnamed_addr {
|
||||
define internal i32 @bar(float()* %arg) {
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
; CHECK-NOT: define fastcc i32 @test()
|
||||
; CHECK: define i32 @test()
|
||||
define i32 @test() {
|
||||
; CHECK: call fastcc i32 @bar(float ()* bitcast (i32 ()* @foo to float ()*))
|
||||
%v1 = call i32 @bar(float ()* bitcast (i32 ()* @foo to float ()*))
|
||||
%v2 = add i32 %v1, 6
|
||||
ret i32 %v2
|
||||
}
|
||||
|
@ -1,18 +0,0 @@
|
||||
; RUN: opt < %s -globalopt -S | FileCheck %s
|
||||
|
||||
; CHECK-LABEL: define internal fastcc i32 @foo() unnamed_addr
|
||||
define internal i32 @foo() {
|
||||
ret i32 8
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define void @test_bitcast_callees2() local_unnamed_addr {
|
||||
define void @test_bitcast_callees2() {
|
||||
; CHECK: %1 = call fastcc float bitcast (i32 ()* @foo to float ()*)()
|
||||
call float bitcast (i32()* @foo to float()*)()
|
||||
; CHECK-NEXT: %2 = call fastcc float bitcast (i32 ()* @foo to float ()*)()
|
||||
call float bitcast (i32()* @foo to float()*)()
|
||||
; CHECK-NEXT: %3 = call fastcc i8 bitcast (i32 ()* @foo to i8 ()*)()
|
||||
call i8 bitcast (i32()* @foo to i8()*)()
|
||||
ret void
|
||||
}
|
||||
|
@ -1,24 +0,0 @@
|
||||
; RUN: opt < %s -globalopt -S | FileCheck %s
|
||||
|
||||
; Check if fastcc is set on function "g"
|
||||
; as its address is not taken and other
|
||||
; conditions are met to tag "g" as fastcc.
|
||||
|
||||
@x = internal global i8* zeroinitializer
|
||||
|
||||
; CHECK: define internal fastcc void @g() unnamed_addr {
|
||||
define internal void @g() {
|
||||
entry:
|
||||
br label %here
|
||||
|
||||
here:
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @f() {
|
||||
store i8* blockaddress(@g, %here), i8** @x, align 8
|
||||
; CHECK: call fastcc i32 bitcast (void ()* @g to i32 ()*)()
|
||||
call i32 bitcast (void ()* @g to i32 ()*)()
|
||||
ret void
|
||||
}
|
||||
|
@ -2,13 +2,14 @@
|
||||
|
||||
; CHECK: Call graph node <<null function>><<{{.*}}>> #uses=0
|
||||
; CHECK: CS<None> calls function 'dead_fork_call'
|
||||
; CHECK: CS<None> calls function '.omp_outlined..0'
|
||||
; CHECK: CS<None> calls function '__kmpc_fork_call'
|
||||
; CHECK: CS<None> calls function 'live_fork_call'
|
||||
; CHECK: CS<None> calls function '.omp_outlined..1'
|
||||
; CHECK: CS<None> calls function 'd'
|
||||
;
|
||||
; CHECK: Call graph node for function: '.omp_outlined..0'<<{{.*}}>> #uses=0
|
||||
;
|
||||
; CHECK: Call graph node for function: '.omp_outlined..0'<<{{.*}}>> #uses=1
|
||||
;
|
||||
; CHECK: Call graph node for function: '.omp_outlined..1'<<{{.*}}>> #uses=3
|
||||
; CHECK: CS<{{.*}}> calls function 'd'
|
||||
;
|
||||
|
@ -1,4 +1,4 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipsccp -S -o - | FileCheck %s
|
||||
|
||||
; The original C source looked like this:
|
||||
@ -31,9 +31,8 @@
|
||||
; argument count between the caller and callee.
|
||||
|
||||
define dso_local void @foo(i16 %a) {
|
||||
; CHECK-LABEL: define {{[^@]+}}@foo
|
||||
; CHECK-SAME: (i16 [[A:%.*]]) {
|
||||
; CHECK-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar to i16 (i16)*)(i16 [[A]])
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar to i16 (i16)*)(i16 [[A:%.*]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%call = call i16 bitcast (i16 (i16, i16) * @bar to i16 (i16) *)(i16 %a)
|
||||
@ -41,9 +40,8 @@ define dso_local void @foo(i16 %a) {
|
||||
}
|
||||
|
||||
define internal i16 @bar(i16 %p1, i16 %p2) {
|
||||
; CHECK-LABEL: define {{[^@]+}}@bar
|
||||
; CHECK-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) {
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK-LABEL: @bar(
|
||||
; CHECK-NEXT: ret i16 0
|
||||
;
|
||||
ret i16 0
|
||||
}
|
||||
@ -54,17 +52,15 @@ define internal i16 @bar(i16 %p1, i16 %p2) {
|
||||
; been provided),
|
||||
|
||||
define internal i16 @vararg_prop(i16 %p1, ...) {
|
||||
; CHECK-LABEL: define {{[^@]+}}@vararg_prop
|
||||
; CHECK-SAME: (i16 [[P1:%.*]], ...) {
|
||||
; CHECK-LABEL: @vararg_prop(
|
||||
; CHECK-NEXT: ret i16 undef
|
||||
;
|
||||
ret i16 %p1
|
||||
}
|
||||
|
||||
define dso_local i16 @vararg_tests(i16 %a) {
|
||||
; CHECK-LABEL: define {{[^@]+}}@vararg_tests
|
||||
; CHECK-SAME: (i16 [[A:%.*]]) {
|
||||
; CHECK-NEXT: [[CALL1:%.*]] = call i16 (i16, ...) @vararg_prop(i16 7, i16 8, i16 [[A]])
|
||||
; CHECK-LABEL: @vararg_tests(
|
||||
; CHECK-NEXT: [[CALL1:%.*]] = call i16 (i16, ...) @vararg_prop(i16 7, i16 8, i16 [[A:%.*]])
|
||||
; CHECK-NEXT: [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 7)
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add i16 7, [[CALL2]]
|
||||
; CHECK-NEXT: ret i16 [[ADD]]
|
||||
@ -76,9 +72,8 @@ define dso_local i16 @vararg_tests(i16 %a) {
|
||||
}
|
||||
|
||||
define internal i16 @vararg_no_prop(i16 %p1, i16 %p2, ...) {
|
||||
; CHECK-LABEL: define {{[^@]+}}@vararg_no_prop
|
||||
; CHECK-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]], ...) {
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK-LABEL: @vararg_no_prop(
|
||||
; CHECK-NEXT: ret i16 [[P1:%.*]]
|
||||
;
|
||||
ret i16 %p1
|
||||
}
|
||||
|
@ -1,13 +1,12 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipsccp -S -o - | FileCheck %s
|
||||
|
||||
; This test is just to verify that we do not crash/assert due to mismatch in
|
||||
; argument type between the caller and callee.
|
||||
|
||||
define dso_local void @foo(i16 %a) {
|
||||
; CHECK-LABEL: define {{[^@]+}}@foo
|
||||
; CHECK-SAME: (i16 [[A:%.*]]) {
|
||||
; CHECK-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar to i16 (i16, i32)*)(i16 [[A]], i32 7)
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar to i16 (i16, i32)*)(i16 [[A:%.*]], i32 7)
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%call = call i16 bitcast (i16 (i16, i16) * @bar to i16 (i16, i32) *)(i16 %a, i32 7)
|
||||
@ -15,9 +14,8 @@ define dso_local void @foo(i16 %a) {
|
||||
}
|
||||
|
||||
define internal i16 @bar(i16 %p1, i16 %p2) {
|
||||
; CHECK-LABEL: define {{[^@]+}}@bar
|
||||
; CHECK-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) {
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK-LABEL: @bar(
|
||||
; CHECK-NEXT: ret i16 [[P2:%.*]]
|
||||
;
|
||||
ret i16 %p2
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user