1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

InstCombine: Don't combine loads/stores from swifterror to a new type

This generates invalid IR: the only users of swifterror can be call
arguments, loads, and stores.

rdar://28242257

llvm-svn: 281144
This commit is contained in:
Arnold Schwaighofer 2016-09-10 18:14:57 +00:00
parent 8781da1527
commit 3f1847d944
3 changed files with 41 additions and 0 deletions

View File

@ -465,6 +465,10 @@ static Instruction *combineLoadToOperationType(InstCombiner &IC, LoadInst &LI) {
if (LI.use_empty())
return nullptr;
// swifterror values can't be bitcasted.
if (LI.getPointerOperand()->isSwiftError())
return nullptr;
Type *Ty = LI.getType();
const DataLayout &DL = IC.getDataLayout();
@ -997,6 +1001,10 @@ static bool combineStoreToValueType(InstCombiner &IC, StoreInst &SI) {
if (!SI.isUnordered())
return false;
// swifterror values can't be bitcasted.
if (SI.getPointerOperand()->isSwiftError())
return false;
Value *V = SI.getValueOperand();
// Fold away bit casts of the stored value by storing the original type.

View File

@ -32,4 +32,19 @@ entry:
ret void
}
; Check that we don't combine the bitcast into the store. This would create a
; bitcast of the swifterror which is invalid.
; CHECK-LABEL; @swifterror_store
; CHECK: bitcast i64
; CHECK: store %swift.error
%swift.error = type opaque
define void @swifterror_store(i64* %x, %swift.error** swifterror %err) {
entry:
%casted = bitcast i64* %x to %swift.error*
store %swift.error* %casted, %swift.error** %err
ret void
}
!0 = !{!0}

View File

@ -201,3 +201,21 @@ entry:
ret void
}
; Check that we don't try change the type of the load by inserting a bitcast
; generating invalid IR.
; CHECK-LABEL: @test18(
; CHECK-NOT: bitcast
; CHECK: ret
%swift.error = type opaque
declare void @useSwiftError(%swift.error** swifterror)
define void @test18(%swift.error** swifterror %err) {
entry:
%swifterror = alloca swifterror %swift.error*, align 8
store %swift.error* null, %swift.error** %swifterror, align 8
call void @useSwiftError(%swift.error** nonnull swifterror %swifterror)
%err.res = load %swift.error*, %swift.error** %swifterror, align 8
store %swift.error* %err.res, %swift.error** %err, align 8
ret void
}