1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Modify constraints in llvm::canReplaceOperandWithVariable

Summary:
`Instruction::Switch`: only first operand can be set to a non-constant value.
`Instruction::InsertValue` both the first and the second operand can be set to a non-constant value.
`Instruction::Alloca` return true for non-static allocation.

Reviewers: efriedma

Reviewed By: efriedma

Subscribers: srhines, pirama, llvm-commits

Differential Revision: https://reviews.llvm.org/D34905

llvm-svn: 307294
This commit is contained in:
Leo Li 2017-07-06 18:47:05 +00:00
parent 456e0d4205
commit 3b4efce99e
2 changed files with 32 additions and 2 deletions

View File

@ -2182,12 +2182,18 @@ bool llvm::canReplaceOperandWithVariable(const Instruction *I, unsigned OpIdx) {
case Instruction::ShuffleVector:
// Shufflevector masks are constant.
return OpIdx != 2;
case Instruction::Switch:
case Instruction::ExtractValue:
case Instruction::InsertValue:
// All operands apart from the first are constant.
return OpIdx == 0;
case Instruction::InsertValue:
// All operands apart from the first and the second are constant.
return OpIdx < 2;
case Instruction::Alloca:
return false;
// Static allocas (constant size in the entry block) are handled by
// prologue/epilogue insertion so they're free anyway. We definitely don't
// want to make them non-constant.
return !dyn_cast<AllocaInst>(I)->isStaticAlloca();
case Instruction::GetElementPtr:
if (OpIdx == 0)
return true;

View File

@ -818,6 +818,30 @@ merge:
; CHECK: right:
; CHECK-NEXT: %val1 = call i32 @call_target() [ "deopt"(i32 20) ]
%T = type {i32, i32}
define i32 @test_insertvalue(i1 zeroext %flag, %T %P) {
entry:
br i1 %flag, label %if.then, label %if.else
if.then:
%t1 = insertvalue %T %P, i32 0, 0
br label %if.end
if.else:
%t2 = insertvalue %T %P, i32 1, 0
br label %if.end
if.end:
%t = phi %T [%t1, %if.then], [%t2, %if.else]
ret i32 1
}
; CHECK-LABEL: @test_insertvalue
; CHECK: select
; CHECK: insertvalue
; CHECK-NOT: insertvalue
; CHECK: ![[TBAA]] = !{![[TYPE:[0-9]]], ![[TYPE]], i64 0}
; CHECK: ![[TYPE]] = !{!"float", ![[TEXT:[0-9]]]}
; CHECK: ![[TEXT]] = !{!"an example type tree"}