[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / LICM / sink-with-coroutine.ll
blob04cca14a4ef3c3810aa949f7e56e489e5766d6ee
1 ; Verifies that LICM is disabled for loops that contains coro.suspend.
2 ; RUN: opt -S < %s -passes=licm | FileCheck %s
4 define i64 @licm(i64 %n) #0 {
5 ; CHECK-LABEL: @licm(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[P:%.*]] = alloca i64, align 8
8 ; CHECK-NEXT:    br label [[BB0:%.*]]
9 ; CHECK:       bb0:
10 ; CHECK-NEXT:    br label [[LOOP:%.*]]
11 ; CHECK:       loop:
12 ; CHECK-NEXT:    [[I:%.*]] = phi i64 [ 0, [[BB0]] ], [ [[T5:%.*]], [[AWAIT_READY:%.*]] ]
13 ; CHECK-NEXT:    [[T5]] = add i64 [[I]], 1
14 ; CHECK-NEXT:    [[SUSPEND:%.*]] = call i8 @llvm.coro.suspend(token none, i1 false)
15 ; CHECK-NEXT:    switch i8 [[SUSPEND]], label [[BB2:%.*]] [
16 ; CHECK-NEXT:    i8 0, label [[AWAIT_READY]]
17 ; CHECK-NEXT:    ]
18 ; CHECK:       await.ready:
19 ; CHECK-NEXT:    store i64 1, i64* [[P]], align 4
20 ; CHECK-NEXT:    [[T6:%.*]] = icmp ult i64 [[T5]], [[N:%.*]]
21 ; CHECK-NEXT:    br i1 [[T6]], label [[LOOP]], label [[BB2]]
22 ; CHECK:       bb2:
23 ; CHECK-NEXT:    [[RES:%.*]] = call i1 @llvm.coro.end(i8* null, i1 false)
24 ; CHECK-NEXT:    ret i64 0
26 entry:
27   %p = alloca i64
28   br label %bb0
30 bb0:
31   br label %loop
33 loop:
34   %i = phi i64 [ 0, %bb0 ], [ %t5, %await.ready ]
35   %t5 = add i64 %i, 1
36   %suspend = call i8 @llvm.coro.suspend(token none, i1 false)
37   switch i8 %suspend, label %bb2 [
38   i8 0, label %await.ready
39   ]
41 await.ready:
42   store i64 1, i64* %p
43   %t6 = icmp ult i64 %t5, %n
44   br i1 %t6, label %loop, label %bb2
46 bb2:
47   %res = call i1 @llvm.coro.end(i8* null, i1 false)
48   ret i64 0
51 declare i8  @llvm.coro.suspend(token, i1)
52 declare i1  @llvm.coro.end(i8*, i1)