mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
72e765907f
Summary: Got asserts in llvm::CastInst::getCastOpcode saying: `DestBits == SrcBits && "Illegal cast to vector (wrong type or size)"' failed. Problem seemed to be that llvm::ConstantFoldCastInstruction did not handle ptrtoint cast of a getelementptr returning a vector correctly. I assume such situations are quite rare, since the GEP needs to be considered as a constant value (base pointer being null). The solution used here is to simply avoid the constant fold of ptrtoint when the value is a vector. It is not supported, and by bailing out we do not fail on assertions later on. Reviewers: craig.topper, majnemer, davide, filcab, efriedma Reviewed By: efriedma Subscribers: efriedma, filcab, llvm-commits Differential Revision: https://reviews.llvm.org/D38546 llvm-svn: 316430
33 lines
1.3 KiB
LLVM
33 lines
1.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
|
|
|
; Test constant fold of constant expression GEP used by ptrtoint (the
|
|
; "offsetof-like expression" case).
|
|
; This used to hit an assert due to not supporting vectors in
|
|
; llvm::ConstantFoldCastInstruction when handling ptrtoint.
|
|
define <2 x i16> @test1() {
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: ret <2 x i16> ptrtoint (<2 x i32*> getelementptr ([10 x i32], [10 x i32]* null, <2 x i64> zeroinitializer, <2 x i64> <i64 5, i64 7>) to <2 x i16>)
|
|
;
|
|
entry:
|
|
%gep = getelementptr inbounds [10 x i32], [10 x i32]* null, i16 0, <2 x i16> <i16 5, i16 7>
|
|
%vec = ptrtoint <2 x i32*> %gep to <2 x i16>
|
|
ret <2 x i16> %vec
|
|
}
|
|
|
|
; Test constant fold of constant expression GEP used by ptrtoint (the
|
|
; "sizeof-like expression" case).
|
|
; This used to hit an assert due to not supporting vectors in
|
|
; llvm::ConstantFoldCastInstruction when handling ptrtoint.
|
|
define <2 x i16> @test2() {
|
|
; CHECK-LABEL: @test2(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: ret <2 x i16> ptrtoint (<2 x i32*> getelementptr (i32, i32* null, <2 x i64> <i64 5, i64 7>) to <2 x i16>)
|
|
;
|
|
entry:
|
|
%gep = getelementptr i32, i32* null, <2 x i16> <i16 5, i16 7>
|
|
%vec = ptrtoint <2 x i32*> %gep to <2 x i16>
|
|
ret <2 x i16> %vec
|
|
}
|