185 lines · plain
1// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s --enable-var-scope2 3 4llvm.func @tile_2d_loop(%baseptr: !llvm.ptr, %tc1: i32, %tc2: i32, %ts1: i32, %ts2: i32) -> () {5 %literal_outer = omp.new_cli6 %literal_inner = omp.new_cli7 omp.canonical_loop(%literal_outer) %iv1 : i32 in range(%tc1) {8 omp.canonical_loop(%literal_inner) %iv2 : i32 in range(%tc2) {9 %idx = llvm.add %iv1, %iv2 : i3210 %ptr = llvm.getelementptr inbounds %baseptr[%idx] : (!llvm.ptr, i32) -> !llvm.ptr, f3211 %val = llvm.mlir.constant(42.0 : f32) : f3212 llvm.store %val, %ptr : f32, !llvm.ptr13 omp.terminator14 }15 omp.terminator16 }17 omp.tile <- (%literal_outer, %literal_inner) sizes(%ts1, %ts2 : i32,i32)18 llvm.return19}20 21 22// CHECK-LABEL: define void @tile_2d_loop(23// CHECK-SAME: ptr %[[TMP0:.+]], i32 %[[TMP1:.+]], i32 %[[TMP2:.+]], i32 %[[TMP3:.+]], i32 %[[TMP4:.+]]) {24// CHECK-NEXT: br label %[[OMP_OMP_LOOP_PREHEADER:.+]]25// CHECK-EMPTY:26// CHECK-NEXT: [[OMP_OMP_LOOP_PREHEADER]]:27// CHECK-NEXT: %[[TMP6:.+]] = udiv i32 %[[TMP1:.+]], %[[TMP3:.+]]28// CHECK-NEXT: %[[TMP7:.+]] = urem i32 %[[TMP1:.+]], %[[TMP3:.+]]29// CHECK-NEXT: %[[TMP8:.+]] = icmp ne i32 %[[TMP7:.+]], 030// CHECK-NEXT: %[[TMP9:.+]] = zext i1 %[[TMP8:.+]] to i3231// CHECK-NEXT: %[[OMP_FLOOR0_TRIPCOUNT:.+]] = add nuw i32 %[[TMP6:.+]], %[[TMP9:.+]]32// CHECK-NEXT: %[[TMP10:.+]] = udiv i32 %[[TMP2:.+]], %[[TMP4:.+]]33// CHECK-NEXT: %[[TMP11:.+]] = urem i32 %[[TMP2:.+]], %[[TMP4:.+]]34// CHECK-NEXT: %[[TMP12:.+]] = icmp ne i32 %[[TMP11:.+]], 035// CHECK-NEXT: %[[TMP13:.+]] = zext i1 %[[TMP12:.+]] to i3236// CHECK-NEXT: %[[OMP_FLOOR1_TRIPCOUNT:.+]] = add nuw i32 %[[TMP10:.+]], %[[TMP13:.+]]37// CHECK-NEXT: br label %[[OMP_FLOOR0_PREHEADER:.+]]38// CHECK-EMPTY:39// CHECK-NEXT: [[OMP_OMP_LOOP_HEADER:.+]]:40// CHECK-NEXT: %[[OMP_OMP_LOOP_IV:.+]] = phi i32 [ %[[OMP_OMP_LOOP_NEXT:.+]], %[[OMP_OMP_LOOP_INC:.+]] ]41// CHECK-NEXT: br label %[[OMP_OMP_LOOP_COND:.+]]42// CHECK-EMPTY:43// CHECK-NEXT: [[OMP_OMP_LOOP_COND]]:44// CHECK-NEXT: %[[OMP_OMP_LOOP_CMP:.+]] = icmp ult i32 %[[TMP19:.+]], %[[TMP1:.+]]45// CHECK-NEXT: br i1 %[[OMP_OMP_LOOP_CMP:.+]], label %[[OMP_OMP_LOOP_BODY:.+]], label %[[OMP_OMP_LOOP_EXIT:.+]]46// CHECK-EMPTY:47// CHECK-NEXT: [[OMP_OMP_LOOP_BODY]]:48// CHECK-NEXT: br label %[[OMP_LOOP_REGION:.+]]49// CHECK-EMPTY:50// CHECK-NEXT: [[OMP_LOOP_REGION]]:51// CHECK-NEXT: br label %[[OMP_OMP_LOOP_PREHEADER1:.+]]52// CHECK-EMPTY:53// CHECK-NEXT: [[OMP_OMP_LOOP_PREHEADER1]]:54// CHECK-NEXT: br label %[[OMP_OMP_LOOP_BODY4:.+]]55// CHECK-EMPTY:56// CHECK-NEXT: [[OMP_FLOOR0_PREHEADER]]:57// CHECK-NEXT: br label %[[OMP_FLOOR0_HEADER:.+]]58// CHECK-EMPTY:59// CHECK-NEXT: [[OMP_FLOOR0_HEADER]]:60// CHECK-NEXT: %[[OMP_FLOOR0_IV:.+]] = phi i32 [ 0, %[[OMP_FLOOR0_PREHEADER:.+]] ], [ %[[OMP_FLOOR0_NEXT:.+]], %[[OMP_FLOOR0_INC:.+]] ]61// CHECK-NEXT: br label %[[OMP_FLOOR0_COND:.+]]62// CHECK-EMPTY:63// CHECK-NEXT: [[OMP_FLOOR0_COND]]:64// CHECK-NEXT: %[[OMP_FLOOR0_CMP:.+]] = icmp ult i32 %[[OMP_FLOOR0_IV:.+]], %[[OMP_FLOOR0_TRIPCOUNT:.+]]65// CHECK-NEXT: br i1 %[[OMP_FLOOR0_CMP:.+]], label %[[OMP_FLOOR0_BODY:.+]], label %[[OMP_FLOOR0_EXIT:.+]]66// CHECK-EMPTY:67// CHECK-NEXT: [[OMP_FLOOR0_BODY]]:68// CHECK-NEXT: br label %[[OMP_FLOOR1_PREHEADER:.+]]69// CHECK-EMPTY:70// CHECK-NEXT: [[OMP_FLOOR1_PREHEADER]]:71// CHECK-NEXT: br label %[[OMP_FLOOR1_HEADER:.+]]72// CHECK-EMPTY:73// CHECK-NEXT: [[OMP_FLOOR1_HEADER]]:74// CHECK-NEXT: %[[OMP_FLOOR1_IV:.+]] = phi i32 [ 0, %[[OMP_FLOOR1_PREHEADER:.+]] ], [ %[[OMP_FLOOR1_NEXT:.+]], %[[OMP_FLOOR1_INC:.+]] ]75// CHECK-NEXT: br label %[[OMP_FLOOR1_COND:.+]]76// CHECK-EMPTY:77// CHECK-NEXT: [[OMP_FLOOR1_COND]]:78// CHECK-NEXT: %[[OMP_FLOOR1_CMP:.+]] = icmp ult i32 %[[OMP_FLOOR1_IV:.+]], %[[OMP_FLOOR1_TRIPCOUNT:.+]]79// CHECK-NEXT: br i1 %[[OMP_FLOOR1_CMP:.+]], label %[[OMP_FLOOR1_BODY:.+]], label %[[OMP_FLOOR1_EXIT:.+]]80// CHECK-EMPTY:81// CHECK-NEXT: [[OMP_FLOOR1_BODY]]:82// CHECK-NEXT: %[[TMP14:.+]] = icmp eq i32 %[[OMP_FLOOR0_IV:.+]], %[[TMP6:.+]]83// CHECK-NEXT: %[[TMP15:.+]] = select i1 %[[TMP14:.+]], i32 %[[TMP7:.+]], i32 %[[TMP3:.+]]84// CHECK-NEXT: %[[TMP16:.+]] = icmp eq i32 %[[OMP_FLOOR1_IV:.+]], %[[TMP10:.+]]85// CHECK-NEXT: %[[TMP17:.+]] = select i1 %[[TMP16:.+]], i32 %[[TMP11:.+]], i32 %[[TMP4:.+]]86// CHECK-NEXT: br label %[[OMP_TILE0_PREHEADER:.+]]87// CHECK-EMPTY:88// CHECK-NEXT: [[OMP_TILE0_PREHEADER]]:89// CHECK-NEXT: br label %[[OMP_TILE0_HEADER:.+]]90// CHECK-EMPTY:91// CHECK-NEXT: [[OMP_TILE0_HEADER]]:92// CHECK-NEXT: %[[OMP_TILE0_IV:.+]] = phi i32 [ 0, %[[OMP_TILE0_PREHEADER:.+]] ], [ %[[OMP_TILE0_NEXT:.+]], %[[OMP_TILE0_INC:.+]] ]93// CHECK-NEXT: br label %[[OMP_TILE0_COND:.+]]94// CHECK-EMPTY:95// CHECK-NEXT: [[OMP_TILE0_COND]]:96// CHECK-NEXT: %[[OMP_TILE0_CMP:.+]] = icmp ult i32 %[[OMP_TILE0_IV:.+]], %[[TMP15:.+]]97// CHECK-NEXT: br i1 %[[OMP_TILE0_CMP:.+]], label %[[OMP_TILE0_BODY:.+]], label %[[OMP_TILE0_EXIT:.+]]98// CHECK-EMPTY:99// CHECK-NEXT: [[OMP_TILE0_BODY]]:100// CHECK-NEXT: br label %[[OMP_TILE1_PREHEADER:.+]]101// CHECK-EMPTY:102// CHECK-NEXT: [[OMP_TILE1_PREHEADER]]:103// CHECK-NEXT: br label %[[OMP_TILE1_HEADER:.+]]104// CHECK-EMPTY:105// CHECK-NEXT: [[OMP_TILE1_HEADER]]:106// CHECK-NEXT: %[[OMP_TILE1_IV:.+]] = phi i32 [ 0, %[[OMP_TILE1_PREHEADER:.+]] ], [ %[[OMP_TILE1_NEXT:.+]], %[[OMP_TILE1_INC:.+]] ]107// CHECK-NEXT: br label %[[OMP_TILE1_COND:.+]]108// CHECK-EMPTY:109// CHECK-NEXT: [[OMP_TILE1_COND]]:110// CHECK-NEXT: %[[OMP_TILE1_CMP:.+]] = icmp ult i32 %[[OMP_TILE1_IV:.+]], %[[TMP17:.+]]111// CHECK-NEXT: br i1 %[[OMP_TILE1_CMP:.+]], label %[[OMP_TILE1_BODY:.+]], label %[[OMP_TILE1_EXIT:.+]]112// CHECK-EMPTY:113// CHECK-NEXT: [[OMP_TILE1_BODY]]:114// CHECK-NEXT: %[[TMP18:.+]] = mul nuw i32 %[[TMP3:.+]], %[[OMP_FLOOR0_IV:.+]]115// CHECK-NEXT: %[[TMP19:.+]] = add nuw i32 %[[TMP18:.+]], %[[OMP_TILE0_IV:.+]]116// CHECK-NEXT: %[[TMP20:.+]] = mul nuw i32 %[[TMP4:.+]], %[[OMP_FLOOR1_IV:.+]]117// CHECK-NEXT: %[[TMP21:.+]] = add nuw i32 %[[TMP20:.+]], %[[OMP_TILE1_IV:.+]]118// CHECK-NEXT: br label %[[OMP_OMP_LOOP_BODY:.+]]119// CHECK-EMPTY:120// CHECK-NEXT: [[OMP_OMP_LOOP_BODY4]]:121// CHECK-NEXT: br label %[[OMP_LOOP_REGION12:.+]]122// CHECK-EMPTY:123// CHECK-NEXT: [[OMP_LOOP_REGION12]]:124// CHECK-NEXT: %[[TMP22:.+]] = add i32 %[[TMP19:.+]], %[[TMP21:.+]]125// CHECK-NEXT: %[[TMP23:.+]] = getelementptr inbounds float, ptr %[[TMP0:.+]], i32 %[[TMP22:.+]]126// CHECK-NEXT: store float 4.200000e+01, ptr %[[TMP23:.+]], align 4127// CHECK-NEXT: br label %[[OMP_REGION_CONT11:.+]]128// CHECK-EMPTY:129// CHECK-NEXT: [[OMP_REGION_CONT11]]:130// CHECK-NEXT: br label %[[OMP_TILE1_INC:.+]]131// CHECK-EMPTY:132// CHECK-NEXT: [[OMP_TILE1_INC]]:133// CHECK-NEXT: %[[OMP_TILE1_NEXT:.+]] = add nuw i32 %[[OMP_TILE1_IV:.+]], 1134// CHECK-NEXT: br label %[[OMP_TILE1_HEADER:.+]]135// CHECK-EMPTY:136// CHECK-NEXT: [[OMP_TILE1_EXIT]]:137// CHECK-NEXT: br label %[[OMP_TILE1_AFTER:.+]]138// CHECK-EMPTY:139// CHECK-NEXT: [[OMP_TILE1_AFTER]]:140// CHECK-NEXT: br label %[[OMP_TILE0_INC:.+]]141// CHECK-EMPTY:142// CHECK-NEXT: [[OMP_TILE0_INC]]:143// CHECK-NEXT: %[[OMP_TILE0_NEXT:.+]] = add nuw i32 %[[OMP_TILE0_IV:.+]], 1144// CHECK-NEXT: br label %[[OMP_TILE0_HEADER:.+]]145// CHECK-EMPTY:146// CHECK-NEXT: [[OMP_TILE0_EXIT]]:147// CHECK-NEXT: br label %[[OMP_TILE0_AFTER:.+]]148// CHECK-EMPTY:149// CHECK-NEXT: [[OMP_TILE0_AFTER]]:150// CHECK-NEXT: br label %[[OMP_FLOOR1_INC:.+]]151// CHECK-EMPTY:152// CHECK-NEXT: [[OMP_FLOOR1_INC]]:153// CHECK-NEXT: %[[OMP_FLOOR1_NEXT:.+]] = add nuw i32 %[[OMP_FLOOR1_IV:.+]], 1154// CHECK-NEXT: br label %[[OMP_FLOOR1_HEADER:.+]]155// CHECK-EMPTY:156// CHECK-NEXT: [[OMP_FLOOR1_EXIT]]:157// CHECK-NEXT: br label %[[OMP_FLOOR1_AFTER:.+]]158// CHECK-EMPTY:159// CHECK-NEXT: [[OMP_FLOOR1_AFTER]]:160// CHECK-NEXT: br label %[[OMP_FLOOR0_INC:.+]]161// CHECK-EMPTY:162// CHECK-NEXT: [[OMP_FLOOR0_INC]]:163// CHECK-NEXT: %[[OMP_FLOOR0_NEXT:.+]] = add nuw i32 %[[OMP_FLOOR0_IV:.+]], 1164// CHECK-NEXT: br label %[[OMP_FLOOR0_HEADER:.+]]165// CHECK-EMPTY:166// CHECK-NEXT: [[OMP_FLOOR0_EXIT]]:167// CHECK-NEXT: br label %[[OMP_FLOOR0_AFTER:.+]]168// CHECK-EMPTY:169// CHECK-NEXT: [[OMP_FLOOR0_AFTER]]:170// CHECK-NEXT: br label %[[OMP_OMP_LOOP_AFTER:.+]]171// CHECK-EMPTY:172// CHECK-NEXT: [[OMP_REGION_CONT:.+]]:173// CHECK-NEXT: br label %[[OMP_OMP_LOOP_INC:.+]]174// CHECK-EMPTY:175// CHECK-NEXT: [[OMP_OMP_LOOP_INC]]:176// CHECK-NEXT: %[[OMP_OMP_LOOP_NEXT:.+]] = add nuw i32 %[[TMP19:.+]], 1177// CHECK-NEXT: br label %[[OMP_OMP_LOOP_HEADER:.+]]178// CHECK-EMPTY:179// CHECK-NEXT: [[OMP_OMP_LOOP_EXIT]]:180// CHECK-NEXT: br label %[[OMP_OMP_LOOP_AFTER:.+]]181// CHECK-EMPTY:182// CHECK-NEXT: [[OMP_OMP_LOOP_AFTER]]:183// CHECK-NEXT: ret void184// CHECK-NEXT: }185