1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s 3 4declare i32 @llvm.loongarch.iocsrrd.b(i32) nounwind 5declare void @llvm.loongarch.iocsrwr.b(i32, i32) nounwind 6declare i32 @llvm.loongarch.iocsrrd.h(i32) nounwind 7declare void @llvm.loongarch.iocsrwr.h(i32, i32) nounwind 8declare i32 @llvm.loongarch.iocsrrd.w(i32) nounwind 9declare void @llvm.loongarch.iocsrwr.w(i32, i32) nounwind 10declare i64 @llvm.loongarch.iocsrrd.d(i32) nounwind 11declare void @llvm.loongarch.iocsrwr.d(i64, i32) nounwind 12declare void @bug() 13 14define dso_local void @test_b(i32 noundef signext %flag) nounwind { 15; CHECK-LABEL: test_b: 16; CHECK: # %bb.0: # %entry 17; CHECK-NEXT: beqz $a0, .LBB0_2 18; CHECK-NEXT: # %bb.1: # %if.then 19; CHECK-NEXT: ori $a0, $zero, 2 20; CHECK-NEXT: iocsrrd.b $a1, $a0 21; CHECK-NEXT: ori $a1, $a1, 1 22; CHECK-NEXT: iocsrwr.b $a1, $a0 23; CHECK-NEXT: .LBB0_2: # %if.end 24; CHECK-NEXT: ori $a0, $zero, 2 25; CHECK-NEXT: iocsrrd.b $a0, $a0 26; CHECK-NEXT: andi $a0, $a0, 1 27; CHECK-NEXT: bnez $a0, .LBB0_4 28; CHECK-NEXT: # %bb.3: # %if.then2 29; CHECK-NEXT: b %plt(bug) 30; CHECK-NEXT: .LBB0_4: # %if.end3 31; CHECK-NEXT: ret 32entry: 33 %tobool.not = icmp eq i32 %flag, 0 34 br i1 %tobool.not, label %if.end, label %if.then 35 36if.then: ; preds = %entry 37 %0 = tail call i32 @llvm.loongarch.iocsrrd.b(i32 2) 38 %or = or i32 %0, 1 39 tail call void @llvm.loongarch.iocsrwr.b(i32 %or, i32 2) 40 br label %if.end 41 42if.end: ; preds = %if.then, %entry 43 %1 = tail call i32 @llvm.loongarch.iocsrrd.b(i32 2) 44 %and = and i32 %1, 1 45 %tobool1.not = icmp eq i32 %and, 0 46 br i1 %tobool1.not, label %if.then2, label %if.end3 47 48if.then2: ; preds = %if.end 49 tail call void @bug() 50 br label %if.end3 51 52if.end3: ; preds = %if.then2, %if.end 53 ret void 54} 55 56define dso_local void @test_h(i32 noundef signext %flag) nounwind { 57; CHECK-LABEL: test_h: 58; CHECK: # %bb.0: # %entry 59; CHECK-NEXT: beqz $a0, .LBB1_2 60; CHECK-NEXT: # %bb.1: # %if.then 61; CHECK-NEXT: ori $a0, $zero, 2 62; CHECK-NEXT: iocsrrd.h $a1, $a0 63; CHECK-NEXT: ori $a1, $a1, 1 64; CHECK-NEXT: iocsrwr.h $a1, $a0 65; CHECK-NEXT: .LBB1_2: # %if.end 66; CHECK-NEXT: ori $a0, $zero, 2 67; CHECK-NEXT: iocsrrd.h $a0, $a0 68; CHECK-NEXT: andi $a0, $a0, 1 69; CHECK-NEXT: bnez $a0, .LBB1_4 70; CHECK-NEXT: # %bb.3: # %if.then2 71; CHECK-NEXT: b %plt(bug) 72; CHECK-NEXT: .LBB1_4: # %if.end3 73; CHECK-NEXT: ret 74entry: 75 %tobool.not = icmp eq i32 %flag, 0 76 br i1 %tobool.not, label %if.end, label %if.then 77 78if.then: ; preds = %entry 79 %0 = tail call i32 @llvm.loongarch.iocsrrd.h(i32 2) 80 %or = or i32 %0, 1 81 tail call void @llvm.loongarch.iocsrwr.h(i32 %or, i32 2) 82 br label %if.end 83 84if.end: ; preds = %if.then, %entry 85 %1 = tail call i32 @llvm.loongarch.iocsrrd.h(i32 2) 86 %and = and i32 %1, 1 87 %tobool1.not = icmp eq i32 %and, 0 88 br i1 %tobool1.not, label %if.then2, label %if.end3 89 90if.then2: ; preds = %if.end 91 tail call void @bug() 92 br label %if.end3 93 94if.end3: ; preds = %if.then2, %if.end 95 ret void 96} 97 98define dso_local void @test_w(i32 noundef signext %flag) nounwind { 99; CHECK-LABEL: test_w: 100; CHECK: # %bb.0: # %entry 101; CHECK-NEXT: beqz $a0, .LBB2_2 102; CHECK-NEXT: # %bb.1: # %if.then 103; CHECK-NEXT: ori $a0, $zero, 2 104; CHECK-NEXT: iocsrrd.w $a1, $a0 105; CHECK-NEXT: ori $a1, $a1, 1 106; CHECK-NEXT: iocsrwr.w $a1, $a0 107; CHECK-NEXT: .LBB2_2: # %if.end 108; CHECK-NEXT: ori $a0, $zero, 2 109; CHECK-NEXT: iocsrrd.w $a0, $a0 110; CHECK-NEXT: andi $a0, $a0, 1 111; CHECK-NEXT: bnez $a0, .LBB2_4 112; CHECK-NEXT: # %bb.3: # %if.then2 113; CHECK-NEXT: b %plt(bug) 114; CHECK-NEXT: .LBB2_4: # %if.end3 115; CHECK-NEXT: ret 116entry: 117 %tobool.not = icmp eq i32 %flag, 0 118 br i1 %tobool.not, label %if.end, label %if.then 119 120if.then: ; preds = %entry 121 %0 = tail call i32 @llvm.loongarch.iocsrrd.w(i32 2) 122 %or = or i32 %0, 1 123 tail call void @llvm.loongarch.iocsrwr.w(i32 %or, i32 2) 124 br label %if.end 125 126if.end: ; preds = %if.then, %entry 127 %1 = tail call i32 @llvm.loongarch.iocsrrd.w(i32 2) 128 %and = and i32 %1, 1 129 %tobool1.not = icmp eq i32 %and, 0 130 br i1 %tobool1.not, label %if.then2, label %if.end3 131 132if.then2: ; preds = %if.end 133 tail call void @bug() 134 br label %if.end3 135 136if.end3: ; preds = %if.then2, %if.end 137 ret void 138} 139 140define dso_local void @test_d(i32 noundef signext %flag) nounwind { 141; CHECK-LABEL: test_d: 142; CHECK: # %bb.0: # %entry 143; CHECK-NEXT: beqz $a0, .LBB3_2 144; CHECK-NEXT: # %bb.1: # %if.then 145; CHECK-NEXT: ori $a0, $zero, 2 146; CHECK-NEXT: iocsrrd.d $a1, $a0 147; CHECK-NEXT: ori $a1, $a1, 1 148; CHECK-NEXT: iocsrwr.d $a1, $a0 149; CHECK-NEXT: .LBB3_2: # %if.end 150; CHECK-NEXT: ori $a0, $zero, 2 151; CHECK-NEXT: iocsrrd.d $a0, $a0 152; CHECK-NEXT: andi $a0, $a0, 1 153; CHECK-NEXT: bnez $a0, .LBB3_4 154; CHECK-NEXT: # %bb.3: # %if.then2 155; CHECK-NEXT: b %plt(bug) 156; CHECK-NEXT: .LBB3_4: # %if.end3 157; CHECK-NEXT: ret 158entry: 159 %tobool.not = icmp eq i32 %flag, 0 160 br i1 %tobool.not, label %if.end, label %if.then 161 162if.then: ; preds = %entry 163 %0 = tail call i64 @llvm.loongarch.iocsrrd.d(i32 2) 164 %or = or i64 %0, 1 165 tail call void @llvm.loongarch.iocsrwr.d(i64 %or, i32 2) 166 br label %if.end 167 168if.end: ; preds = %if.then, %entry 169 %1 = tail call i64 @llvm.loongarch.iocsrrd.d(i32 2) 170 %and = and i64 %1, 1 171 %tobool1.not = icmp eq i64 %and, 0 172 br i1 %tobool1.not, label %if.then2, label %if.end3 173 174if.then2: ; preds = %if.end 175 tail call void @bug() 176 br label %if.end3 177 178if.end3: ; preds = %if.then2, %if.end 179 ret void 180} 181