mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281144 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user