[Attributor] Bitcast constant to the returned value type if it has different type

Reviewers: jdoerfert, sstefan1, uenoku

Reviewed By: jdoerfert

Subscribers: hiraditya, uenoku, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D79277
This commit is contained in:
Sergey Dmitriev 2020-05-03 11:28:53 -07:00
parent 46ee652c70
commit 0f70f73308
2 changed files with 22 additions and 4 deletions

View File

@ -4532,9 +4532,13 @@ struct AAValueSimplifyReturned : AAValueSimplifyImpl {
for (ReturnInst *RI : RetInsts) {
if (RI->getFunction() != getAnchorScope())
continue;
LLVM_DEBUG(dbgs() << "[ValueSimplify] " << V << " -> " << *C
auto *RC = C;
if (RC->getType() != RI->getReturnValue()->getType())
RC = ConstantExpr::getBitCast(RC,
RI->getReturnValue()->getType());
LLVM_DEBUG(dbgs() << "[ValueSimplify] " << V << " -> " << *RC
<< " in " << *RI << " :: " << *this << "\n");
if (A.changeUseAfterManifest(RI->getOperandUse(0), *C))
if (A.changeUseAfterManifest(RI->getOperandUse(0), *RC))
Changed = ChangeStatus::CHANGED;
}
return true;

View File

@ -1,9 +1,23 @@
; RUN: opt -attributor -S %s | FileCheck %s
; RUN: opt -passes=attributor -S %s | FileCheck %s
;
; CHECK: define i32 addrspace(1)* @foo(i32 addrspace(4)* nofree readnone %arg)
@var = internal global [1 x i32] undef
; CHECK-LABEL: define i32 addrspace(1)* @foo(i32 addrspace(4)* nofree readnone %arg)
define i32 addrspace(1)* @foo(i32 addrspace(4)* %arg) {
entry:
%0 = addrspacecast i32 addrspace(4)* %arg to i32 addrspace(1)*
ret i32 addrspace(1)* %0
}
define i32* @func1() {
%ptr = call i32* @func1a([1 x i32]* @var)
ret i32* %ptr
}
; CHECK-LABEL: define internal nonnull align 4 dereferenceable(4) i32* @func1a()
; CHECK-NEXT: ret i32* getelementptr inbounds ([1 x i32], [1 x i32]* @var, i32 0, i32 0)
define internal i32* @func1a([1 x i32]* %arg) {
%ptr = getelementptr inbounds [1 x i32], [1 x i32]* %arg, i64 0, i64 0
ret i32* %ptr
}