160 lines · plain
1; RUN: llc < %s -mtriple=thumbv7m -mattr=-no-branch-predictor | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BP2; RUN: llc < %s -mtriple=thumbv7m -mcpu=cortex-m3 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOBP3 4declare void @otherfn()5 6; CHECK-LABEL: triangle1:7; CHECK: itt ne8; CHECK: movne9; CHECK: strne10define i32 @triangle1(i32 %n, ptr %p) {11entry:12 %tobool = icmp eq i32 %n, 013 br i1 %tobool, label %if.end, label %if.then14 15if.then:16 store i32 1, ptr %p, align 417 br label %if.end18 19if.end:20 tail call void @otherfn()21 ret i32 022}23 24; CHECK-LABEL: triangle2:25; CHECK-BP: itttt ne26; CHECK-BP: movne27; CHECK-BP: strne28; CHECK-BP: movne29; CHECK-BP: strne30; CHECK-NOBP: cbz31; CHECK-NOBP: movs32; CHECK-NOBP: str33; CHECK-NOBP: movs34; CHECK-NOBP: str35define i32 @triangle2(i32 %n, ptr %p, ptr %q) {36entry:37 %tobool = icmp eq i32 %n, 038 br i1 %tobool, label %if.end, label %if.then39 40if.then:41 store i32 1, ptr %p, align 442 store i32 2, ptr %q, align 443 br label %if.end44 45if.end:46 tail call void @otherfn()47 ret i32 048}49 50; CHECK-LABEL: triangle3:51; CHECK: cbz52; CHECK: movs53; CHECK: str54; CHECK: movs55; CHECK: str56; CHECK: movs57; CHECK: str58define i32 @triangle3(i32 %n, ptr %p, ptr %q, ptr %r) {59entry:60 %tobool = icmp eq i32 %n, 061 br i1 %tobool, label %if.end, label %if.then62 63if.then:64 store i32 1, ptr %p, align 465 store i32 2, ptr %q, align 466 store i32 3, ptr %r, align 467 store i32 4, ptr %p, align 468 br label %if.end69 70if.end:71 tail call void @otherfn()72 ret i32 073}74 75; CHECK-LABEL: diamond1:76; CHECK: itee eq77; CHECK: ldreq78; CHECK: strne79define i32 @diamond1(i32 %n, ptr %p) {80entry:81 %tobool = icmp eq i32 %n, 082 br i1 %tobool, label %if.else, label %if.then83 84if.then:85 store i32 %n, ptr %p, align 486 br label %if.end87 88if.else:89 %0 = load i32, ptr %p, align 490 br label %if.end91 92if.end:93 %n.addr.0 = phi i32 [ %n, %if.then ], [ %0, %if.else ]94 tail call void @otherfn()95 ret i32 %n.addr.096}97 98; CHECK-LABEL: diamond2:99; CHECK-BP: cbz100; CHECK-BP: str101; CHECK-BP: str102; CHECK-BP: b103; CHECK-BP: str104; CHECK-BP: add105; CHECK-NOBP: ittee106; CHECK-NOBP: streq107; CHECK-NOBP: addeq108; CHECK-NOBP: strne109; CHECK-NOBP: strne110define i32 @diamond2(i32 %n, ptr %p, ptr %q) {111entry:112 %tobool = icmp eq i32 %n, 0113 br i1 %tobool, label %if.else, label %if.then114 115if.then:116 store i32 %n, ptr %p, align 4117 %arrayidx = getelementptr inbounds i32, ptr %p, i32 2118 store i32 %n, ptr %arrayidx, align 4119 br label %if.end120 121if.else:122 store i32 %n, ptr %q, align 4123 %0 = add i32 %n, 10124 br label %if.end125 126if.end:127 %n.addr.0 = phi i32 [ %n, %if.then ], [ %0, %if.else ]128 tail call void @otherfn()129 ret i32 %n.addr.0130}131 132; CHECK-LABEL: diamond3:133; CHECK: cbz134; CHECK: movs135; CHECK: str136; CHECK: b137; CHECK: ldr138; CHECK: ldr139; CHECK: adds140define i32 @diamond3(i32 %n, ptr %p, ptr %q) {141entry:142 %tobool = icmp eq i32 %n, 0143 br i1 %tobool, label %if.else, label %if.then144 145if.then:146 store i32 1, ptr %p, align 4147 br label %if.end148 149if.else:150 %0 = load i32, ptr %p, align 4151 %1 = load i32, ptr %q, align 4152 %add = add nsw i32 %1, %0153 br label %if.end154 155if.end:156 %n.addr.0 = phi i32 [ %n, %if.then ], [ %add, %if.else ]157 tail call void @otherfn()158 ret i32 %n.addr.0159}160