1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-block-placement | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test irreducible CFG handling. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 6*9880d681SAndroid Build Coastguard Workertarget triple = "wasm32-unknown-unknown" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; A simple loop with two entries. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test0: 11*9880d681SAndroid Build Coastguard Worker; CHECK: f64.load 12*9880d681SAndroid Build Coastguard Worker; CHECK: i32.const $[[REG:[^,]+]]=, 0{{$}} 13*9880d681SAndroid Build Coastguard Worker; CHECK: br_table $[[REG]], 14*9880d681SAndroid Build Coastguard Workerdefine void @test0(double* %arg, i32 %arg1, i32 %arg2, i32 %arg3) { 15*9880d681SAndroid Build Coastguard Workerbb: 16*9880d681SAndroid Build Coastguard Worker %tmp = icmp eq i32 %arg2, 0 17*9880d681SAndroid Build Coastguard Worker br i1 %tmp, label %bb6, label %bb3 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerbb3: 20*9880d681SAndroid Build Coastguard Worker %tmp4 = getelementptr double, double* %arg, i32 %arg3 21*9880d681SAndroid Build Coastguard Worker %tmp5 = load double, double* %tmp4, align 4 22*9880d681SAndroid Build Coastguard Worker br label %bb13 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerbb6: 25*9880d681SAndroid Build Coastguard Worker %tmp7 = phi i32 [ %tmp18, %bb13 ], [ 0, %bb ] 26*9880d681SAndroid Build Coastguard Worker %tmp8 = icmp slt i32 %tmp7, %arg1 27*9880d681SAndroid Build Coastguard Worker br i1 %tmp8, label %bb9, label %bb19 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerbb9: 30*9880d681SAndroid Build Coastguard Worker %tmp10 = getelementptr double, double* %arg, i32 %tmp7 31*9880d681SAndroid Build Coastguard Worker %tmp11 = load double, double* %tmp10, align 4 32*9880d681SAndroid Build Coastguard Worker %tmp12 = fmul double %tmp11, 2.300000e+00 33*9880d681SAndroid Build Coastguard Worker store double %tmp12, double* %tmp10, align 4 34*9880d681SAndroid Build Coastguard Worker br label %bb13 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerbb13: 37*9880d681SAndroid Build Coastguard Worker %tmp14 = phi double [ %tmp5, %bb3 ], [ %tmp12, %bb9 ] 38*9880d681SAndroid Build Coastguard Worker %tmp15 = phi i32 [ undef, %bb3 ], [ %tmp7, %bb9 ] 39*9880d681SAndroid Build Coastguard Worker %tmp16 = getelementptr double, double* %arg, i32 %tmp15 40*9880d681SAndroid Build Coastguard Worker %tmp17 = fadd double %tmp14, 1.300000e+00 41*9880d681SAndroid Build Coastguard Worker store double %tmp17, double* %tmp16, align 4 42*9880d681SAndroid Build Coastguard Worker %tmp18 = add nsw i32 %tmp15, 1 43*9880d681SAndroid Build Coastguard Worker br label %bb6 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerbb19: 46*9880d681SAndroid Build Coastguard Worker ret void 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; A simple loop with two entries and an inner natural loop. 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 52*9880d681SAndroid Build Coastguard Worker; CHECK: f64.load 53*9880d681SAndroid Build Coastguard Worker; CHECK: i32.const $[[REG:[^,]+]]=, 0{{$}} 54*9880d681SAndroid Build Coastguard Worker; CHECK: br_table $[[REG]], 55*9880d681SAndroid Build Coastguard Workerdefine void @test1(double* %arg, i32 %arg1, i32 %arg2, i32 %arg3) { 56*9880d681SAndroid Build Coastguard Workerbb: 57*9880d681SAndroid Build Coastguard Worker %tmp = icmp eq i32 %arg2, 0 58*9880d681SAndroid Build Coastguard Worker br i1 %tmp, label %bb6, label %bb3 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerbb3: 61*9880d681SAndroid Build Coastguard Worker %tmp4 = getelementptr double, double* %arg, i32 %arg3 62*9880d681SAndroid Build Coastguard Worker %tmp5 = load double, double* %tmp4, align 4 63*9880d681SAndroid Build Coastguard Worker br label %bb13 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerbb6: 66*9880d681SAndroid Build Coastguard Worker %tmp7 = phi i32 [ %tmp18, %bb13 ], [ 0, %bb ] 67*9880d681SAndroid Build Coastguard Worker %tmp8 = icmp slt i32 %tmp7, %arg1 68*9880d681SAndroid Build Coastguard Worker br i1 %tmp8, label %bb9, label %bb19 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerbb9: 71*9880d681SAndroid Build Coastguard Worker %tmp10 = getelementptr double, double* %arg, i32 %tmp7 72*9880d681SAndroid Build Coastguard Worker %tmp11 = load double, double* %tmp10, align 4 73*9880d681SAndroid Build Coastguard Worker %tmp12 = fmul double %tmp11, 2.300000e+00 74*9880d681SAndroid Build Coastguard Worker store double %tmp12, double* %tmp10, align 4 75*9880d681SAndroid Build Coastguard Worker br label %bb10 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerbb10: 78*9880d681SAndroid Build Coastguard Worker %p = phi i32 [ 0, %bb9 ], [ %pn, %bb10 ] 79*9880d681SAndroid Build Coastguard Worker %pn = add i32 %p, 1 80*9880d681SAndroid Build Coastguard Worker %c = icmp slt i32 %pn, 256 81*9880d681SAndroid Build Coastguard Worker br i1 %c, label %bb10, label %bb13 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerbb13: 84*9880d681SAndroid Build Coastguard Worker %tmp14 = phi double [ %tmp5, %bb3 ], [ %tmp12, %bb10 ] 85*9880d681SAndroid Build Coastguard Worker %tmp15 = phi i32 [ undef, %bb3 ], [ %tmp7, %bb10 ] 86*9880d681SAndroid Build Coastguard Worker %tmp16 = getelementptr double, double* %arg, i32 %tmp15 87*9880d681SAndroid Build Coastguard Worker %tmp17 = fadd double %tmp14, 1.300000e+00 88*9880d681SAndroid Build Coastguard Worker store double %tmp17, double* %tmp16, align 4 89*9880d681SAndroid Build Coastguard Worker %tmp18 = add nsw i32 %tmp15, 1 90*9880d681SAndroid Build Coastguard Worker br label %bb6 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerbb19: 93*9880d681SAndroid Build Coastguard Worker ret void 94*9880d681SAndroid Build Coastguard Worker} 95