1// RUN: tco %s | FileCheck %s 2// RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s 3 4// Test fir.is_present and fir.absent codegen 5 6// CHECK-LABEL: @foo1 7func.func @foo1(%arg0: !fir.box<!fir.array<?xf32>>) -> i1 { 8 // CHECK: %[[ptr:.*]] = ptrtoint ptr %{{.*}} to i64 9 // CHECK: icmp ne i64 %[[ptr]], 0 10 %0 = fir.is_present %arg0 : (!fir.box<!fir.array<?xf32>>) -> i1 11 return %0 : i1 12} 13 14// CHECK-LABEL: @bar1 15func.func @bar1() -> i1 { 16 %0 = fir.absent !fir.box<!fir.array<?xf32>> 17 // CHECK: call i1 @foo1(ptr null) 18 %1 = fir.call @foo1(%0) : (!fir.box<!fir.array<?xf32>>) -> i1 19 return %1 : i1 20} 21 22// CHECK-LABEL: @foo2 23func.func @foo2(%arg0: !fir.ref<i64>) -> i1 { 24 // CHECK: %[[ptr:.*]] = ptrtoint ptr %{{.*}} to i64 25 // CHECK: icmp ne i64 %[[ptr]], 0 26 %0 = fir.is_present %arg0 : (!fir.ref<i64>) -> i1 27 return %0 : i1 28} 29 30// CHECK-LABEL: @bar2 31func.func @bar2() -> i1 { 32 %0 = fir.absent !fir.ref<i64> 33 // CHECK: call i1 @foo2(ptr null) 34 %1 = fir.call @foo2(%0) : (!fir.ref<i64>) -> i1 35 return %1 : i1 36} 37 38// CHECK-LABEL: @foo3 39func.func @foo3(%arg0: !fir.boxchar<1>) -> i1 { 40 // CHECK: %[[extract:.*]] = extractvalue { ptr, i64 } %{{.*}}, 0 41 // CHECK: %[[ptr:.*]] = ptrtoint ptr %[[extract]] to i64 42 // CHECK: icmp ne i64 %[[ptr]], 0 43 %0 = fir.is_present %arg0 : (!fir.boxchar<1>) -> i1 44 return %0 : i1 45} 46 47// CHECK-LABEL: @bar3 48func.func @bar3() -> i1 { 49 %0 = fir.absent !fir.boxchar<1> 50 // CHECK: call i1 @foo3(ptr null, i64 0) 51 %1 = fir.call @foo3(%0) : (!fir.boxchar<1>) -> i1 52 return %1 : i1 53} 54 55// CHECK-LABEL: @foo4( 56// CHECK-SAME: ptr %[[arg:.*]]) 57func.func @foo4(%arg0: !fir.boxproc<(i32)->(i64)>) -> i1 { 58 // CHECK: %[[ptr:.*]] = ptrtoint ptr %[[arg]] to i64 59 // CHECK: icmp ne i64 %[[ptr]], 0 60 %0 = fir.is_present %arg0 : (!fir.boxproc<(i32)->(i64)>) -> i1 61 return %0 : i1 62} 63 64// CHECK-LABEL: @bar4 65func.func @bar4() -> i1 { 66 %0 = fir.absent !fir.boxproc<(i32)->(i64)> 67 // CHECK: call i1 @foo4(ptr null) 68 %1 = fir.call @foo4(%0) : (!fir.boxproc<(i32)->(i64)>) -> i1 69 return %1 : i1 70} 71 72// CHECK-LABEL: @foo5( 73// CHECK-SAME: ptr %[[arg:.*]]) 74func.func @foo5(%arg0: (i32)->(i64)) -> i1 { 75 // CHECK: %[[ptr:.*]] = ptrtoint ptr %[[arg]] to i64 76 // CHECK: icmp ne i64 %[[ptr]], 0 77 %0 = fir.is_present %arg0 : ((i32)->(i64)) -> i1 78 return %0 : i1 79} 80 81// CHECK-LABEL: @bar5 82func.func @bar5() -> i1 { 83 %0 = fir.absent (i32)->(i64) 84 // CHECK: call i1 @foo5(ptr null) 85 %1 = fir.call @foo5(%0) : ((i32)->(i64)) -> i1 86 return %1 : i1 87} 88