@@ -659,52 +659,47 @@ gpu.module @test_module {
659659// -----
660660
661661gpu.module @test_module {
662- // CHECK-LABEL: func @gpu_shuffle()
663- func.func @gpu_shuffle () -> (f32 , f32 , f32 ) {
664- // CHECK: %[[#VALUE:]] = llvm.mlir.constant(1.000000e+00 : f32) : f32
665- %arg0 = arith.constant 1.0 : f32
666- // CHECK: %[[#OFFSET:]] = llvm.mlir.constant(4 : i32) : i32
667- %arg1 = arith.constant 4 : i32
668- // CHECK: %[[#WIDTH:]] = llvm.mlir.constant(23 : i32) : i32
669- %arg2 = arith.constant 23 : i32
662+ // CHECK-LABEL: func @gpu_shuffle
663+ // CHECK-SAME: (%[[VALUE:.*]]: f32, %[[OFFSET:.*]]: i32, %[[WIDTH:.*]]: i32)
664+ func.func @gpu_shuffle (%arg0: f32 , %arg1: i32 , %arg2: i32 ) -> (f32 , f32 , f32 ) {
670665 // CHECK: %[[#LANE_ID:]] = rocdl.mbcnt.hi
671666 // CHECK: %[[#ZERO:]] = llvm.mlir.constant(0 : i32) : i32
672- // CHECK: %[[#NEG_WIDTH:]] = llvm.sub %[[#ZERO]], %[[# WIDTH]] : i32
673- // CHECK: %[[#ADD:]] = llvm.add %[[#LANE_ID]], %[[# WIDTH]] : i32
667+ // CHECK: %[[#NEG_WIDTH:]] = llvm.sub %[[#ZERO]], %[[WIDTH]] : i32
668+ // CHECK: %[[#ADD:]] = llvm.add %[[#LANE_ID]], %[[WIDTH]] : i32
674669 // CHECK: %[[#WARP_OR_ZERO:]] = llvm.and %[[#ADD]], %[[#NEG_WIDTH]] : i32
675670 // CHECK: %[[#XOR:]] = llvm.xor %[[#LANE_ID]], %{{.*}} : i32
676671 // CHECK: %[[#CMP:]] = llvm.icmp "slt" %[[#XOR]], %[[#WARP_OR_ZERO]] : i32
677672 // CHECK: %[[#DST_LANE:]] = llvm.select %[[#CMP]], %[[#XOR]], %{{.*}} : i1, i32
678673 // CHECK: %[[#TWO:]] = llvm.mlir.constant(2 : i32) : i32
679674 // CHECK: %[[#ALIGNED_DST_LANE:]] = llvm.shl %[[#DST_LANE]], %[[#TWO]] : i32
680- // CHECK: %[[#CAST_VALUE:]] = llvm.bitcast %[[# VALUE]] : f32 to i32
675+ // CHECK: %[[#CAST_VALUE:]] = llvm.bitcast %[[VALUE]] : f32 to i32
681676 // CHECK: %[[#PERMUTE:]] = rocdl.ds_bpermute %[[#ALIGNED_DST_LANE]], %[[#CAST_VALUE]] : (i32, i32) -> i32
682677 // CHECK: %[[#CAST_SHFL_VALUE:]] = llvm.bitcast %[[#PERMUTE]] : i32 to f32
683678 %shfl , %pred = gpu.shuffle xor %arg0 , %arg1 , %arg2 : f32
684679 // CHECK: %[[#LANE_ID:]] = rocdl.mbcnt.hi
685680 // CHECK: %[[#ZERO:]] = llvm.mlir.constant(0 : i32) : i32
686- // CHECK: %[[#NEG_WIDTH:]] = llvm.sub %[[#ZERO]], %[[# WIDTH]] : i32
687- // CHECK: %[[#ADD:]] = llvm.add %[[#LANE_ID]], %[[# WIDTH]] : i32
681+ // CHECK: %[[#NEG_WIDTH:]] = llvm.sub %[[#ZERO]], %[[WIDTH]] : i32
682+ // CHECK: %[[#ADD:]] = llvm.add %[[#LANE_ID]], %[[WIDTH]] : i32
688683 // CHECK: %[[#WARP_OR_ZERO:]] = llvm.and %[[#ADD]], %[[#NEG_WIDTH]] : i32
689- // CHECK: %[[#CMP:]] = llvm.icmp "slt" %[[# OFFSET]], %[[#WARP_OR_ZERO]] : i32
690- // CHECK: %[[#DST_LANE:]] = llvm.select %[[#CMP]], %[[# OFFSET]], %{{.*}} : i1, i32
684+ // CHECK: %[[#CMP:]] = llvm.icmp "slt" %[[OFFSET]], %[[#WARP_OR_ZERO]] : i32
685+ // CHECK: %[[#DST_LANE:]] = llvm.select %[[#CMP]], %[[OFFSET]], %{{.*}} : i1, i32
691686 // CHECK: %[[#TWO:]] = llvm.mlir.constant(2 : i32) : i32
692687 // CHECK: %[[#ALIGNED_DST_LANE:]] = llvm.shl %[[#DST_LANE]], %[[#TWO]] : i32
693- // CHECK: %[[#CAST_VALUE:]] = llvm.bitcast %[[# VALUE]] : f32 to i32
688+ // CHECK: %[[#CAST_VALUE:]] = llvm.bitcast %[[VALUE]] : f32 to i32
694689 // CHECK: %[[#PERMUTE:]] = rocdl.ds_bpermute %[[#ALIGNED_DST_LANE]], %[[#CAST_VALUE]] : (i32, i32) -> i32
695690 // CHECK: %[[#CAST_SHFL_VALUE:]] = llvm.bitcast %[[#PERMUTE]] : i32 to f32
696691 %shfli , %predi = gpu.shuffle idx %arg0 , %arg1 , %arg2 : f32
697692 // CHECK: %[[#LANE_ID:]] = rocdl.mbcnt.hi
698693 // CHECK: %[[#ZERO:]] = llvm.mlir.constant(0 : i32) : i32
699- // CHECK: %[[#NEG_WIDTH:]] = llvm.sub %[[#ZERO]], %[[# WIDTH]] : i32
700- // CHECK: %[[#ADD:]] = llvm.add %[[#LANE_ID]], %[[# WIDTH]] : i32
694+ // CHECK: %[[#NEG_WIDTH:]] = llvm.sub %[[#ZERO]], %[[WIDTH]] : i32
695+ // CHECK: %[[#ADD:]] = llvm.add %[[#LANE_ID]], %[[WIDTH]] : i32
701696 // CHECK: %[[#WARP_OR_ZERO:]] = llvm.and %[[#ADD]], %[[#NEG_WIDTH]] : i32
702697 // CHECK: %[[#DOWN:]] = llvm.add %[[#LANE_ID]], %{{.*}} : i32
703698 // CHECK: %[[#CMP:]] = llvm.icmp "slt" %[[#DOWN]], %[[#WARP_OR_ZERO]] : i32
704699 // CHECK: %[[#DST_LANE:]] = llvm.select %[[#CMP]], %[[#DOWN]], %{{.*}} : i1, i32
705700 // CHECK: %[[#TWO:]] = llvm.mlir.constant(2 : i32) : i32
706701 // CHECK: %[[#ALIGNED_DST_LANE:]] = llvm.shl %[[#DST_LANE]], %[[#TWO]] : i32
707- // CHECK: %[[#CAST_VALUE:]] = llvm.bitcast %[[# VALUE]] : f32 to i32
702+ // CHECK: %[[#CAST_VALUE:]] = llvm.bitcast %[[VALUE]] : f32 to i32
708703 // CHECK: %[[#PERMUTE:]] = rocdl.ds_bpermute %[[#ALIGNED_DST_LANE]], %[[#CAST_VALUE]] : (i32, i32) -> i32
709704 // CHECK: %[[#CAST_SHFL_VALUE:]] = llvm.bitcast %[[#PERMUTE]] : i32 to f32
710705 %shfld , %predd = gpu.shuffle down %arg0 , %arg1 , %arg2 : f32
@@ -731,6 +726,18 @@ gpu.module @test_module {
731726 %shfl , %pred = gpu.shuffle xor %arg0 , %arg1 , %arg2 : vector <4 xf16 >
732727 func.return %shfl : vector <4 xf16 >
733728 }
729+
730+ // CHECK-LABEL: func @gpu_shuffle_swizzle
731+ // CHECK-SAME: (%[[ARG:.*]]: i32)
732+ func.func @gpu_shuffle_swizzle (%arg0: i32 ) -> i32 {
733+ // CHECK: %[[MASK:.*]] = llvm.mlir.constant(4127 : i32) : i32
734+ // CHECK: %[[RES:.*]] = rocdl.ds_swizzle %[[ARG]], %[[MASK]] : (i32, i32) -> i32
735+ // CHECK: llvm.return %[[RES]] : i32
736+ %width = arith.constant 64 : i32
737+ %offset = arith.constant 4 : i32
738+ %shfl , %pred = gpu.shuffle xor %arg0 , %offset , %width : i32
739+ func.return %shfl : i32
740+ }
734741}
735742
736743// -----
0 commit comments