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:
parent
456e0d4205
commit
3b4efce99e
@ -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;
|
||||
|
@ -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"}
|
||||
|
Loading…
x
Reference in New Issue
Block a user