@@ -614,11 +614,25 @@ llvm.func @ex2(%input : f32, %pred : i1) {
614614 // CHECK: %{{.*}} = llvm.inline_asm has_side_effects asm_dialect = att "ex2.approx.ftz.f32 $0, $1;", "=f,f" %{{.*}} : (f32) -> f32
615615 %0 = nvvm.inline_ptx " ex2.approx.ftz.f32 {$w0}, {$r0};" ro (%input : f32 ) -> f32
616616
617- // CHECK: %{{.*}} = llvm.inline_asm has_side_effects asm_dialect = att "@$1 ex2.approx.ftz.f32 $0, $1;", "=f,f,b" %{{.*}}, %{{.*}} : (f32, i1) -> f32
617+ // CHECK: %{{.*}} = llvm.inline_asm has_side_effects asm_dialect = att "@$2 ex2.approx.ftz.f32 $0, $1;", "=f,f,b" %{{.*}}, %{{.*}} : (f32, i1) -> f32
618618 %1 = nvvm.inline_ptx " ex2.approx.ftz.f32 {$w0}, {$r0};" ro (%input : f32 ), predicate = %pred -> f32
619619 llvm.return
620620}
621621
622+ // CHECK-LABEL: @multi_return_pred(
623+ // CHECK-SAME: %[[arg0:[a-zA-Z0-9_]+]]: i32, %[[arg1:[a-zA-Z0-9_]+]]: i32, %[[pred:[a-zA-Z0-9_]+]]: i1)
624+ llvm.func @multi_return_pred (%a : i32 , %b : i32 , %pred : i1 ) -> i32 {
625+ // CHECK: %[[S1:.+]] = llvm.inline_asm has_side_effects asm_dialect = att "@$4 {.reg .pred p; setp.ge.s32 p, $2, $3; selp.s32 $0, $2,$3, p; selp.s32 $1, $2,$3, p;}", "=r,=r,r,r,b" %[[arg0]], %[[arg1]], %[[pred]] : (i32, i32, i1) -> !llvm.struct<(i32, i32)>
626+ // CHECK: %[[S2:.+]] = llvm.extractvalue %[[S1]][0] : !llvm.struct<(i32, i32)>
627+ // CHECK: %[[S3:.+]] = llvm.extractvalue %[[S1]][1] : !llvm.struct<(i32, i32)>
628+ // CHECK: %[[S4:.+]] = llvm.add %[[S2]], %[[S3]] : i32
629+ // CHECK: llvm.return %[[S4]] : i32
630+ %r1 , %r2 = nvvm.inline_ptx " {.reg .pred p; setp.ge.s32 p, {$r0}, {$r1}; selp.s32 {$w0}, {$r0},{$r1}, p; selp.s32 {$w1}, {$r0},{$r1}, p;}"
631+ ro (%a , %b : i32 ,i32 ), predicate = %pred -> i32 ,i32
632+ %r3 = llvm.add %r1 , %r2 : i32
633+ llvm.return %r3 : i32
634+ }
635+
622636// CHECK-LABEL: @multi_return(
623637// CHECK-SAME: %[[arg0:[a-zA-Z0-9_]+]]: i32, %[[arg1:[a-zA-Z0-9_]+]]: i32)
624638llvm.func @multi_return (%a : i32 , %b : i32 ) -> i32 {
@@ -651,6 +665,24 @@ llvm.func @inline_ptx_multi_rw(%a : i32, %b : i32, %rw_c : f32, %rw_d : f32) ->
651665 llvm.return %r4 : f32
652666}
653667
668+ // CHECK-LABEL: @inline_ptx_multi_rw_pred(
669+ // CHECK-SAME: %[[arg0:[a-zA-Z0-9_]+]]: i32, %[[arg1:[a-zA-Z0-9_]+]]: i32, %[[arg2:[a-zA-Z0-9_]+]]: f32, %[[arg3:[a-zA-Z0-9_]+]]: f32, %[[pred:[a-zA-Z0-9_]+]]: i1)
670+ llvm.func @inline_ptx_multi_rw_pred (%a : i32 , %b : i32 , %rw_c : f32 , %rw_d : f32 , %pred : i1 ) -> f32 {
671+ // CHECK: %[[S0:.+]] = llvm.inline_asm has_side_effects asm_dialect = att "@$4 {.reg .pred p; setp.ge.s32 p, $2, $3; selp.s32 $0, $2,$3, p; selp.s32 $1, $2,$3, p;}",
672+ // CHECK-SAME: "=f,=f,r,r,b,0,1"
673+ // CHECK-SAME: %[[arg2]], %[[arg3]], %[[arg0]], %[[arg1]], %[[pred]]
674+ // CHECK-SAME: : (f32, f32, i32, i32, i1) -> !llvm.struct<(f32, f32)>
675+ // CHECK: %[[S1:.+]] = llvm.extractvalue %[[S0]][0] : !llvm.struct<(f32, f32)>
676+ // CHECK: %[[S2:.+]] = llvm.extractvalue %[[S0]][1] : !llvm.struct<(f32, f32)>
677+ // CHECK: %[[S3:.+]] = llvm.fadd %[[S1]], %[[S2]] : f32
678+ // CHECK: llvm.return %[[S3]] : f32
679+ nvvm.inline_ptx " {.reg .pred p; setp.ge.s32 p, {$r0}, {$r1}; selp.s32 {$rw0}, {$r0},{$r1}, p; selp.s32 {$rw1}, {$r0},{$r1}, p;}"
680+ ro (%a , %b : i32 ,i32 )
681+ rw (%rw_c , %rw_d: f32 ,f32 ), predicate = %pred
682+ %r4 = llvm.fadd %rw_c , %rw_d : f32
683+ llvm.return %r4 : f32
684+ }
685+
654686// CHECK-LABEL: @inline_ptx_multi_rw_r(
655687// CHECK-SAME: %[[arg0:[a-zA-Z0-9_]+]]: i32, %[[arg1:[a-zA-Z0-9_]+]]: i32, %[[arg2:[a-zA-Z0-9_]+]]: f32, %[[arg3:[a-zA-Z0-9_]+]]: f32)
656688llvm.func @inline_ptx_multi_rw_r (%a : i32 , %b : i32 , %rw_c : f32 , %rw_d : f32 ) -> f32 {
@@ -678,6 +710,33 @@ llvm.func @inline_ptx_multi_rw_r(%a : i32, %b : i32, %rw_c : f32, %rw_d : f32)
678710 llvm.return %r5 : f32
679711}
680712
713+ // CHECK-LABEL: @inline_ptx_multi_rw_r_pred(
714+ // CHECK-SAME: %[[arg0:[a-zA-Z0-9_]+]]: i32, %[[arg1:[a-zA-Z0-9_]+]]: i32, %[[arg2:[a-zA-Z0-9_]+]]: f32, %[[arg3:[a-zA-Z0-9_]+]]: f32, %[[pred:[a-zA-Z0-9_]+]]: i1)
715+ llvm.func @inline_ptx_multi_rw_r_pred (%a : i32 , %b : i32 , %rw_c : f32 , %rw_d : f32 , %pred : i1 ) -> f32 {
716+ // CHECK: %[[S0:.+]] = llvm.inline_asm has_side_effects asm_dialect = att "@$6 {.reg .pred p; setp.ge.s32 p, $4, $5; selp.s32 $0, $4,$5, p; selp.s32 $1, $4,$5, p; selp.s32 $2, $4,$5, p; selp.s32 $3, $4,$5, p;}",
717+ // CHECK-SAME: "=f,=f,=r,=r,r,r,b,0,1"
718+ // CHECK-SAME: %[[arg2]], %[[arg3]], %[[arg0]], %[[arg1]], %[[pred]] :
719+ // CHECK-SAME: (f32, f32, i32, i32, i1) -> !llvm.struct<(f32, f32, i32, i32)>
720+ // CHECK: %[[S1:.+]] = llvm.extractvalue %[[S0]][0] : !llvm.struct<(f32, f32, i32, i32)>
721+ // CHECK: %[[S2:.+]] = llvm.extractvalue %[[S0]][1] : !llvm.struct<(f32, f32, i32, i32)>
722+ // CHECK: %[[S3:.+]] = llvm.extractvalue %[[S0]][2] : !llvm.struct<(f32, f32, i32, i32)>
723+ // CHECK: %[[S4:.+]] = llvm.extractvalue %[[S0]][3] : !llvm.struct<(f32, f32, i32, i32)>
724+ // CHECK: %[[S5:.+]] = llvm.add %[[S3]], %[[S4]] : i32
725+ // CHECK: %[[S6:.+]] = llvm.sitofp %[[S5]] : i32 to f32
726+ // CHECK: %[[S7:.+]] = llvm.fadd %[[S1]], %[[S2]] : f32
727+ // CHECK: %[[S8:.+]] = llvm.fadd %[[S6]], %[[S2]] : f32
728+ // CHECK: llvm.return %[[S8]] : f32
729+
730+ %wo0 , %wo1 = nvvm.inline_ptx " {.reg .pred p; setp.ge.s32 p, {$r0}, {$r1}; selp.s32 {$rw0}, {$r0},{$r1}, p; selp.s32 {$rw1}, {$r0},{$r1}, p; selp.s32 {$w0}, {$r0},{$r1}, p; selp.s32 {$w1}, {$r0},{$r1}, p;}"
731+ ro (%a , %b : i32 ,i32 )
732+ rw (%rw_c , %rw_d: f32 ,f32 ), predicate = %pred -> i32 ,i32
733+ %r3 = llvm.add %wo0 , %wo1 : i32
734+ %r3f = llvm.sitofp %r3 : i32 to f32
735+ %r4 = llvm.fadd %rw_c , %rw_d : f32
736+ %r5 = llvm.fadd %r3f , %rw_d : f32
737+ llvm.return %r5 : f32
738+ }
739+
681740// -----
682741
683742llvm.func @inline_ptx_pack_4i8 (%src : vector <4 xi8 >, %mask : i32 , %zero: i32 ) {
0 commit comments