1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; These tests check the optimizations specific to 3*9880d681SAndroid Build Coastguard Worker; pointers being relocated at a statepoint. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare void @func() 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i1 @test_negative(i32 addrspace(1)* %p) gc "statepoint-example" { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker %safepoint_token = tail call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @func, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %p) 11*9880d681SAndroid Build Coastguard Worker %pnew = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 7, i32 7) 12*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 addrspace(1)* %pnew, null 13*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_negative 15*9880d681SAndroid Build Coastguard Worker; CHECK: %pnew = call i32 addrspace(1)* 16*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %cmp 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine i1 @test_nonnull(i32 addrspace(1)* nonnull %p) gc "statepoint-example" { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker %safepoint_token = tail call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @func, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %p) 22*9880d681SAndroid Build Coastguard Worker %pnew = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 7, i32 7) 23*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 addrspace(1)* %pnew, null 24*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_nonnull 26*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i1 @test_null() gc "statepoint-example" { 30*9880d681SAndroid Build Coastguard Workerentry: 31*9880d681SAndroid Build Coastguard Worker %safepoint_token = tail call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @func, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* null) 32*9880d681SAndroid Build Coastguard Worker %pnew = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 7, i32 7) 33*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 addrspace(1)* %pnew, null 34*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_null 36*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %pnew 37*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine i1 @test_undef() gc "statepoint-example" { 41*9880d681SAndroid Build Coastguard Workerentry: 42*9880d681SAndroid Build Coastguard Worker %safepoint_token = tail call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @func, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* undef) 43*9880d681SAndroid Build Coastguard Worker %pnew = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 7, i32 7) 44*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 addrspace(1)* %pnew, null 45*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_undef 47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %pnew 48*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 undef 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdeclare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...) 52*9880d681SAndroid Build Coastguard Workerdeclare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32) #3 53