diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:04:03 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:04:03 +0000 |
commit | f8af5cf600354830d4ccf59732403f0f073eccb9 (patch) | |
tree | 2ba0398b4c42ad4f55561327538044fd2c925a8b /test/Transforms/StructurizeCFG | |
parent | 59d6cff90eecf31cb3dd860c4e786674cfdd42eb (diff) |
Diffstat (limited to 'test/Transforms/StructurizeCFG')
-rw-r--r-- | test/Transforms/StructurizeCFG/branch-on-argument.ll | 47 | ||||
-rw-r--r-- | test/Transforms/StructurizeCFG/loop-multiple-exits.ll | 50 | ||||
-rw-r--r-- | test/Transforms/StructurizeCFG/no-branch-to-entry.ll | 31 | ||||
-rw-r--r-- | test/Transforms/StructurizeCFG/switch.ll | 23 |
4 files changed, 151 insertions, 0 deletions
diff --git a/test/Transforms/StructurizeCFG/branch-on-argument.ll b/test/Transforms/StructurizeCFG/branch-on-argument.ll new file mode 100644 index 0000000000000..4eba0cd8fe151 --- /dev/null +++ b/test/Transforms/StructurizeCFG/branch-on-argument.ll @@ -0,0 +1,47 @@ +; RUN: opt -S -o - -structurizecfg < %s | FileCheck %s + +; CHECK-LABEL: @invert_branch_on_arg_inf_loop( +; CHECK: entry: +; CHECK: %arg.inv = xor i1 %arg, true +; CHECK: phi i1 [ false, %Flow1 ], [ %arg.inv, %entry ] +define void @invert_branch_on_arg_inf_loop(i32 addrspace(1)* %out, i1 %arg) { +entry: + br i1 %arg, label %for.end, label %for.body + +for.body: ; preds = %entry, %for.body + store i32 999, i32 addrspace(1)* %out, align 4 + br label %for.body + +for.end: ; preds = %Flow + ret void +} + + +; CHECK-LABEL: @invert_branch_on_arg_jump_into_loop( +; CHECK: entry: +; CHECK: %arg.inv = xor i1 %arg, true +; CHECK: Flow: +; CHECK: Flow1: +define void @invert_branch_on_arg_jump_into_loop(i32 addrspace(1)* %out, i32 %n, i1 %arg) { +entry: + br label %for.body + +for.body: + %i = phi i32 [0, %entry], [%i.inc, %end.loop] + %ptr = getelementptr i32 addrspace(1)* %out, i32 %i + store i32 %i, i32 addrspace(1)* %ptr, align 4 + br i1 %arg, label %mid.loop, label %end.loop + +mid.loop: + store i32 333, i32 addrspace(1)* %out, align 4 + br label %for.end + +end.loop: + %i.inc = add i32 %i, 1 + %cmp = icmp ne i32 %i.inc, %n + br i1 %cmp, label %for.body, label %for.end + +for.end: + ret void +} + diff --git a/test/Transforms/StructurizeCFG/loop-multiple-exits.ll b/test/Transforms/StructurizeCFG/loop-multiple-exits.ll new file mode 100644 index 0000000000000..45f3165671e16 --- /dev/null +++ b/test/Transforms/StructurizeCFG/loop-multiple-exits.ll @@ -0,0 +1,50 @@ +; RUN: opt -S -structurizecfg %s -o - | FileCheck %s +; +; void loop(int *out, int cond_a, int cond_b) { +; +; unsigned i; +; for (i = 0; i < cond_a; i++) { +; out[i] = i; +; if (i > cond_b) { +; break; +; } +; out[i + cond_a] = i; +; } +; } + +define void @loop(i32 addrspace(1)* %out, i32 %cond_a, i32 %cond_b) nounwind uwtable { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] + %cmp = icmp ult i32 %i.0, %cond_a + br i1 %cmp, label %for.body, label %for.end + +; CHECK: for.body: +for.body: ; preds = %for.cond + %arrayidx = getelementptr inbounds i32 addrspace(1)* %out, i32 %i.0 + store i32 %i.0, i32 addrspace(1)* %arrayidx, align 4 + %cmp1 = icmp ugt i32 %i.0, %cond_b +; CHECK: br i1 %{{[0-9a-zA-Z_]+}}, label %for.inc, label %[[FLOW1:[0-9a-zA-Z_]+]] + br i1 %cmp1, label %for.end, label %for.inc + +; CHECK: [[FLOW:[0-9a-zA-Z]+]]: +; CHECK: br i1 %{{[0-9a-zA-Z_]+}}, label %for.end, label %for.cond + +; CHECK: for.inc: +; CHECK: br label %[[FLOW1]] + +for.inc: ; preds = %for.body + %0 = add i32 %cond_a, %i.0 + %arrayidx3 = getelementptr inbounds i32 addrspace(1)* %out, i32 %0 + store i32 %i.0, i32 addrspace(1)* %arrayidx3, align 4 + %inc = add i32 %i.0, 1 + br label %for.cond + +; CHECK: [[FLOW1]] +; CHECK: br label %[[FLOW]] + +for.end: ; preds = %for.cond, %for.body + ret void +} diff --git a/test/Transforms/StructurizeCFG/no-branch-to-entry.ll b/test/Transforms/StructurizeCFG/no-branch-to-entry.ll new file mode 100644 index 0000000000000..2e22c8715347e --- /dev/null +++ b/test/Transforms/StructurizeCFG/no-branch-to-entry.ll @@ -0,0 +1,31 @@ +; RUN: opt -S -o - -structurizecfg < %s | FileCheck %s + +; CHECK-LABEL: @no_branch_to_entry_undef( +; CHECK: entry: +; CHECK-NEXT: br label %entry.orig +define void @no_branch_to_entry_undef(i32 addrspace(1)* %out) { +entry: + br i1 undef, label %for.end, label %for.body + +for.body: ; preds = %entry, %for.body + store i32 999, i32 addrspace(1)* %out, align 4 + br label %for.body + +for.end: ; preds = %Flow + ret void +} + +; CHECK-LABEL: @no_branch_to_entry_true( +; CHECK: entry: +; CHECK-NEXT: br label %entry.orig +define void @no_branch_to_entry_true(i32 addrspace(1)* %out) { +entry: + br i1 true, label %for.end, label %for.body + +for.body: ; preds = %entry, %for.body + store i32 999, i32 addrspace(1)* %out, align 4 + br label %for.body + +for.end: ; preds = %Flow + ret void +} diff --git a/test/Transforms/StructurizeCFG/switch.ll b/test/Transforms/StructurizeCFG/switch.ll new file mode 100644 index 0000000000000..316df57ea7364 --- /dev/null +++ b/test/Transforms/StructurizeCFG/switch.ll @@ -0,0 +1,23 @@ +; RUN: opt -S -structurizecfg %s -o - | FileCheck %s + +; The structurizecfg pass cannot handle switch instructions, so we need to +; make sure the lower switch pass is always run before structurizecfg. + +; CHECK-LABEL: @switch +define void @switch(i32 addrspace(1)* %out, i32 %cond) nounwind { +entry: +; CHECK: icmp + switch i32 %cond, label %done [ i32 0, label %zero] + +; CHECK: zero: +zero: +; CHECK: store i32 7, i32 addrspace(1)* %out + store i32 7, i32 addrspace(1)* %out +; CHECK: br label %done + br label %done + +; CHECK: done: +done: +; CHECK: ret void + ret void +} |