brintos

brintos / llvm-project-archived public Read only

0
0
Text · 29.1 KiB · 9f1c816 Raw
653 lines · plain
1// RUN: mlir-translate -mlir-to-cpp %s | FileCheck %s -check-prefix=CPP-DEFAULT2// RUN: mlir-translate -mlir-to-cpp -declare-variables-at-top %s | FileCheck %s -check-prefix=CPP-DECLTOP3 4// CPP-DEFAULT:      bool single_expression(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {5// CPP-DEFAULT-NEXT: return [[VAL_1]] * 42 - [[VAL_2]] < [[VAL_3]];6// CPP-DEFAULT-NEXT: }7 8// CPP-DECLTOP:      bool single_expression(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {9// CPP-DECLTOP-NEXT: return [[VAL_1]] * 42 - [[VAL_2]] < [[VAL_3]];10// CPP-DECLTOP-NEXT: }11 12func.func @single_expression(%arg0: i32, %arg1: i32, %arg2: i32) -> i1 {13  %e = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i1 {14    %c42 = "emitc.constant"(){value = 42 : i32} : () -> i3215    %a = emitc.mul %arg0, %c42 : (i32, i32) -> i3216    %b = emitc.sub %a, %arg1 : (i32, i32) -> i3217    %c = emitc.cmp lt, %b, %arg2 :(i32, i32) -> i118    emitc.yield %c : i119  }20  return %e : i121}22 23// CPP-DEFAULT:      int32_t single_use(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]], int32_t [[VAL_4:v[0-9]+]]) {24// CPP-DEFAULT-NEXT:   bool [[VAL_5:v[0-9]+]] = bar([[VAL_1]] * M_PI, [[VAL_3]]) - [[VAL_4]] < [[VAL_2]];25// CPP-DEFAULT-NEXT:   int32_t [[VAL_6:v[0-9]+]];26// CPP-DEFAULT-NEXT:   if ([[VAL_5]]) {27// CPP-DEFAULT-NEXT:     [[VAL_6]] = [[VAL_1]];28// CPP-DEFAULT-NEXT:   } else {29// CPP-DEFAULT-NEXT:     [[VAL_6]] = [[VAL_1]];30// CPP-DEFAULT-NEXT:   }31// CPP-DEFAULT-NEXT:   int32_t [[VAL_7:v[0-9]+]] = [[VAL_6]];32// CPP-DEFAULT-NEXT:   return [[VAL_7]];33// CPP-DEFAULT-NEXT: }34 35// CPP-DECLTOP:      int32_t single_use(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]], int32_t [[VAL_4:v[0-9]+]]) {36// CPP-DECLTOP-NEXT:   bool [[VAL_5:v[0-9]+]];37// CPP-DECLTOP-NEXT:   int32_t [[VAL_6:v[0-9]+]];38// CPP-DECLTOP-NEXT:   int32_t [[VAL_7:v[0-9]+]];39// CPP-DECLTOP-NEXT:   [[VAL_5]] = bar([[VAL_1]] * M_PI, [[VAL_3]]) - [[VAL_4]] < [[VAL_2]];40// CPP-DECLTOP-NEXT:   ;41// CPP-DECLTOP-NEXT:   if ([[VAL_5]]) {42// CPP-DECLTOP-NEXT:     [[VAL_6]] = [[VAL_1]];43// CPP-DECLTOP-NEXT:   } else {44// CPP-DECLTOP-NEXT:     [[VAL_6]] = [[VAL_1]];45// CPP-DECLTOP-NEXT:   }46// CPP-DECLTOP-NEXT:   [[VAL_7]] = [[VAL_6]];47// CPP-DECLTOP-NEXT:   return [[VAL_7]];48// CPP-DECLTOP-NEXT: }49 50func.func @single_use(%arg0: i32, %arg1: i32, %arg2: i32, %arg3: i32) -> i32 {51  %p0 = emitc.literal "M_PI" : i3252  %e = emitc.expression %arg0, %arg1, %arg2, %arg3, %p0 : (i32, i32, i32, i32, i32) -> i1 {53    %a = emitc.mul %arg0, %p0 : (i32, i32) -> i3254    %b = emitc.call_opaque "bar" (%a, %arg2) : (i32, i32) -> (i32)55    %c = emitc.sub %b, %arg3 : (i32, i32) -> i3256    %d = emitc.cmp lt, %c, %arg1 :(i32, i32) -> i157    emitc.yield %d : i158  }59  %v = "emitc.variable"(){value = #emitc.opaque<"">} : () -> !emitc.lvalue<i32>60  emitc.if %e {61    emitc.assign %arg0 : i32 to %v : !emitc.lvalue<i32>62    emitc.yield63  } else {64    emitc.assign %arg0 : i32 to %v : !emitc.lvalue<i32>65    emitc.yield66  }67  %v_load = emitc.load %v : !emitc.lvalue<i32>68  return %v_load : i3269}70 71// CPP-DEFAULT: int32_t do_not_inline(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {72// CPP-DEFAULT-NEXT: int32_t [[VAL_4:v[0-9]+]] = ([[VAL_1]] + [[VAL_2]]) * [[VAL_3]];73// CPP-DEFAULT-NEXT: return [[VAL_4]];74// CPP-DEFAULT-NEXT:}75 76// CPP-DECLTOP: int32_t do_not_inline(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {77// CPP-DECLTOP-NEXT: int32_t [[VAL_4:v[0-9]+]];78// CPP-DECLTOP-NEXT: [[VAL_4]] = ([[VAL_1]] + [[VAL_2]]) * [[VAL_3]];79// CPP-DECLTOP-NEXT: return [[VAL_4]];80// CPP-DECLTOP-NEXT:}81 82func.func @do_not_inline(%arg0: i32, %arg1: i32, %arg2 : i32) -> i32 {83  %e = emitc.expression %arg0, %arg1, %arg2 noinline : (i32, i32, i32) -> i32 {84    %a = emitc.add %arg0, %arg1 : (i32, i32) -> i3285    %b = emitc.mul %a, %arg2 : (i32, i32) -> i3286    emitc.yield %b : i3287  }88  return %e : i3289}90 91// CPP-DEFAULT:      float parentheses_for_low_precedence(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {92// CPP-DEFAULT-NEXT:   return (float) (([[VAL_1]] + [[VAL_2]]) * [[VAL_3]]);93// CPP-DEFAULT-NEXT: }94 95// CPP-DECLTOP:      float parentheses_for_low_precedence(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {96// CPP-DECLTOP-NEXT:   return (float) (([[VAL_1]] + [[VAL_2]]) * [[VAL_3]]);97// CPP-DECLTOP-NEXT: }98 99func.func @parentheses_for_low_precedence(%arg0: i32, %arg1: i32, %arg2: i32) -> f32 {100  %e = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> f32 {101    %a = emitc.add %arg0, %arg1 : (i32, i32) -> i32102    %b = emitc.mul %a, %arg2 : (i32, i32) -> i32103    %d = emitc.cast %b : i32 to f32104    emitc.yield %d : f32105  }106  return %e : f32107}108 109// CPP-DEFAULT:      int32_t parentheses_for_same_precedence(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {110// CPP-DEFAULT-NEXT:   return [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);111// CPP-DEFAULT-NEXT: }112 113// CPP-DECLTOP:      int32_t parentheses_for_same_precedence(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {114// CPP-DECLTOP-NEXT:   return [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);115// CPP-DECLTOP-NEXT: }116func.func @parentheses_for_same_precedence(%arg0: i32, %arg1: i32, %arg2: i32) -> i32 {117  %e = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i32 {118      %0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32119      %1 = emitc.div %arg2, %0 : (i32, i32) -> i32120      emitc.yield %1 : i32121    }122 123  return %e : i32124}125 126// CPP-DEFAULT:      int32_t user_with_expression_trait(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {127// CPP-DEFAULT-NEXT:   int32_t [[VAL_4:v[0-9]+]] = 0;128// CPP-DEFAULT-NEXT:   int32_t [[EXP_0:v[0-9]+]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);129// CPP-DEFAULT-NEXT:   int32_t [[EXP_1:v[0-9]+]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);130// CPP-DEFAULT-NEXT:   int32_t [[EXP_2:v[0-9]+]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);131// CPP-DEFAULT-NEXT:   int32_t [[EXP_3:v[0-9]+]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);132// CPP-DEFAULT-NEXT:   bool [[CAST:v[0-9]+]] = (bool) [[EXP_0]];133// CPP-DEFAULT-NEXT:   int32_t [[ADD:v[0-9]+]] = [[EXP_1]] + [[VAL_4]];134// CPP-DEFAULT-NEXT:   int32_t [[CALL:v[0-9]+]] = bar([[EXP_2]], [[VAL_4]]);135// CPP-DEFAULT-NEXT:   int32_t [[COND:v[0-9]+]] = [[CAST]] ? [[EXP_3]] : [[VAL_4]];136// CPP-DEFAULT-NEXT:   int32_t [[VAR:v[0-9]+]];137// CPP-DEFAULT-NEXT:   [[VAR]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);138// CPP-DEFAULT-NEXT:   return [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);139// CPP-DEFAULT-NEXT: }140 141// CPP-DECLTOP:      int32_t user_with_expression_trait(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {142// CPP-DECLTOP-NEXT:   int32_t [[VAL_4:v[0-9]+]];143// CPP-DECLTOP-NEXT:   int32_t [[EXP_0:v[0-9]+]];144// CPP-DECLTOP-NEXT:   int32_t [[EXP_1:v[0-9]+]];145// CPP-DECLTOP-NEXT:   int32_t [[EXP_2:v[0-9]+]];146// CPP-DECLTOP-NEXT:   int32_t [[EXP_3:v[0-9]+]];147// CPP-DECLTOP-NEXT:   bool [[CAST:v[0-9]+]];148// CPP-DECLTOP-NEXT:   int32_t [[ADD:v[0-9]+]];149// CPP-DECLTOP-NEXT:   int32_t [[CALL:v[0-9]+]];150// CPP-DECLTOP-NEXT:   int32_t [[COND:v[0-9]+]];151// CPP-DECLTOP-NEXT:   int32_t [[VAR:v[0-9]+]];152// CPP-DECLTOP-NEXT:   [[VAL_4]] = 0;153// CPP-DECLTOP-NEXT:   [[EXP_0]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);154// CPP-DECLTOP-NEXT:   [[EXP_1]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);155// CPP-DECLTOP-NEXT:   [[EXP_2]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);156// CPP-DECLTOP-NEXT:   [[EXP_3]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);157// CPP-DECLTOP-NEXT:   [[CAST]] = (bool) [[EXP_0]];158// CPP-DECLTOP-NEXT:   [[ADD]] = [[EXP_1]] + [[VAL_4]];159// CPP-DECLTOP-NEXT:   [[CALL]] = bar([[EXP_2]], [[VAL_4]]);160// CPP-DECLTOP-NEXT:   [[COND]] = [[CAST]] ? [[EXP_3]] : [[VAL_4]];161// CPP-DECLTOP-NEXT:   ;162// CPP-DECLTOP-NEXT:   [[VAR]] = [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);163// CPP-DECLTOP-NEXT:   return [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);164// CPP-DECLTOP-NEXT: }165func.func @user_with_expression_trait(%arg0: i32, %arg1: i32, %arg2: i32) -> i32 {166  %c0 = "emitc.constant"() {value = 0 : i32} : () -> i32167  %e0 = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i32 {168      %0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32169      %1 = emitc.div %arg2, %0 : (i32, i32) -> i32170      emitc.yield %1 : i32171    }172  %e1 = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i32 {173      %0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32174      %1 = emitc.div %arg2, %0 : (i32, i32) -> i32175      emitc.yield %1 : i32176    }177  %e2 = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i32 {178      %0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32179      %1 = emitc.div %arg2, %0 : (i32, i32) -> i32180      emitc.yield %1 : i32181    }182  %e3 = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i32 {183      %0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32184      %1 = emitc.div %arg2, %0 : (i32, i32) -> i32185      emitc.yield %1 : i32186    }187  %e4 = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i32 {188      %0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32189      %1 = emitc.div %arg2, %0 : (i32, i32) -> i32190      emitc.yield %1 : i32191    }192  %e5 = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i32 {193      %0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32194      %1 = emitc.div %arg2, %0 : (i32, i32) -> i32195      emitc.yield %1 : i32196    }197  %cast = emitc.cast %e0 : i32 to i1198  %add = emitc.add %e1, %c0 : (i32, i32) -> i32199  %call = emitc.call_opaque "bar" (%e2, %c0) : (i32, i32) -> (i32)200  %cond = emitc.conditional %cast, %e3, %c0 : i32201  %var = "emitc.variable"() {value = #emitc.opaque<"">} : () -> !emitc.lvalue<i32>202  emitc.assign %e4 : i32 to %var : !emitc.lvalue<i32>203  return %e5 : i32204}205 206// CPP-DEFAULT:      int32_t multiple_uses(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]], int32_t [[VAL_4:v[0-9]+]]) {207// CPP-DEFAULT-NEXT:   bool [[VAL_5:v[0-9]+]] = bar([[VAL_1]] * [[VAL_2]], [[VAL_3]]) - [[VAL_1]] * [[VAL_2]] < [[VAL_4]];208// CPP-DEFAULT-NEXT:   int32_t [[VAL_6:v[0-9]+]];209// CPP-DEFAULT-NEXT:   if ([[VAL_5]]) {210// CPP-DEFAULT-NEXT:     [[VAL_6]] = [[VAL_1]];211// CPP-DEFAULT-NEXT:   } else {212// CPP-DEFAULT-NEXT:     [[VAL_6]] = [[VAL_1]];213// CPP-DEFAULT-NEXT:   }214// CPP-DEFAULT-NEXT:   bool [[VAL_7:v[0-9]+]];215// CPP-DEFAULT-NEXT:   [[VAL_7]] = [[VAL_5]];216// CPP-DEFAULT-NEXT:   int32_t [[VAL_8:v[0-9]+]] = [[VAL_6]];217// CPP-DEFAULT-NEXT:   return [[VAL_8]];218// CPP-DEFAULT-NEXT: }219 220// CPP-DECLTOP:      int32_t multiple_uses(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]], int32_t [[VAL_4:v[0-9]+]]) {221// CPP-DECLTOP-NEXT:   bool [[VAL_5:v[0-9]+]];222// CPP-DECLTOP-NEXT:   int32_t [[VAL_6:v[0-9]+]];223// CPP-DECLTOP-NEXT:   bool [[VAL_7:v[0-9]+]];224// CPP-DECLTOP-NEXT:   int32_t [[VAL_8:v[0-9]+]];225// CPP-DECLTOP-NEXT:   [[VAL_5]] = bar([[VAL_1]] * [[VAL_2]], [[VAL_3]]) - [[VAL_1]] * [[VAL_2]] < [[VAL_4]];226// CPP-DECLTOP-NEXT:   ;227// CPP-DECLTOP-NEXT:   if ([[VAL_5]]) {228// CPP-DECLTOP-NEXT:     [[VAL_6]] = [[VAL_1]];229// CPP-DECLTOP-NEXT:   } else {230// CPP-DECLTOP-NEXT:     [[VAL_6]] = [[VAL_1]];231// CPP-DECLTOP-NEXT:   }232// CPP-DECLTOP-NEXT:   ;233// CPP-DECLTOP-NEXT:   [[VAL_7]] = [[VAL_5]];234// CPP-DECLTOP-NEXT:   [[VAL_8]] = [[VAL_6]];235// CPP-DECLTOP-NEXT:   return [[VAL_8]];236// CPP-DECLTOP-NEXT: }237 238func.func @multiple_uses(%arg0: i32, %arg1: i32, %arg2: i32, %arg3: i32) -> i32 {239  %e = emitc.expression %arg0, %arg1, %arg2, %arg3 : (i32, i32, i32, i32) -> i1 {240    %a = emitc.mul %arg0, %arg1 : (i32, i32) -> i32241    %b = emitc.call_opaque "bar" (%a, %arg2) : (i32, i32) -> (i32)242    %c = emitc.sub %b, %a : (i32, i32) -> i32243    %d = emitc.cmp lt, %c, %arg3 :(i32, i32) -> i1244    emitc.yield %d : i1245  }246  %v = "emitc.variable"(){value = #emitc.opaque<"">} : () -> !emitc.lvalue<i32>247  emitc.if %e {248    emitc.assign %arg0 : i32 to %v : !emitc.lvalue<i32>249    emitc.yield250  } else {251    emitc.assign %arg0 : i32 to %v : !emitc.lvalue<i32>252    emitc.yield253  }254  %q = "emitc.variable"(){value = #emitc.opaque<"">} : () -> !emitc.lvalue<i1>255  emitc.assign %e : i1 to %q : !emitc.lvalue<i1>256  %v_load = emitc.load %v : !emitc.lvalue<i32>257  return %v_load : i32258}259 260// CPP-DEFAULT:      int32_t different_expressions(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]], int32_t [[VAL_4:v[0-9]+]]) {261// CPP-DEFAULT-NEXT:   int32_t [[VAL_5:v[0-9]+]] = [[VAL_3]] % [[VAL_4]];262// CPP-DEFAULT-NEXT:   int32_t [[VAL_6:v[0-9]+]] = bar([[VAL_5]], [[VAL_1]] * [[VAL_2]]);263// CPP-DEFAULT-NEXT:   int32_t [[VAL_7:v[0-9]+]];264// CPP-DEFAULT-NEXT:   if ([[VAL_6]] - [[VAL_4]] < [[VAL_2]]) {265// CPP-DEFAULT-NEXT:     [[VAL_7]] = [[VAL_1]];266// CPP-DEFAULT-NEXT:   } else {267// CPP-DEFAULT-NEXT:     [[VAL_7]] = [[VAL_1]];268// CPP-DEFAULT-NEXT:   }269// CPP-DEFAULT-NEXT:   int32_t [[VAL_8:v[0-9]+]] = [[VAL_7]];270// CPP-DEFAULT-NEXT:   return [[VAL_8]];271// CPP-DEFAULT-NEXT: }272 273// CPP-DECLTOP:      int32_t different_expressions(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]], int32_t [[VAL_4:v[0-9]+]]) {274// CPP-DECLTOP-NEXT:   int32_t [[VAL_5:v[0-9]+]];275// CPP-DECLTOP-NEXT:   int32_t [[VAL_6:v[0-9]+]];276// CPP-DECLTOP-NEXT:   int32_t [[VAL_7:v[0-9]+]];277// CPP-DECLTOP-NEXT:   int32_t [[VAL_8:v[0-9]+]];278// CPP-DECLTOP-NEXT:   [[VAL_5]] = [[VAL_3]] % [[VAL_4]];279// CPP-DECLTOP-NEXT:   [[VAL_6]] = bar([[VAL_5]], [[VAL_1]] * [[VAL_2]]);280// CPP-DECLTOP-NEXT:   ;281// CPP-DECLTOP-NEXT:   if ([[VAL_6]] - [[VAL_4]] < [[VAL_2]]) {282// CPP-DECLTOP-NEXT:     [[VAL_7]] = [[VAL_1]];283// CPP-DECLTOP-NEXT:   } else {284// CPP-DECLTOP-NEXT:     [[VAL_7]] = [[VAL_1]];285// CPP-DECLTOP-NEXT:   }286// CPP-DECLTOP-NEXT:   [[VAL_8]] = [[VAL_7]];287// CPP-DECLTOP-NEXT:   return [[VAL_8]];288// CPP-DECLTOP-NEXT: }289 290func.func @different_expressions(%arg0: i32, %arg1: i32, %arg2: i32, %arg3: i32) -> i32 {291  %e1 = emitc.expression %arg2, %arg3 : (i32, i32) -> i32 {292    %a = emitc.rem %arg2, %arg3 : (i32, i32) -> i32293    emitc.yield %a : i32294  }295  %e2 = emitc.expression %arg0, %arg1, %e1 : (i32, i32, i32) -> i32 {296    %a = emitc.mul %arg0, %arg1 : (i32, i32) -> i32297    %b = emitc.call_opaque "bar" (%e1, %a) : (i32, i32) -> (i32)298    emitc.yield %b : i32299  }300  %e3 = emitc.expression %arg1, %e2, %arg3 : (i32, i32, i32) ->  i1 {301    %c = emitc.sub %e2, %arg3 : (i32, i32) -> i32302    %d = emitc.cmp lt, %c, %arg1 :(i32, i32) -> i1303    emitc.yield %d : i1304  }305  %v = "emitc.variable"(){value = #emitc.opaque<"">} : () -> !emitc.lvalue<i32>306  emitc.if %e3 {307    emitc.assign %arg0 : i32 to %v : !emitc.lvalue<i32>308    emitc.yield309  } else {310    emitc.assign %arg0 : i32 to %v : !emitc.lvalue<i32>311    emitc.yield312  }313  %v_load = emitc.load %v : !emitc.lvalue<i32>314  return %v_load : i32315}316 317// CPP-DEFAULT:      int32_t expression_with_dereference(int32_t [[VAL_1:v[0-9]+]], int32_t* [[VAL_2]]) {318// CPP-DEFAULT-NEXT:   return *([[VAL_2]] - [[VAL_1]]);319// CPP-DEFAULT-NEXT: }320 321// CPP-DECLTOP:      int32_t expression_with_dereference(int32_t [[VAL_1:v[0-9]+]], int32_t* [[VAL_2]]) {322// CPP-DECLTOP-NEXT:   return *([[VAL_2]] - [[VAL_1]]);323// CPP-DECLTOP-NEXT: }324emitc.func @expression_with_dereference(%arg1: i32, %arg2: !emitc.ptr<i32>) -> i32 {325  %c = emitc.expression %arg1, %arg2 : (i32, !emitc.ptr<i32>) -> i32 {326    %e = emitc.sub %arg2, %arg1 : (!emitc.ptr<i32>, i32) -> !emitc.ptr<i32>327    %d = emitc.apply "*"(%e) : (!emitc.ptr<i32>) -> i32328    emitc.yield %d : i32329  }330  return %c : i32331}332 333// CPP-DEFAULT:      bool expression_with_address_taken(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t* [[VAL_3]]) {334// CPP-DEFAULT-NEXT:   int32_t [[VAL_4:v[0-9]+]] = 42;335// CPP-DEFAULT-NEXT:   return &[[VAL_4]] - [[VAL_2]] < [[VAL_3]];336// CPP-DEFAULT-NEXT: }337 338// CPP-DECLTOP:      bool expression_with_address_taken(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t* [[VAL_3]]) {339// CPP-DECLTOP-NEXT:   int32_t [[VAL_4:v[0-9]+]];340// CPP-DECLTOP-NEXT:   [[VAL_4]] = 42;341// CPP-DECLTOP-NEXT:   return &[[VAL_4]] - [[VAL_2]] < [[VAL_3]];342// CPP-DECLTOP-NEXT: }343 344func.func @expression_with_address_taken(%arg0: i32, %arg1: i32, %arg2: !emitc.ptr<i32>) -> i1 {345  %a = "emitc.variable"(){value = 42 : i32} : () -> !emitc.lvalue<i32>346  %c = emitc.expression %arg1, %arg2, %a : (i32, !emitc.ptr<i32>, !emitc.lvalue<i32>) -> i1 {347    %d = emitc.apply "&"(%a) : (!emitc.lvalue<i32>) -> !emitc.ptr<i32>348    %e = emitc.sub %d, %arg1 : (!emitc.ptr<i32>, i32) -> !emitc.ptr<i32>349    %f = emitc.cmp lt, %e, %arg2 : (!emitc.ptr<i32>, !emitc.ptr<i32>) -> i1350    emitc.yield %f : i1351  }352  return %c : i1353}354 355// CPP-DEFAULT: int32_t expression_with_subscript_user(void* [[VAL_1:v.+]])356// CPP-DEFAULT-NEXT:   int64_t [[VAL_2:v.+]] = 0;357// CPP-DEFAULT-NEXT:   int32_t* [[VAL_3:v.+]] = (int32_t*) [[VAL_1]];358// CPP-DEFAULT-NEXT:   int32_t [[VAL_4:v.+]] = [[VAL_3]][[[VAL_2]]];359// CPP-DEFAULT-NEXT:   return [[VAL_4]];360 361// CPP-DECLTOP: int32_t expression_with_subscript_user(void* [[VAL_1:v.+]])362// CPP-DECLTOP-NEXT:   int64_t [[VAL_2:v.+]];363// CPP-DECLTOP-NEXT:   int32_t* [[VAL_3:v.+]];364// CPP-DECLTOP-NEXT:   int32_t [[VAL_4:v.+]];365// CPP-DECLTOP-NEXT:   [[VAL_2]] = 0;366// CPP-DECLTOP-NEXT:   [[VAL_3]] = (int32_t*) [[VAL_1]];367// CPP-DECLTOP-NEXT:   [[VAL_4]] = [[VAL_3]][[[VAL_2]]];368// CPP-DECLTOP-NEXT:   return [[VAL_4]];369 370func.func @expression_with_subscript_user(%arg0: !emitc.ptr<!emitc.opaque<"void">>) -> i32 {371  %c0 = "emitc.constant"() {value = 0 : i64} : () -> i64372  %0 = emitc.expression %arg0 : (!emitc.ptr<!emitc.opaque<"void">>) -> !emitc.ptr<i32> {373    %0 = emitc.cast %arg0 : !emitc.ptr<!emitc.opaque<"void">> to !emitc.ptr<i32>374    emitc.yield %0 : !emitc.ptr<i32>375  }376  %res = emitc.subscript %0[%c0] : (!emitc.ptr<i32>, i64) -> !emitc.lvalue<i32>377  %res_load = emitc.load %res : !emitc.lvalue<i32>378  return %res_load : i32379}380 381// CPP-DEFAULT: bool expression_with_load(int32_t [[VAL_1:v.+]], int32_t [[VAL_2:v.+]], int32_t* [[VAL_3:v.+]]) {382// CPP-DEFAULT-NEXT:   int64_t [[VAL_4:v.+]] = 0;383// CPP-DEFAULT-NEXT:   int32_t [[VAL_5:v.+]] = 42;384// CPP-DEFAULT-NEXT:   return [[VAL_5]] + [[VAL_2]] < [[VAL_3]][[[VAL_4]]] + [[VAL_1]];385 386// CPP-DECLTOP: bool expression_with_load(int32_t [[VAL_1:v.+]], int32_t [[VAL_2:v.+]], int32_t* [[VAL_3:v.+]]) {387// CPP-DECLTOP-NEXT:   int64_t [[VAL_4:v.+]];388// CPP-DECLTOP-NEXT:   int32_t [[VAL_5:v.+]];389// CPP-DECLTOP-NEXT:   [[VAL_4]] = 0;390// CPP-DECLTOP-NEXT:   [[VAL_5]] = 42;391// CPP-DECLTOP-NEXT:   return [[VAL_5]] + [[VAL_2]] < [[VAL_3]][[[VAL_4]]] + [[VAL_1]];392 393emitc.func @expression_with_load(%arg0: i32, %arg1: i32, %arg2: !emitc.ptr<i32>) -> i1 {394  %c0 = "emitc.constant"() {value = 0 : i64} : () -> i64395  %0 = "emitc.variable"() <{value = #emitc.opaque<"42">}> : () -> !emitc.lvalue<i32>396  %ptr = emitc.subscript %arg2[%c0] : (!emitc.ptr<i32>, i64) -> !emitc.lvalue<i32>397  %result = emitc.expression %arg0, %arg1, %0, %ptr : (i32, i32, !emitc.lvalue<i32>, !emitc.lvalue<i32>) -> i1 {398    %a = emitc.load %0 : !emitc.lvalue<i32>399    %b = emitc.add %a, %arg1 : (i32, i32) -> i32400    %c = emitc.load %ptr : !emitc.lvalue<i32>401    %d = emitc.add %c, %arg0 : (i32, i32) -> i32402    %e = emitc.cmp lt, %b, %d :(i32, i32) -> i1403    yield %e : i1404  }405  emitc.return %result : i1406}407 408// CPP-DEFAULT: bool expression_with_load_and_call(int32_t* [[VAL_1:v.+]]) {409// CPP-DEFAULT-NEXT:   int64_t [[VAL_2:v.+]] = 0;410// CPP-DEFAULT-NEXT:   return [[VAL_1]][[[VAL_2]]] + bar([[VAL_1]][[[VAL_2]]]) < [[VAL_1]][[[VAL_2]]];411 412// CPP-DECLTOP: bool expression_with_load_and_call(int32_t* [[VAL_1:v.+]]) {413// CPP-DECLTOP-NEXT:   int64_t [[VAL_2:v.+]];414// CPP-DECLTOP-NEXT:   [[VAL_2]] = 0;415// CPP-DECLTOP-NEXT:   return [[VAL_1]][[[VAL_2]]] + bar([[VAL_1]][[[VAL_2]]]) < [[VAL_1]][[[VAL_2]]];416 417emitc.func @expression_with_load_and_call(%arg0: !emitc.ptr<i32>) -> i1 {418  %c0 = "emitc.constant"() {value = 0 : i64} : () -> i64419  %ptr = emitc.subscript %arg0[%c0] : (!emitc.ptr<i32>, i64) -> !emitc.lvalue<i32>420  %result = emitc.expression %ptr : (!emitc.lvalue<i32>) -> i1 {421    %a = emitc.load %ptr : !emitc.lvalue<i32>422    %b = emitc.load %ptr : !emitc.lvalue<i32>423    %c = emitc.load %ptr : !emitc.lvalue<i32>424    %d = emitc.call_opaque "bar" (%a) : (i32) -> (i32)425    %e = add %c, %d : (i32, i32) -> i32426    %f = emitc.cmp lt, %e, %b :(i32, i32) -> i1427    yield %f : i1428  }429  emitc.return %result : i1430}431 432 433// CPP-DEFAULT: void expression_with_call_opaque_with_args_array(int32_t [[v1:v.+]], int32_t [[v2:v.+]]) {434// CPP-DEFAULT-NEXT:   bool [[v3:v.+]] = f(([[v1]] < [[v2]]));435// CPP-DEFAULT-NEXT:   return;436// CPP-DEFAULT-NEXT: }437 438// CPP-DECLTOP: void expression_with_call_opaque_with_args_array(int32_t [[v1:v.+]], int32_t [[v2:v.+]]) {439// CPP-DECLTOP-NEXT:   bool [[v3:v.+]];440// CPP-DECLTOP-NEXT:   [[v3]] = f(([[v1]] < [[v2]]));441// CPP-DECLTOP-NEXT:   return;442// CPP-DECLTOP-NEXT: }443 444emitc.func @expression_with_call_opaque_with_args_array(%0 : i32, %1 : i32) {445  %2 = expression %0, %1 : (i32, i32) -> i1 {446    %3 = cmp lt, %0, %1 : (i32, i32) -> i1447    %4 = emitc.call_opaque "f"(%3) {"args" = [0: index]} : (i1) -> i1448    yield %4 : i1449  }450  return451}452 453// CPP-DEFAULT: void inline_side_effects_into_assign(int32_t [[VAL_1:v[0-9]+]], int32_t* [[VAL_2:v[0-9]+]]) {454// CPP-DEFAULT-NEXT:   int64_t [[VAL_3:v[0-9]+]] = 0;455// CPP-DEFAULT-NEXT:   int32_t [[VAL_4:v[0-9]+]] = 42;456// CPP-DEFAULT-NEXT:   [[VAL_4]] = [[VAL_4]] * [[VAL_1]] + [[VAL_2]][[[VAL_3]]];457// CPP-DEFAULT-NEXT:   return;458// CPP-DEFAULT-NEXT: }459 460// CPP-DECLTOP: void inline_side_effects_into_assign(int32_t [[VAL_1:v[0-9]+]], int32_t* [[VAL_2:v[0-9]+]]) {461// CPP-DECLTOP-NEXT:   int64_t [[VAL_3:v[0-9]+]];462// CPP-DECLTOP-NEXT:   int32_t [[VAL_4:v[0-9]+]];463// CPP-DECLTOP-NEXT:   [[VAL_3]] = 0;464// CPP-DECLTOP-NEXT:   [[VAL_4]] = 42;465// CPP-DECLTOP-NEXT:   [[VAL_4]] = [[VAL_4]] * [[VAL_1]] + [[VAL_2]][[[VAL_3]]];466// CPP-DECLTOP-NEXT:   return;467// CPP-DECLTOP-NEXT: }468 469emitc.func @inline_side_effects_into_assign(%arg0: i32, %arg1: !emitc.ptr<i32>) {470  %c0 = "emitc.constant"() {value = 0 : i64} : () -> i64471  %0 = "emitc.variable"() <{value = #emitc.opaque<"42">}> : () -> !emitc.lvalue<i32>472  %ptr = emitc.subscript %arg1[%c0] : (!emitc.ptr<i32>, i64) -> !emitc.lvalue<i32>473  %result = emitc.expression %arg0, %0, %ptr : (i32, !emitc.lvalue<i32>, !emitc.lvalue<i32>) -> i32 {474    %a = emitc.load %0 : !emitc.lvalue<i32>475    %b = emitc.mul %a, %arg0 : (i32, i32) -> i32476    %c = emitc.load %ptr : !emitc.lvalue<i32>477    %d = emitc.add %b, %c : (i32, i32) -> i32478    yield %d : i32479  }480  emitc.assign %result : i32 to %0 : !emitc.lvalue<i32>481  emitc.return482}483 484// CPP-DEFAULT: void do_not_inline_side_effects_into_assign(int32_t [[VAL_1:v[0-9]+]], int32_t* [[VAL_2:v[0-9]+]]) {485// CPP-DEFAULT-NEXT:   int64_t [[VAL_3:v[0-9]+]] = 0;486// CPP-DEFAULT-NEXT:   int32_t [[VAL_4:v[0-9]+]] = 42;487// CPP-DEFAULT-NEXT:   int32_t [[VAL_5:v[0-9]+]] = [[VAL_4]] * [[VAL_1]];488// CPP-DEFAULT-NEXT:   [[VAL_2]][[[VAL_3]]] = [[VAL_5]];489// CPP-DEFAULT-NEXT:   return;490// CPP-DEFAULT-NEXT: }491 492// CPP-DECLTOP: void do_not_inline_side_effects_into_assign(int32_t [[VAL_1:v[0-9]+]], int32_t* [[VAL_2:v[0-9]+]]) {493// CPP-DECLTOP-NEXT:   int64_t [[VAL_3:v[0-9]+]];494// CPP-DECLTOP-NEXT:   int32_t [[VAL_4:v[0-9]+]];495// CPP-DECLTOP-NEXT:   int32_t [[VAL_5:v[0-9]+]];496// CPP-DECLTOP-NEXT:   [[VAL_3]] = 0;497// CPP-DECLTOP-NEXT:   [[VAL_4]] = 42;498// CPP-DECLTOP-NEXT:   [[VAL_5:v[0-9]+]] = [[VAL_4]] * [[VAL_1]];499// CPP-DECLTOP-NEXT:   [[VAL_2]][[[VAL_3]]] = [[VAL_5]];500// CPP-DECLTOP-NEXT:   return;501// CPP-DECLTOP-NEXT: }502 503emitc.func @do_not_inline_side_effects_into_assign(%arg0: i32, %arg1: !emitc.ptr<i32>) {504  %c0 = "emitc.constant"() {value = 0 : i64} : () -> i64505  %0 = "emitc.variable"() <{value = #emitc.opaque<"42">}> : () -> !emitc.lvalue<i32>506  %ptr = emitc.subscript %arg1[%c0] : (!emitc.ptr<i32>, i64) -> !emitc.lvalue<i32>507  %result = emitc.expression %arg0, %0 : (i32, !emitc.lvalue<i32>) -> i32 {508    %a = emitc.load %0 : !emitc.lvalue<i32>509    %b = emitc.mul %a, %arg0 : (i32, i32) -> i32510    yield %b : i32511  }512  emitc.assign %result : i32 to %ptr : !emitc.lvalue<i32>513  emitc.return514}515 516// CPP-DEFAULT: int32_t do_not_inline_non_preceding_side_effects(int32_t [[VAL_1:v[0-9]+]], int32_t* [[VAL_2:v[0-9]+]]) {517// CPP-DEFAULT-NEXT:   int64_t [[VAL_3:v[0-9]+]] = 0;518// CPP-DEFAULT-NEXT:   int32_t [[VAL_4:v[0-9]+]] = 42;519// CPP-DEFAULT-NEXT:   int32_t [[VAL_5:v[0-9]+]] = [[VAL_4]] * [[VAL_1]];520// CPP-DEFAULT-NEXT:   [[VAL_2]][[[VAL_3]]] = [[VAL_1]];521// CPP-DEFAULT-NEXT:   return [[VAL_5]];522// CPP-DEFAULT-NEXT: }523 524// CPP-DECLTOP: int32_t do_not_inline_non_preceding_side_effects(int32_t [[VAL_1:v[0-9]+]], int32_t* [[VAL_2:v[0-9]+]]) {525// CPP-DECLTOP-NEXT:   int64_t [[VAL_3:v[0-9]+]];526// CPP-DECLTOP-NEXT:   int32_t [[VAL_4:v[0-9]+]];527// CPP-DECLTOP-NEXT:   int32_t [[VAL_5:v[0-9]+]];528// CPP-DECLTOP-NEXT:   [[VAL_3:v[0-9]+]] = 0;529// CPP-DECLTOP-NEXT:   [[VAL_4:v[0-9]+]] = 42;530// CPP-DECLTOP-NEXT:   [[VAL_5:v[0-9]+]] = [[VAL_4]] * [[VAL_1]];531// CPP-DECLTOP-NEXT:   [[VAL_2]][[[VAL_3]]] = [[VAL_1]];532// CPP-DECLTOP-NEXT:   return [[VAL_5]];533// CPP-DECLTOP-NEXT: }534 535emitc.func @do_not_inline_non_preceding_side_effects(%arg0: i32, %arg1: !emitc.ptr<i32>) -> i32 {536  %c0 = "emitc.constant"() {value = 0 : i64} : () -> i64537  %0 = "emitc.variable"() <{value = #emitc.opaque<"42">}> : () -> !emitc.lvalue<i32>538  %ptr = emitc.subscript %arg1[%c0] : (!emitc.ptr<i32>, i64) -> !emitc.lvalue<i32>539  %result = emitc.expression %arg0, %0 : (i32, !emitc.lvalue<i32>) -> i32 {540    %a = emitc.load %0 : !emitc.lvalue<i32>541    %b = emitc.mul %a, %arg0 : (i32, i32) -> i32542    yield %b : i32543  }544  emitc.assign %arg0 : i32 to %ptr : !emitc.lvalue<i32>545  emitc.return %result : i32546}547 548// CPP-DEFAULT: int32_t inline_side_effects_into_if(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {549// CPP-DEFAULT-NEXT:   int32_t [[VAL_4:v[0-9]+]];550// CPP-DEFAULT-NEXT:   if (bar([[VAL_1]], [[VAL_2]]) < [[VAL_3]]) {551// CPP-DEFAULT-NEXT:     [[VAL_4]] = [[VAL_1]];552// CPP-DEFAULT-NEXT:   } else {553// CPP-DEFAULT-NEXT:     [[VAL_4]] = [[VAL_2]];554// CPP-DEFAULT-NEXT:   }555// CPP-DEFAULT-NEXT:   int32_t [[VAL_5:v[0-9]+]] = [[VAL_4]];556// CPP-DEFAULT-NEXT:   return [[VAL_5]];557// CPP-DEFAULT-NEXT: }558 559// CPP-DECLTOP: int32_t inline_side_effects_into_if(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {560// CPP-DECLTOP-NEXT:   int32_t [[VAL_4:v[0-9]+]];561// CPP-DECLTOP-NEXT:   int32_t [[VAL_5:v[0-9]+]];562// CPP-DECLTOP-NEXT:   ;563// CPP-DECLTOP-NEXT:   if (bar([[VAL_1]], [[VAL_2]]) < [[VAL_3]]) {564// CPP-DECLTOP-NEXT:     [[VAL_4]] = [[VAL_1]];565// CPP-DECLTOP-NEXT:   } else {566// CPP-DECLTOP-NEXT:     [[VAL_4]] = [[VAL_2]];567// CPP-DECLTOP-NEXT:   }568// CPP-DECLTOP-NEXT:   [[VAL_5]] = [[VAL_4]];569// CPP-DECLTOP-NEXT:   return [[VAL_5]];570// CPP-DECLTOP-NEXT: }571 572func.func @inline_side_effects_into_if(%arg0: i32, %arg1: i32, %arg2: i32) -> i32 {573  %v = "emitc.variable"(){value = #emitc.opaque<"">} : () -> !emitc.lvalue<i32>574  %cond = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i1 {575    %a = emitc.call_opaque "bar" (%arg0, %arg1) : (i32, i32) -> (i32)576    %b = emitc.cmp lt, %a, %arg2 :(i32, i32) -> i1577    emitc.yield %b : i1578  }579  emitc.if %cond {580    emitc.assign %arg0 : i32 to %v : !emitc.lvalue<i32>581    emitc.yield582  } else {583    emitc.assign %arg1 : i32 to %v : !emitc.lvalue<i32>584    emitc.yield585  }586  %v_load = emitc.load %v : !emitc.lvalue<i32>587  return %v_load : i32588}589 590// CPP-DEFAULT: void inline_side_effects_into_switch(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {591// CPP-DEFAULT-NEXT:   switch (bar([[VAL_1]], [[VAL_2]]) + [[VAL_3]]) {592// CPP-DEFAULT-NEXT:   case 2: {593// CPP-DEFAULT-NEXT:     int32_t [[VAL_4:v[0-9]+]] = func_b();594// CPP-DEFAULT-NEXT:     break;595// CPP-DEFAULT-NEXT:   }596// CPP-DEFAULT-NEXT:   case 5: {597// CPP-DEFAULT-NEXT:     int32_t [[VAL_5:v[0-9]+]] = func_a();598// CPP-DEFAULT-NEXT:     break;599// CPP-DEFAULT-NEXT:   }600// CPP-DEFAULT-NEXT:   default: {601// CPP-DEFAULT-NEXT:     float [[VAL_6:v[0-9]+]] = 4.200000000e+01f;602// CPP-DEFAULT-NEXT:     func2([[VAL_6]]);603// CPP-DEFAULT-NEXT:     break;604// CPP-DEFAULT-NEXT:   }605// CPP-DEFAULT-NEXT:   }606// CPP-DEFAULT-NEXT:   return;607// CPP-DEFAULT-NEXT: }608 609// CPP-DECLTOP: void inline_side_effects_into_switch(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {610// CPP-DECLTOP-NEXT:   float [[VAL_6:v[0-9]+]];611// CPP-DECLTOP-NEXT:   int32_t [[VAL_4:v[0-9]+]];612// CPP-DECLTOP-NEXT:   int32_t [[VAL_5:v[0-9]+]];613// CPP-DECLTOP-NEXT:   switch (bar([[VAL_1]], [[VAL_2]]) + [[VAL_3]]) {614// CPP-DECLTOP-NEXT:   case 2: {615// CPP-DECLTOP-NEXT:     [[VAL_4]] = func_b();616// CPP-DECLTOP-NEXT:     break;617// CPP-DECLTOP-NEXT:   }618// CPP-DECLTOP-NEXT:   case 5: {619// CPP-DECLTOP-NEXT:     [[VAL_5]] = func_a();620// CPP-DECLTOP-NEXT:     break;621// CPP-DECLTOP-NEXT:   }622// CPP-DECLTOP-NEXT:   default: {623// CPP-DECLTOP-NEXT:     [[VAL_6]] = 4.200000000e+01f;624// CPP-DECLTOP-NEXT:     func2([[VAL_6]]);625// CPP-DECLTOP-NEXT:     break;626// CPP-DECLTOP-NEXT:   }627// CPP-DECLTOP-NEXT:   }628// CPP-DECLTOP-NEXT:   return;629// CPP-DECLTOP-NEXT: }630 631func.func @inline_side_effects_into_switch(%arg0: i32, %arg1: i32, %arg2: i32) {632  %0 = emitc.expression %arg0, %arg1, %arg2 : (i32, i32, i32) -> i32 {633    %a = emitc.call_opaque "bar" (%arg0, %arg1) : (i32, i32) -> (i32)634    %b = emitc.add %a, %arg2 :(i32, i32) -> i32635    emitc.yield %b : i32636  }637  emitc.switch %0 : i32638  case 2 {639    %1 = emitc.call_opaque "func_b" () : () -> i32640    emitc.yield641  }642  case 5 {643    %2 = emitc.call_opaque "func_a" () : () -> i32644    emitc.yield645  }646  default {647    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32648    emitc.call_opaque "func2" (%3) : (f32) -> ()649    emitc.yield650  }651  return652}653