Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Analysis/ValueTracking/memory-dereferenceable.ll
Show First 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | |||||
; CHECK: %sret_gep{{.*}}(aligned) | ; CHECK: %sret_gep{{.*}}(aligned) | ||||
%sret_gep = getelementptr inbounds %struct.A, %struct.A* %result, i64 0, i32 1, i64 2 | %sret_gep = getelementptr inbounds %struct.A, %struct.A* %result, i64 0, i32 1, i64 2 | ||||
load i8, i8* %sret_gep | load i8, i8* %sret_gep | ||||
; CHECK-NOT: %sret_gep_outside | ; CHECK-NOT: %sret_gep_outside | ||||
%sret_gep_outside = getelementptr %struct.A, %struct.A* %result, i64 0, i32 1, i64 7 | %sret_gep_outside = getelementptr %struct.A, %struct.A* %result, i64 0, i32 1, i64 7 | ||||
load i8, i8* %sret_gep_outside | load i8, i8* %sret_gep_outside | ||||
; CHECK: %dparam{{.*}}(aligned) | ; FIXME: This can be null but it is also known dereferenceable. However, right | ||||
; now we cannot return both information from | |||||
; Value::getPointerDereferenceableBytes(...). | |||||
; CHECK-NOT: %dparam{{.*}}(aligned) | |||||
%load3 = load i32, i32 addrspace(1)* %dparam | %load3 = load i32, i32 addrspace(1)* %dparam | ||||
; CHECK: %relocate{{.*}}(aligned) | ; FIXME: This can be null but it is also known dereferenceable. However, right | ||||
; now we cannot return both information from | |||||
; Value::getPointerDereferenceableBytes(...). | |||||
; CHECK-NOT: %relocate{{.*}}(aligned) | |||||
%tok = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %dparam) | %tok = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %dparam) | ||||
%relocate = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 7, i32 7) | %relocate = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 7, i32 7) | ||||
%load4 = load i32, i32 addrspace(1)* %relocate | %load4 = load i32, i32 addrspace(1)* %relocate | ||||
; CHECK-NOT: %nparam | ; CHECK-NOT: %nparam | ||||
%dpa = call i32 addrspace(1)* @func1(i32 addrspace(1)* %dparam) | %dpa = call i32 addrspace(1)* @func1(i32 addrspace(1)* %dparam) | ||||
%nparam = getelementptr i32, i32 addrspace(1)* %dpa, i32 5 | %nparam = getelementptr i32, i32 addrspace(1)* %dpa, i32 5 | ||||
%load5 = load i32, i32 addrspace(1)* %nparam | %load5 = load i32, i32 addrspace(1)* %nparam | ||||
Show All 35 Lines | ; CHECK-NOT: %outside_allocation | ||||
; Loads from aligned globals | ; Loads from aligned globals | ||||
; CHECK: @globalptr.align1{{.*}}(unaligned) | ; CHECK: @globalptr.align1{{.*}}(unaligned) | ||||
; CHECK: @globalptr.align16{{.*}}(aligned) | ; CHECK: @globalptr.align16{{.*}}(aligned) | ||||
%load13 = load i8, i8* @globalptr.align1, align 16 | %load13 = load i8, i8* @globalptr.align1, align 16 | ||||
%load14 = load i8, i8* @globalptr.align16, align 16 | %load14 = load i8, i8* @globalptr.align16, align 16 | ||||
; Loads from aligned arguments | ; Loads from aligned arguments | ||||
; CHECK: %dparam.align1{{.*}}(unaligned) | ; FIXME: This can be null but it is also known dereferenceable. However, right | ||||
; CHECK: %dparam.align16{{.*}}(aligned) | ; now we cannot return both information from | ||||
; Value::getPointerDereferenceableBytes(...). | |||||
; CHECK-NOT: %dparam.align1{{.*}}(unaligned) | |||||
; CHECK-NOT: %dparam.align16{{.*}}(aligned) | |||||
%load15 = load i8, i8 addrspace(1)* %dparam.align1, align 16 | %load15 = load i8, i8 addrspace(1)* %dparam.align1, align 16 | ||||
%load16 = load i8, i8 addrspace(1)* %dparam.align16, align 16 | %load16 = load i8, i8 addrspace(1)* %dparam.align16, align 16 | ||||
; Loads from byval arguments | ; Loads from byval arguments | ||||
; CHECK: %i8_byval{{.*}}(aligned) | ; CHECK: %i8_byval{{.*}}(aligned) | ||||
%i8_byval_load = load i8, i8* %i8_byval | %i8_byval_load = load i8, i8* %i8_byval | ||||
; CHECK-NOT: %byval_cast | ; CHECK-NOT: %byval_cast | ||||
%byval_cast = bitcast i8* %i8_byval to i32* | %byval_cast = bitcast i8* %i8_byval to i32* | ||||
%bad_byval_load = load i32, i32* %byval_cast | %bad_byval_load = load i32, i32* %byval_cast | ||||
; CHECK: %byval_gep{{.*}}(aligned) | ; CHECK: %byval_gep{{.*}}(aligned) | ||||
%byval_gep = getelementptr inbounds %struct.A, %struct.A* %A_byval, i64 0, i32 1, i64 2 | %byval_gep = getelementptr inbounds %struct.A, %struct.A* %A_byval, i64 0, i32 1, i64 2 | ||||
load i8, i8* %byval_gep | load i8, i8* %byval_gep | ||||
; Loads from aligned allocas | ; Loads from aligned allocas | ||||
; CHECK: %alloca.align1{{.*}}(unaligned) | ; CHECK: %alloca.align1{{.*}}(unaligned) | ||||
; CHECK: %alloca.align16{{.*}}(aligned) | ; CHECK: %alloca.align16{{.*}}(aligned) | ||||
%alloca.align1 = alloca i1, align 1 | %alloca.align1 = alloca i1, align 1 | ||||
%alloca.align16 = alloca i1, align 16 | %alloca.align16 = alloca i1, align 16 | ||||
%load17 = load i1, i1* %alloca.align1, align 16 | %load17 = load i1, i1* %alloca.align1, align 16 | ||||
%load18 = load i1, i1* %alloca.align16, align 16 | %load18 = load i1, i1* %alloca.align16, align 16 | ||||
; Loads from GEPs | ; Loads from GEPs | ||||
; CHECK: %gep.align1.offset1{{.*}}(unaligned) | ; FIXME: This can be null but it is also known dereferenceable. However, right | ||||
; CHECK: %gep.align16.offset1{{.*}}(unaligned) | ; now we cannot return both information from | ||||
; CHECK: %gep.align1.offset16{{.*}}(unaligned) | ; Value::getPointerDereferenceableBytes(...). | ||||
; CHECK: %gep.align16.offset16{{.*}}(aligned) | ; CHECK-NOT: %gep.align1.offset1{{.*}}(unaligned) | ||||
; CHECK-NOT: %gep.align16.offset1{{.*}}(unaligned) | |||||
; CHECK-NOT: %gep.align1.offset16{{.*}}(unaligned) | |||||
; CHECK-NOT: %gep.align16.offset16{{.*}}(aligned) | |||||
%gep.align1.offset1 = getelementptr inbounds i8, i8 addrspace(1)* %dparam.align1, i32 1 | %gep.align1.offset1 = getelementptr inbounds i8, i8 addrspace(1)* %dparam.align1, i32 1 | ||||
%gep.align16.offset1 = getelementptr inbounds i8, i8 addrspace(1)* %dparam.align16, i32 1 | %gep.align16.offset1 = getelementptr inbounds i8, i8 addrspace(1)* %dparam.align16, i32 1 | ||||
%gep.align1.offset16 = getelementptr inbounds i8, i8 addrspace(1)* %dparam.align1, i32 16 | %gep.align1.offset16 = getelementptr inbounds i8, i8 addrspace(1)* %dparam.align1, i32 16 | ||||
%gep.align16.offset16 = getelementptr inbounds i8, i8 addrspace(1)* %dparam.align16, i32 16 | %gep.align16.offset16 = getelementptr inbounds i8, i8 addrspace(1)* %dparam.align16, i32 16 | ||||
%load19 = load i8, i8 addrspace(1)* %gep.align1.offset1, align 16 | %load19 = load i8, i8 addrspace(1)* %gep.align1.offset1, align 16 | ||||
%load20 = load i8, i8 addrspace(1)* %gep.align16.offset1, align 16 | %load20 = load i8, i8 addrspace(1)* %gep.align16.offset1, align 16 | ||||
%load21 = load i8, i8 addrspace(1)* %gep.align1.offset16, align 16 | %load21 = load i8, i8 addrspace(1)* %gep.align1.offset16, align 16 | ||||
%load22 = load i8, i8 addrspace(1)* %gep.align16.offset16, align 16 | %load22 = load i8, i8 addrspace(1)* %gep.align16.offset16, align 16 | ||||
▲ Show 20 Lines • Show All 61 Lines • Show Last 20 Lines |