xref: /llvm-project/llvm/test/CodeGen/LoongArch/intrinsic-csr-side-effects.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s
3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s
4
5declare i32 @llvm.loongarch.csrrd.w(i32 immarg) nounwind
6declare i32 @llvm.loongarch.csrwr.w(i32, i32 immarg) nounwind
7declare void @bug()
8
9define dso_local void @foo(i32 noundef signext %flag) nounwind {
10; CHECK-LABEL: foo:
11; CHECK:       # %bb.0: # %entry
12; CHECK-NEXT:    beqz $a0, .LBB0_2
13; CHECK-NEXT:  # %bb.1: # %if.then
14; CHECK-NEXT:    csrrd $a0, 2
15; CHECK-NEXT:    ori $a0, $a0, 1
16; CHECK-NEXT:    csrwr $a0, 2
17; CHECK-NEXT:  .LBB0_2: # %if.end
18; CHECK-NEXT:    csrrd $a0, 2
19; CHECK-NEXT:    andi $a0, $a0, 1
20; CHECK-NEXT:    bnez $a0, .LBB0_4
21; CHECK-NEXT:  # %bb.3: # %if.then2
22; CHECK-NEXT:    b %plt(bug)
23; CHECK-NEXT:  .LBB0_4: # %if.end3
24; CHECK-NEXT:    ret
25entry:
26  %tobool.not = icmp eq i32 %flag, 0
27  br i1 %tobool.not, label %if.end, label %if.then
28
29if.then:                                          ; preds = %entry
30  %0 = tail call i32 @llvm.loongarch.csrrd.w(i32 2)
31  %or = or i32 %0, 1
32  %1 = tail call i32 @llvm.loongarch.csrwr.w(i32 %or, i32 2)
33  br label %if.end
34
35if.end:                                           ; preds = %if.then, %entry
36  %2 = tail call i32 @llvm.loongarch.csrrd.w(i32 2)
37  %and = and i32 %2, 1
38  %tobool1.not = icmp eq i32 %and, 0
39  br i1 %tobool1.not, label %if.then2, label %if.end3
40
41if.then2:                                         ; preds = %if.end
42  tail call void @bug()
43  br label %if.end3
44
45if.end3:                                          ; preds = %if.then2, %if.end
46  ret void
47}
48