brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · 9abef00 Raw
176 lines · plain
1// Test lowering of standalone omp.canonical_loop2// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s3 4// CHECK-LABEL: define void @anon_loop(5// CHECK-SAME:    ptr %[[ptr:.+]],6// CHECK-SAME:    i32 %[[tc:.+]]) {7// CHECK-NEXT:    br label %omp_omp.loop.preheader8// CHECK-EMPTY:9// CHECK-NEXT:  omp_omp.loop.preheader:10// CHECK-NEXT:    br label %omp_omp.loop.header11// CHECK-EMPTY:12// CHECK-NEXT:  omp_omp.loop.header:13// CHECK-NEXT:    %omp_omp.loop.iv = phi i32 [ 0, %omp_omp.loop.preheader ], [ %omp_omp.loop.next, %omp_omp.loop.inc ]14// CHECK-NEXT:    br label %omp_omp.loop.cond15// CHECK-EMPTY:16// CHECK-NEXT:  omp_omp.loop.cond:17// CHECK-NEXT:    %omp_omp.loop.cmp = icmp ult i32 %omp_omp.loop.iv, %[[tc]]18// CHECK-NEXT:    br i1 %omp_omp.loop.cmp, label %omp_omp.loop.body, label %omp_omp.loop.exit19// CHECK-EMPTY:20// CHECK-NEXT:  omp_omp.loop.body:21// CHECK-NEXT:    br label %omp.loop.region22// CHECK-EMPTY:23// CHECK-NEXT:  omp.loop.region:24// CHECK-NEXT:    store float 4.200000e+01, ptr %[[ptr]], align 425// CHECK-NEXT:    br label %omp.region.cont26// CHECK-EMPTY:27// CHECK-NEXT:  omp.region.cont:28// CHECK-NEXT:    br label %omp_omp.loop.inc29// CHECK-EMPTY:30// CHECK-NEXT:  omp_omp.loop.inc:31// CHECK-NEXT:    %omp_omp.loop.next = add nuw i32 %omp_omp.loop.iv, 132// CHECK-NEXT:    br label %omp_omp.loop.header33// CHECK-EMPTY:34// CHECK-NEXT:  omp_omp.loop.exit:35// CHECK-NEXT:    br label %omp_omp.loop.after36// CHECK-EMPTY:37// CHECK-NEXT:  omp_omp.loop.after:38// CHECK-NEXT:    ret void39// CHECK-NEXT:  }40llvm.func @anon_loop(%ptr: !llvm.ptr, %tc : i32) -> () {41  omp.canonical_loop %iv : i32 in range(%tc) {42    %val = llvm.mlir.constant(42.0 : f32) : f3243    llvm.store %val, %ptr : f32, !llvm.ptr44    omp.terminator45  }46  llvm.return47}48 49 50 51// CHECK-LABEL: define void @trivial_loop(52// CHECK-SAME:    ptr %[[ptr:.+]],53// CHECK-SAME:    i32 %[[tc:.+]]) {54// CHECK-NEXT:    br label %omp_omp.loop.preheader55// CHECK-EMPTY:56// CHECK-NEXT:  omp_omp.loop.preheader:57// CHECK-NEXT:    br label %omp_omp.loop.header58// CHECK-EMPTY:59// CHECK-NEXT:  omp_omp.loop.header:60// CHECK-NEXT:    %omp_omp.loop.iv = phi i32 [ 0, %omp_omp.loop.preheader ], [ %omp_omp.loop.next, %omp_omp.loop.inc ]61// CHECK-NEXT:    br label %omp_omp.loop.cond62// CHECK-EMPTY:63// CHECK-NEXT:  omp_omp.loop.cond:64// CHECK-NEXT:    %omp_omp.loop.cmp = icmp ult i32 %omp_omp.loop.iv, %[[tc]]65// CHECK-NEXT:    br i1 %omp_omp.loop.cmp, label %omp_omp.loop.body, label %omp_omp.loop.exit66// CHECK-EMPTY:67// CHECK-NEXT:  omp_omp.loop.body:68// CHECK-NEXT:    br label %omp.loop.region69// CHECK-EMPTY:70// CHECK-NEXT:  omp.loop.region:71// CHECK-NEXT:    store float 4.200000e+01, ptr %[[ptr]], align 472// CHECK-NEXT:    br label %omp.region.cont73// CHECK-EMPTY:74// CHECK-NEXT:  omp.region.cont:75// CHECK-NEXT:    br label %omp_omp.loop.inc76// CHECK-EMPTY:77// CHECK-NEXT:  omp_omp.loop.inc:78// CHECK-NEXT:    %omp_omp.loop.next = add nuw i32 %omp_omp.loop.iv, 179// CHECK-NEXT:    br label %omp_omp.loop.header80// CHECK-EMPTY:81// CHECK-NEXT:  omp_omp.loop.exit:82// CHECK-NEXT:    br label %omp_omp.loop.after83// CHECK-EMPTY:84// CHECK-NEXT:  omp_omp.loop.after:85// CHECK-NEXT:    ret void86// CHECK-NEXT:  }87llvm.func @trivial_loop(%ptr: !llvm.ptr, %tc : i32) -> () {88  %cli = omp.new_cli89  omp.canonical_loop(%cli) %iv : i32 in range(%tc) {90    %val = llvm.mlir.constant(42.0 : f32) : f3291    llvm.store %val, %ptr : f32, !llvm.ptr92    omp.terminator93  }94  llvm.return95}96 97 98// CHECK-LABEL: define void @nested_loop(99// CHECK-SAME:    ptr %[[ptr:.+]], i32 %[[outer_tc:.+]], i32 %[[inner_tc:.+]]) {100// CHECK-NEXT:  br label %omp_omp.loop.preheader101// CHECK-EMPTY:102// CHECK-NEXT: omp_omp.loop.preheader:103// CHECK-NEXT:  br label %omp_omp.loop.header104// CHECK-EMPTY:105// CHECK-NEXT: omp_omp.loop.header:106// CHECK-NEXT:  %omp_omp.loop.iv = phi i32 [ 0, %omp_omp.loop.preheader ], [ %omp_omp.loop.next, %omp_omp.loop.inc ]107// CHECK-NEXT:  br label %omp_omp.loop.cond108// CHECK-EMPTY:109// CHECK-NEXT: omp_omp.loop.cond:110// CHECK-NEXT:  %omp_omp.loop.cmp = icmp ult i32 %omp_omp.loop.iv, %[[outer_tc]]111// CHECK-NEXT:  br i1 %omp_omp.loop.cmp, label %omp_omp.loop.body, label %omp_omp.loop.exit112// CHECK-EMPTY:113// CHECK-NEXT: omp_omp.loop.body:114// CHECK-NEXT:  br label %omp.loop.region115// CHECK-EMPTY:116// CHECK-NEXT: omp.loop.region:117// CHECK-NEXT:  br label %omp_omp.loop.preheader1118// CHECK-EMPTY:119// CHECK-NEXT: omp_omp.loop.preheader1:120// CHECK-NEXT:  br label %omp_omp.loop.header2121// CHECK-EMPTY:122// CHECK-NEXT: omp_omp.loop.header2:123// CHECK-NEXT:  %omp_omp.loop.iv8 = phi i32 [ 0, %omp_omp.loop.preheader1 ], [ %omp_omp.loop.next10, %omp_omp.loop.inc5 ]124// CHECK-NEXT:  br label %omp_omp.loop.cond3125// CHECK-EMPTY:126// CHECK-NEXT: omp_omp.loop.cond3:127// CHECK-NEXT:  %omp_omp.loop.cmp9 = icmp ult i32 %omp_omp.loop.iv8, %[[inner_tc]]128// CHECK-NEXT:  br i1 %omp_omp.loop.cmp9, label %omp_omp.loop.body4, label %omp_omp.loop.exit6129// CHECK-EMPTY:130// CHECK-NEXT: omp_omp.loop.body4:131// CHECK-NEXT:  br label %omp.loop.region12132// CHECK-EMPTY:133// CHECK-NEXT: omp.loop.region12:134// CHECK-NEXT:  store float 4.200000e+01, ptr %[[ptr]], align 4135// CHECK-NEXT:  br label %omp.region.cont11136// CHECK-EMPTY:137// CHECK-NEXT: omp.region.cont11:138// CHECK-NEXT:  br label %omp_omp.loop.inc5139// CHECK-EMPTY:140// CHECK-NEXT: omp_omp.loop.inc5:141// CHECK-NEXT:  %omp_omp.loop.next10 = add nuw i32 %omp_omp.loop.iv8, 1142// CHECK-NEXT:  br label %omp_omp.loop.header2143// CHECK-EMPTY:144// CHECK-NEXT: omp_omp.loop.exit6:145// CHECK-NEXT:  br label %omp_omp.loop.after7146// CHECK-EMPTY:147// CHECK-NEXT: omp_omp.loop.after7:148// CHECK-NEXT:  br label %omp.region.cont149// CHECK-EMPTY:150// CHECK-NEXT: omp.region.cont:151// CHECK-NEXT:  br label %omp_omp.loop.inc152// CHECK-EMPTY:153// CHECK-NEXT: omp_omp.loop.inc:154// CHECK-NEXT:  %omp_omp.loop.next = add nuw i32 %omp_omp.loop.iv, 1155// CHECK-NEXT:  br label %omp_omp.loop.header156// CHECK-EMPTY:157// CHECK-NEXT: omp_omp.loop.exit:158// CHECK-NEXT:  br label %omp_omp.loop.after159// CHECK-EMPTY:160// CHECK-NEXT: omp_omp.loop.after:161// CHECK-NEXT:  ret void162// CHECK-NEXT: }163llvm.func @nested_loop(%ptr: !llvm.ptr, %outer_tc : i32, %inner_tc : i32) -> () {164  %outer_cli = omp.new_cli165  %inner_cli = omp.new_cli166  omp.canonical_loop(%outer_cli) %outer_iv : i32 in range(%outer_tc) {167    omp.canonical_loop(%inner_cli) %inner_iv : i32 in range(%inner_tc) {168      %val = llvm.mlir.constant(42.0 : f32) : f32169      llvm.store %val, %ptr : f32, !llvm.ptr170      omp.terminator171    }172    omp.terminator173  }174  llvm.return175}176