1// RUN: tco %s | FileCheck %s 2 3// Test fir.is_present and fir.absent codegen 4 5// CHECK-LABEL: @foo1 6func.func @foo1(%arg0: !fir.box<!fir.array<?xf32>>) -> i1 { 7 // CHECK: %[[ptr:.*]] = ptrtoint { float*, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }* %{{.*}} to i64 8 // CHECK: icmp ne i64 %[[ptr]], 0 9 %0 = fir.is_present %arg0 : (!fir.box<!fir.array<?xf32>>) -> i1 10 return %0 : i1 11} 12 13// CHECK-LABEL: @bar1 14func.func @bar1() -> i1 { 15 %0 = fir.absent !fir.box<!fir.array<?xf32>> 16 // CHECK: call i1 @foo1({ float*, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }* null) 17 %1 = fir.call @foo1(%0) : (!fir.box<!fir.array<?xf32>>) -> i1 18 return %1 : i1 19} 20 21// CHECK-LABEL: @foo2 22func.func @foo2(%arg0: !fir.ref<i64>) -> i1 { 23 // CHECK: %[[ptr:.*]] = ptrtoint i64* %{{.*}} to i64 24 // CHECK: icmp ne i64 %[[ptr]], 0 25 %0 = fir.is_present %arg0 : (!fir.ref<i64>) -> i1 26 return %0 : i1 27} 28 29// CHECK-LABEL: @bar2 30func.func @bar2() -> i1 { 31 %0 = fir.absent !fir.ref<i64> 32 // CHECK: call i1 @foo2(i64* null) 33 %1 = fir.call @foo2(%0) : (!fir.ref<i64>) -> i1 34 return %1 : i1 35} 36 37// CHECK-LABEL: @foo3 38func.func @foo3(%arg0: !fir.boxchar<1>) -> i1 { 39 // CHECK: %[[extract:.*]] = extractvalue { i8*, i64 } %{{.*}}, 0 40 // CHECK: %[[ptr:.*]] = ptrtoint i8* %[[extract]] to i64 41 // CHECK: icmp ne i64 %[[ptr]], 0 42 %0 = fir.is_present %arg0 : (!fir.boxchar<1>) -> i1 43 return %0 : i1 44} 45 46// CHECK-LABEL: @bar3 47func.func @bar3() -> i1 { 48 %0 = fir.absent !fir.boxchar<1> 49 // CHECK: call i1 @foo3(i8* null, i64 undef) 50 %1 = fir.call @foo3(%0) : (!fir.boxchar<1>) -> i1 51 return %1 : i1 52} 53