mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
fdc2660214
Use the pointer size if datalayout is available. Use i64 if it's not, which is consistent with what other places do when the pointer size is unknown. The test doesn't really test this in a useful way since it will be transformed to that later anyway, but this now tests it for non-zero arrays and when datalayout isn't available. The cases in visitGetElementPtrInst should save an extra re-visit to the newly created GEP since it won't need to cleanup after itself. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188339 91177308-0d34-0410-b5e6-96231b3b80d8
132 lines
3.7 KiB
LLVM
132 lines
3.7 KiB
LLVM
; RUN: opt < %s -instcombine -S -default-data-layout="E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" | FileCheck %s
|
|
; RUN: opt < %s -instcombine -S -default-data-layout="E-p:32:32:32-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" | FileCheck %s -check-prefix=P32
|
|
; RUN: opt < %s -instcombine -S | FileCheck %s -check-prefix=NODL
|
|
|
|
|
|
declare void @use(...)
|
|
|
|
@int = global i32 zeroinitializer
|
|
|
|
; Zero byte allocas should be merged if they can't be deleted.
|
|
; CHECK-LABEL: @test(
|
|
; CHECK: alloca
|
|
; CHECK-NOT: alloca
|
|
define void @test() {
|
|
%X = alloca [0 x i32] ; <[0 x i32]*> [#uses=1]
|
|
call void (...)* @use( [0 x i32]* %X )
|
|
%Y = alloca i32, i32 0 ; <i32*> [#uses=1]
|
|
call void (...)* @use( i32* %Y )
|
|
%Z = alloca { } ; <{ }*> [#uses=1]
|
|
call void (...)* @use( { }* %Z )
|
|
%size = load i32* @int
|
|
%A = alloca {{}}, i32 %size
|
|
call void (...)* @use( {{}}* %A )
|
|
ret void
|
|
}
|
|
|
|
; Zero byte allocas should be deleted.
|
|
; CHECK-LABEL: @test2(
|
|
; CHECK-NOT: alloca
|
|
define void @test2() {
|
|
%A = alloca i32 ; <i32*> [#uses=1]
|
|
store i32 123, i32* %A
|
|
ret void
|
|
}
|
|
|
|
; Zero byte allocas should be deleted.
|
|
; CHECK-LABEL: @test3(
|
|
; CHECK-NOT: alloca
|
|
define void @test3() {
|
|
%A = alloca { i32 } ; <{ i32 }*> [#uses=1]
|
|
%B = getelementptr { i32 }* %A, i32 0, i32 0 ; <i32*> [#uses=1]
|
|
store i32 123, i32* %B
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: @test4(
|
|
; CHECK: = zext i32 %n to i64
|
|
; CHECK: %A = alloca i32, i64 %
|
|
define i32* @test4(i32 %n) {
|
|
%A = alloca i32, i32 %n
|
|
ret i32* %A
|
|
}
|
|
|
|
; Allocas which are only used by GEPs, bitcasts, and stores (transitively)
|
|
; should be deleted.
|
|
define void @test5() {
|
|
; CHECK-LABEL: @test5(
|
|
; CHECK-NOT: alloca
|
|
; CHECK-NOT: store
|
|
; CHECK: ret
|
|
|
|
entry:
|
|
%a = alloca { i32 }
|
|
%b = alloca i32*
|
|
%a.1 = getelementptr { i32 }* %a, i32 0, i32 0
|
|
store i32 123, i32* %a.1
|
|
store i32* %a.1, i32** %b
|
|
%b.1 = bitcast i32** %b to i32*
|
|
store i32 123, i32* %b.1
|
|
%a.2 = getelementptr { i32 }* %a, i32 0, i32 0
|
|
store atomic i32 2, i32* %a.2 unordered, align 4
|
|
%a.3 = getelementptr { i32 }* %a, i32 0, i32 0
|
|
store atomic i32 3, i32* %a.3 release, align 4
|
|
%a.4 = getelementptr { i32 }* %a, i32 0, i32 0
|
|
store atomic i32 4, i32* %a.4 seq_cst, align 4
|
|
ret void
|
|
}
|
|
|
|
declare void @f(i32* %p)
|
|
|
|
; Check that we don't delete allocas in some erroneous cases.
|
|
define void @test6() {
|
|
; CHECK-LABEL: @test6(
|
|
; CHECK-NOT: ret
|
|
; CHECK: alloca
|
|
; CHECK-NEXT: alloca
|
|
; CHECK: ret
|
|
|
|
entry:
|
|
%a = alloca { i32 }
|
|
%b = alloca i32
|
|
%a.1 = getelementptr { i32 }* %a, i32 0, i32 0
|
|
store volatile i32 123, i32* %a.1
|
|
tail call void @f(i32* %b)
|
|
ret void
|
|
}
|
|
|
|
; PR14371
|
|
%opaque_type = type opaque
|
|
%real_type = type { { i32, i32* } }
|
|
|
|
@opaque_global = external constant %opaque_type, align 4
|
|
|
|
define void @test7() {
|
|
entry:
|
|
%0 = alloca %real_type, align 4
|
|
%1 = bitcast %real_type* %0 to i8*
|
|
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* bitcast (%opaque_type* @opaque_global to i8*), i32 8, i32 1, i1 false)
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
|
|
|
|
|
|
; Check that the GEP indices use the pointer size, or 64 if unknown
|
|
define void @test8() {
|
|
; CHECK-LABEL: @test8(
|
|
; CHECK: alloca [100 x i32]
|
|
; CHECK: getelementptr inbounds [100 x i32]* %x1, i64 0, i64 0
|
|
|
|
; P32-LABEL: @test8(
|
|
; P32: alloca [100 x i32]
|
|
; P32: getelementptr inbounds [100 x i32]* %x1, i32 0, i32 0
|
|
|
|
; NODL-LABEL: @test8(
|
|
; NODL: alloca [100 x i32]
|
|
; NODL: getelementptr inbounds [100 x i32]* %x1, i64 0, i64 0
|
|
%x = alloca i32, i32 100
|
|
call void (...)* @use(i32* %x)
|
|
ret void
|
|
}
|