Skip to content

Commit

Permalink
CastInst::castIsValid should return true if the dest type is the same as
Browse files Browse the repository at this point in the history
Value's current type. The casting is trivial even for aggregate type.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172143 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Evan Cheng committed Jan 10, 2013
1 parent 0e4776c commit 582e4f2
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/IR/Instructions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2624,6 +2624,11 @@ CastInst::castIsValid(Instruction::CastOps op, Value *S, Type *DstTy) {

// Check for type sanity on the arguments
Type *SrcTy = S->getType();

// If this is a cast to the same type then it's trivially true.
if (SrcTy == DstTy)
return true;

if (!SrcTy->isFirstClassType() || !DstTy->isFirstClassType() ||
SrcTy->isAggregateType() || DstTy->isAggregateType())
return false;
Expand Down
36 changes: 36 additions & 0 deletions test/Transforms/MergeFunc/2013-01-10-MergeFuncAssert.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
; RUN: opt -mergefunc -disable-output < %s
; This used to trigger a ConstantExpr::getBitCast assertion.

define void @t1() unnamed_addr uwtable ssp align 2 {
entry:
switch i32 undef, label %sw.bb12 [
i32 127, label %sw.bb
i32 126, label %sw.bb4
]

sw.bb: ; preds = %entry
unreachable

sw.bb4: ; preds = %entry
unreachable

sw.bb12: ; preds = %entry
ret void
}

define void @t2() unnamed_addr uwtable ssp align 2 {
entry:
switch i32 undef, label %sw.bb8 [
i32 4, label %sw.bb
i32 3, label %sw.bb4
]

sw.bb: ; preds = %entry
unreachable

sw.bb4: ; preds = %entry
ret void

sw.bb8: ; preds = %entry
unreachable
}

0 comments on commit 582e4f2

Please sign in to comment.