xref: /aosp_15_r20/external/llvm/test/CodeGen/WebAssembly/irreducible-cfg.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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