diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-04-16 16:01:22 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-04-16 16:01:22 +0000 |
commit | 71d5a2540a98c81f5bcaeb48805e0e2881f530ef (patch) | |
tree | 5343938942df402b49ec7300a1c25a2d4ccd5821 /test/Transforms/SimplifyCFG | |
parent | 31bbf64f3a4974a2d6c8b3b27ad2f519caf74057 (diff) |
Notes
Diffstat (limited to 'test/Transforms/SimplifyCFG')
-rw-r--r-- | test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll | 10 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/CoveredLookupTable.ll | 2 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll | 2 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/X86/switch-table-bug.ll | 2 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll | 7 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/critedge-assume.ll | 83 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/div-rem-pairs.ll | 119 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/empty-cleanuppad.ll | 8 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/lifetime.ll | 8 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/merge-cond-stores.ll | 163 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/rangereduce.ll | 2 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/remove-debug-2.ll | 68 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/switch_create.ll | 2 |
13 files changed, 422 insertions, 54 deletions
diff --git a/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll b/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll index 16f028d2e85ab..90a9aa4d95b7d 100644 --- a/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll +++ b/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll @@ -1,8 +1,8 @@ -; RUN: opt -S -simplifycfg -mtriple=arm -relocation-model=static < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE -; RUN: opt -S -simplifycfg -mtriple=arm -relocation-model=pic < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE -; RUN: opt -S -simplifycfg -mtriple=arm -relocation-model=ropi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE -; RUN: opt -S -simplifycfg -mtriple=arm -relocation-model=rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE -; RUN: opt -S -simplifycfg -mtriple=arm -relocation-model=ropi-rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE +; RUN: opt -S -latesimplifycfg -mtriple=arm -relocation-model=static < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE +; RUN: opt -S -latesimplifycfg -mtriple=arm -relocation-model=pic < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE +; RUN: opt -S -latesimplifycfg -mtriple=arm -relocation-model=ropi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE +; RUN: opt -S -latesimplifycfg -mtriple=arm -relocation-model=rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE +; RUN: opt -S -latesimplifycfg -mtriple=arm -relocation-model=ropi-rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE ; CHECK: @{{.*}} = private unnamed_addr constant [3 x i32] [i32 1234, i32 5678, i32 15532] ; ENABLE: @{{.*}} = private unnamed_addr constant [3 x i32*] [i32* @c1, i32* @c2, i32* @c3] diff --git a/test/Transforms/SimplifyCFG/CoveredLookupTable.ll b/test/Transforms/SimplifyCFG/CoveredLookupTable.ll index 8b45a590bb1fb..a42349e3d8742 100644 --- a/test/Transforms/SimplifyCFG/CoveredLookupTable.ll +++ b/test/Transforms/SimplifyCFG/CoveredLookupTable.ll @@ -1,4 +1,4 @@ -; RUN: opt -simplifycfg -S %s | FileCheck %s +; RUN: opt -latesimplifycfg -S %s | FileCheck %s ; rdar://15268442 target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll b/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll index f3e5506ad9339..ae6ff6d10bcf0 100644 --- a/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll +++ b/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -simplifycfg < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s +; RUN: opt -S -latesimplifycfg < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s ; rdar://17887153 target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin12.0.0" diff --git a/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll b/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll index 26008700f5be6..734312bc7285e 100644 --- a/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll +++ b/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -simplifycfg < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s +; RUN: opt -S -latesimplifycfg < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s ; rdar://17735071 target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin12.0.0" diff --git a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll index 81c153483c668..4b9227b029eca 100644 --- a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll +++ b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -simplifycfg -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s +; RUN: opt < %s -latesimplifycfg -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @@ -1178,8 +1178,9 @@ return: ret i32 %retval.0 ; CHECK-LABEL: @reuse_cmp2( ; CHECK: entry: -; CHECK-NEXT: %switch.tableidx = sub i32 %x, 0 -; CHECK-NEXT: [[C:%.+]] = icmp ult i32 %switch.tableidx, 4 +; CHECK-NEXT: %switch = icmp ult i32 %x, 4 +; CHECK-NEXT: %x. = select i1 %switch, i32 %x, i32 4 +; CHECK-NEXT: [[C:%.+]] = icmp ne i32 %x., 4 ; CHECK: [[R:%.+]] = select i1 [[C]], i32 {{.*}}, i32 100 ; CHECK-NEXT: ret i32 [[R]] } diff --git a/test/Transforms/SimplifyCFG/critedge-assume.ll b/test/Transforms/SimplifyCFG/critedge-assume.ll new file mode 100644 index 0000000000000..bfeb65769deb5 --- /dev/null +++ b/test/Transforms/SimplifyCFG/critedge-assume.ll @@ -0,0 +1,83 @@ +; RUN: opt -o %t %s -instcombine -simplifycfg -thinlto-bc -verify-assumption-cache +; RUN: llvm-dis -o - %t | FileCheck %s + +; Test that the simplifycfg pass correctly updates the assumption cache +; when it clones the llvm.assume call as part of creating a critical +; edge. To do that, we set up a pass pipeline such that (1) an assumption +; cache is created for foo before simplifycfg updates it, and (2) foo's +; assumption cache is verified after simplifycfg has run. To satisfy 1, we +; run the instcombine pass first in our pipeline. To satisfy 2, we use the +; ThinLTOBitcodeWriter pass to write bitcode (that pass uses the assumption +; cache). That ensures that the pass manager does not call releaseMemory() +; on the AssumptionCacheTracker before the end of the pipeline, which would +; wipe out the bad assumption cache before it is verified. + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%class.F = type { i8 } +%class.B = type { i8 } +%class.A = type { %class.C } +%class.C = type { i32 (...)** } + +define void @foo(%class.F* %this, %class.B* %out) { +entry: + %call = tail call i32 @_ZNK1F5beginEv(%class.F* %this) + %call2 = tail call i32 @_ZNK1F3endEv(%class.F* %this) + %cmp.i22 = icmp eq i32 %call, %call2 + br i1 %cmp.i22, label %while.end, label %while.body.preheader + +while.body.preheader: + br label %while.body + +while.body: + %frame_node.sroa.0.023 = phi i32 [ %inc.i, %_ZN10unique_ptrD2Ev.exit ], [ %call, %while.body.preheader ] + %call8 = tail call i8* @_Znwm(i64 8) + %inc.i = add nsw i32 %frame_node.sroa.0.023, 1 + %cmp = icmp eq i32 %inc.i, %call2 + br i1 %cmp, label %_ZN10unique_ptrD2Ev.exit, label %if.then + +if.then: + tail call void @_ZN1B6appendEv(%class.B* %out) + br label %_ZN10unique_ptrD2Ev.exit + +_ZN10unique_ptrD2Ev.exit: + %x1 = bitcast i8* %call8 to void (%class.A*)*** + %vtable.i.i = load void (%class.A*)**, void (%class.A*)*** %x1, align 8 + %x2 = bitcast void (%class.A*)** %vtable.i.i to i8* + %x3 = tail call i1 @llvm.type.test(i8* %x2, metadata !"foo") + ; CHECK: call void @llvm.assume + ; CHECK: call void @llvm.assume + tail call void @llvm.assume(i1 %x3) #5 + br i1 %cmp, label %while.end.loopexit, label %while.body + +while.end.loopexit: + br label %while.end + +while.end: + ret void +} + +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) + +declare i32 @_ZNK1F5beginEv(%class.F*) + +declare i32 @_ZNK1F3endEv(%class.F*) + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) + +declare noalias nonnull i8* @_Znwm(i64) + +declare void @_ZN1B6appendEv(%class.B*) + +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) + +declare i1 @llvm.type.test(i8*, metadata) + +declare void @llvm.assume(i1) + +!llvm.module.flags = !{!0} +!llvm.ident = !{!1} + +!0 = !{i32 1, !"PIC Level", i32 2} +!1 = !{!"clang version 5.0.0 "} diff --git a/test/Transforms/SimplifyCFG/div-rem-pairs.ll b/test/Transforms/SimplifyCFG/div-rem-pairs.ll new file mode 100644 index 0000000000000..85ffe1f4e0f37 --- /dev/null +++ b/test/Transforms/SimplifyCFG/div-rem-pairs.ll @@ -0,0 +1,119 @@ +; RUN: opt -simplifycfg -S < %s | FileCheck %s + +; FIXME: Hoist the sdiv because it's safe and free. +; PR31028 - https://bugs.llvm.org/show_bug.cgi?id=31028 + +define i32 @hoist_sdiv(i32 %a, i32 %b) { +; CHECK-LABEL: @hoist_sdiv( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[REM:%.*]] = srem i32 %a, %b +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[REM]], 42 +; CHECK-NEXT: br i1 [[CMP]], label %if, label %end +; CHECK: if: +; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 %a, %b +; CHECK-NEXT: br label %end +; CHECK: end: +; CHECK-NEXT: [[RET:%.*]] = phi i32 [ [[DIV]], %if ], [ 3, %entry ] +; CHECK-NEXT: ret i32 [[RET]] +; +entry: + %rem = srem i32 %a, %b + %cmp = icmp eq i32 %rem, 42 + br i1 %cmp, label %if, label %end + +if: + %div = sdiv i32 %a, %b + br label %end + +end: + %ret = phi i32 [ %div, %if ], [ 3, %entry ] + ret i32 %ret +} + +; FIXME: Hoist the udiv because it's safe and free. + +define i64 @hoist_udiv(i64 %a, i64 %b) { +; CHECK-LABEL: @hoist_udiv( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[REM:%.*]] = urem i64 %a, %b +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[REM]], 42 +; CHECK-NEXT: br i1 [[CMP]], label %if, label %end +; CHECK: if: +; CHECK-NEXT: [[DIV:%.*]] = udiv i64 %a, %b +; CHECK-NEXT: br label %end +; CHECK: end: +; CHECK-NEXT: [[RET:%.*]] = phi i64 [ [[DIV]], %if ], [ 3, %entry ] +; CHECK-NEXT: ret i64 [[RET]] +; +entry: + %rem = urem i64 %a, %b + %cmp = icmp eq i64 %rem, 42 + br i1 %cmp, label %if, label %end + +if: + %div = udiv i64 %a, %b + br label %end + +end: + %ret = phi i64 [ %div, %if ], [ 3, %entry ] + ret i64 %ret +} + +; FIXME: Hoist the srem because it's safe and likely free. + +define i16 @hoist_srem(i16 %a, i16 %b) { +; CHECK-LABEL: @hoist_srem( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[DIV:%.*]] = sdiv i16 %a, %b +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[DIV]], 42 +; CHECK-NEXT: br i1 [[CMP]], label %if, label %end +; CHECK: if: +; CHECK-NEXT: [[REM:%.*]] = srem i16 %a, %b +; CHECK-NEXT: br label %end +; CHECK: end: +; CHECK-NEXT: [[RET:%.*]] = phi i16 [ [[REM]], %if ], [ 3, %entry ] +; CHECK-NEXT: ret i16 [[RET]] +; +entry: + %div = sdiv i16 %a, %b + %cmp = icmp eq i16 %div, 42 + br i1 %cmp, label %if, label %end + +if: + %rem = srem i16 %a, %b + br label %end + +end: + %ret = phi i16 [ %rem, %if ], [ 3, %entry ] + ret i16 %ret +} + +; FIXME: Hoist the urem because it's safe and likely free. + +define i8 @hoist_urem(i8 %a, i8 %b) { +; CHECK-LABEL: @hoist_urem( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[DIV:%.*]] = udiv i8 %a, %b +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[DIV]], 42 +; CHECK-NEXT: br i1 [[CMP]], label %if, label %end +; CHECK: if: +; CHECK-NEXT: [[REM:%.*]] = urem i8 %a, %b +; CHECK-NEXT: br label %end +; CHECK: end: +; CHECK-NEXT: [[RET:%.*]] = phi i8 [ [[REM]], %if ], [ 3, %entry ] +; CHECK-NEXT: ret i8 [[RET]] +; +entry: + %div = udiv i8 %a, %b + %cmp = icmp eq i8 %div, 42 + br i1 %cmp, label %if, label %end + +if: + %rem = urem i8 %a, %b + br label %end + +end: + %ret = phi i8 [ %rem, %if ], [ 3, %entry ] + ret i8 %ret +} + diff --git a/test/Transforms/SimplifyCFG/empty-cleanuppad.ll b/test/Transforms/SimplifyCFG/empty-cleanuppad.ll index 9f657a81a05b9..f2e0114a2a35e 100644 --- a/test/Transforms/SimplifyCFG/empty-cleanuppad.ll +++ b/test/Transforms/SimplifyCFG/empty-cleanuppad.ll @@ -413,14 +413,14 @@ return: ; preds = %invoke.cont, %catch define i32 @f9() personality i32 (...)* @__CxxFrameHandler3 { entry: %s = alloca i8, align 1 - call void @llvm.lifetime.start(i64 1, i8* nonnull %s) + call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %s) %bc = bitcast i8* %s to %struct.S2* invoke void @"\01??1S2@@QEAA@XZ"(%struct.S2* %bc) to label %try.cont unwind label %ehcleanup ehcleanup: %cleanup.pad = cleanuppad within none [] - call void @llvm.lifetime.end(i64 1, i8* nonnull %s) + call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %s) cleanupret from %cleanup.pad unwind label %catch.dispatch catch.dispatch: @@ -466,5 +466,5 @@ declare void @use_x(i32 %x) declare i32 @__CxxFrameHandler3(...) -declare void @llvm.lifetime.start(i64, i8* nocapture) -declare void @llvm.lifetime.end(i64, i8* nocapture) +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) diff --git a/test/Transforms/SimplifyCFG/lifetime.ll b/test/Transforms/SimplifyCFG/lifetime.ll index 7c66be5295007..270fe4d544228 100644 --- a/test/Transforms/SimplifyCFG/lifetime.ll +++ b/test/Transforms/SimplifyCFG/lifetime.ll @@ -10,11 +10,11 @@ define void @foo(i1 %x) { entry: %a = alloca i8 - call void @llvm.lifetime.start(i64 -1, i8* %a) nounwind + call void @llvm.lifetime.start.p0i8(i64 -1, i8* %a) nounwind br i1 %x, label %bb0, label %bb1 bb0: - call void @llvm.lifetime.end(i64 -1, i8* %a) nounwind + call void @llvm.lifetime.end.p0i8(i64 -1, i8* %a) nounwind br label %bb1 bb1: @@ -24,6 +24,6 @@ bb1: declare void @f() -declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) nounwind -declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) nounwind diff --git a/test/Transforms/SimplifyCFG/merge-cond-stores.ll b/test/Transforms/SimplifyCFG/merge-cond-stores.ll index 77e3158d9bbde..d5d0224a4b24c 100644 --- a/test/Transforms/SimplifyCFG/merge-cond-stores.ll +++ b/test/Transforms/SimplifyCFG/merge-cond-stores.ll @@ -1,16 +1,21 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -simplifycfg -instcombine < %s -simplifycfg-merge-cond-stores=true -simplifycfg-merge-cond-stores-aggressively=false -phi-node-folding-threshold=2 -S | FileCheck %s -; CHECK-LABEL: @test_simple ; This test should succeed and end up if-converted. -; CHECK: icmp eq i32 %b, 0 -; CHECK-NEXT: icmp ne i32 %a, 0 -; CHECK-NEXT: xor i1 %x2, true -; CHECK-NEXT: %[[x:.*]] = or i1 %{{.*}}, %{{.*}} -; CHECK-NEXT: br i1 %[[x]] -; CHECK: store -; CHECK-NOT: store -; CHECK: ret define void @test_simple(i32* %p, i32 %a, i32 %b) { +; CHECK-LABEL: @test_simple( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i32 [[A:%.*]], 0 +; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B:%.*]], 0 +; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[X2]], true +; CHECK-NEXT: [[TMP2:%.*]] = or i1 [[TMP0]], [[TMP1]] +; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] +; CHECK: [[NOT_X2:%.*]] = xor i1 [[X2]], true +; CHECK-NEXT: [[DOT:%.*]] = zext i1 [[NOT_X2]] to i32 +; CHECK-NEXT: store i32 [[DOT]], i32* [[P:%.*]], align 4 +; CHECK-NEXT: br label [[TMP4]] +; CHECK: ret void +; entry: %x1 = icmp eq i32 %a, 0 br i1 %x1, label %fallthrough, label %yes1 @@ -31,12 +36,26 @@ end: ret void } -; CHECK-LABEL: @test_recursive ; This test should entirely fold away, leaving one large basic block. -; CHECK: store -; CHECK-NOT: store -; CHECK: ret define void @test_recursive(i32* %p, i32 %a, i32 %b, i32 %c, i32 %d) { +; CHECK-LABEL: @test_recursive( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = or i32 [[B:%.*]], [[A:%.*]] +; CHECK-NEXT: [[X4:%.*]] = icmp eq i32 [[D:%.*]], 0 +; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[TMP0]], [[C:%.*]] +; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], 0 +; CHECK-NEXT: [[TMP2:%.*]] = xor i1 [[X4]], true +; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP3]], [[TMP2]] +; CHECK-NEXT: br i1 [[TMP4]], label [[TMP5:%.*]], label [[TMP6:%.*]] +; CHECK: [[X3:%.*]] = icmp eq i32 [[C]], 0 +; CHECK-NEXT: [[NOT_X2:%.*]] = icmp ne i32 [[B]], 0 +; CHECK-NEXT: [[DOT:%.*]] = zext i1 [[NOT_X2]] to i32 +; CHECK-NEXT: [[DOT_:%.*]] = select i1 [[X3]], i32 [[DOT]], i32 2 +; CHECK-NEXT: [[DOT__:%.*]] = select i1 [[X4]], i32 [[DOT_]], i32 3 +; CHECK-NEXT: store i32 [[DOT__]], i32* [[P:%.*]], align 4 +; CHECK-NEXT: br label [[TMP6]] +; CHECK: ret void +; entry: %x1 = icmp eq i32 %a, 0 br i1 %x1, label %fallthrough, label %yes1 @@ -74,13 +93,31 @@ end: ret void } -; CHECK-LABEL: @test_not_ifconverted ; The code in each diamond is too large - it won't be if-converted so our ; heuristics should say no. -; CHECK: store -; CHECK: store -; CHECK: ret define void @test_not_ifconverted(i32* %p, i32 %a, i32 %b) { +; CHECK-LABEL: @test_not_ifconverted( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 +; CHECK-NEXT: br i1 [[X1]], label [[FALLTHROUGH:%.*]], label [[YES1:%.*]] +; CHECK: yes1: +; CHECK-NEXT: [[Y1:%.*]] = or i32 [[B:%.*]], 55 +; CHECK-NEXT: [[Y2:%.*]] = add i32 [[Y1]], 24 +; CHECK-NEXT: [[Y3:%.*]] = and i32 [[Y2]], 67 +; CHECK-NEXT: store i32 [[Y3]], i32* [[P:%.*]], align 4 +; CHECK-NEXT: br label [[FALLTHROUGH]] +; CHECK: fallthrough: +; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B]], 0 +; CHECK-NEXT: br i1 [[X2]], label [[END:%.*]], label [[YES2:%.*]] +; CHECK: yes2: +; CHECK-NEXT: [[Z1:%.*]] = or i32 [[A]], 55 +; CHECK-NEXT: [[Z2:%.*]] = add i32 [[Z1]], 24 +; CHECK-NEXT: [[Z3:%.*]] = and i32 [[Z2]], 67 +; CHECK-NEXT: store i32 [[Z3]], i32* [[P]], align 4 +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: ret void +; entry: %x1 = icmp eq i32 %a, 0 br i1 %x1, label %fallthrough, label %yes1 @@ -107,13 +144,26 @@ end: ret void } -; CHECK-LABEL: @test_aliasing1 ; The store to %p clobbers the previous store, so if-converting this would ; be illegal. -; CHECK: store -; CHECK: store -; CHECK: ret define void @test_aliasing1(i32* %p, i32 %a, i32 %b) { +; CHECK-LABEL: @test_aliasing1( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 +; CHECK-NEXT: br i1 [[X1]], label [[FALLTHROUGH:%.*]], label [[YES1:%.*]] +; CHECK: yes1: +; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 +; CHECK-NEXT: br label [[FALLTHROUGH]] +; CHECK: fallthrough: +; CHECK-NEXT: [[Y1:%.*]] = load i32, i32* [[P]], align 4 +; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[Y1]], 0 +; CHECK-NEXT: br i1 [[X2]], label [[END:%.*]], label [[YES2:%.*]] +; CHECK: yes2: +; CHECK-NEXT: store i32 1, i32* [[P]], align 4 +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: ret void +; entry: %x1 = icmp eq i32 %a, 0 br i1 %x1, label %fallthrough, label %yes1 @@ -135,12 +185,25 @@ end: ret void } -; CHECK-LABEL: @test_aliasing2 ; The load from %q aliases with %p, so if-converting this would be illegal. -; CHECK: store -; CHECK: store -; CHECK: ret define void @test_aliasing2(i32* %p, i32* %q, i32 %a, i32 %b) { +; CHECK-LABEL: @test_aliasing2( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 +; CHECK-NEXT: br i1 [[X1]], label [[FALLTHROUGH:%.*]], label [[YES1:%.*]] +; CHECK: yes1: +; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 +; CHECK-NEXT: br label [[FALLTHROUGH]] +; CHECK: fallthrough: +; CHECK-NEXT: [[Y1:%.*]] = load i32, i32* [[Q:%.*]], align 4 +; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[Y1]], 0 +; CHECK-NEXT: br i1 [[X2]], label [[END:%.*]], label [[YES2:%.*]] +; CHECK: yes2: +; CHECK-NEXT: store i32 1, i32* [[P]], align 4 +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: ret void +; entry: %x1 = icmp eq i32 %a, 0 br i1 %x1, label %fallthrough, label %yes1 @@ -164,12 +227,24 @@ end: declare void @f() -; CHECK-LABEL: @test_diamond_simple ; This should get if-converted. -; CHECK: store -; CHECK-NOT: store -; CHECK: ret define i32 @test_diamond_simple(i32* %p, i32* %q, i32 %a, i32 %b) { +; CHECK-LABEL: @test_diamond_simple( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 +; CHECK-NEXT: [[Z1:%.*]] = add i32 [[A]], [[B:%.*]] +; CHECK-NEXT: [[Z2:%.*]] = select i1 [[X1]], i32 [[Z1]], i32 0 +; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B]], 0 +; CHECK-NEXT: [[Z3:%.*]] = sub i32 [[Z2]], [[B]] +; CHECK-NEXT: [[Z4:%.*]] = select i1 [[X2]], i32 [[Z3]], i32 3 +; CHECK-NEXT: [[TMP0:%.*]] = or i32 [[A]], [[B]] +; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 0 +; CHECK-NEXT: br i1 [[TMP1]], label [[TMP3:%.*]], label [[TMP2:%.*]] +; CHECK: [[SIMPLIFYCFG_MERGE:%.*]] = select i1 [[X2]], i32 [[Z2]], i32 1 +; CHECK-NEXT: store i32 [[SIMPLIFYCFG_MERGE]], i32* [[P:%.*]], align 4 +; CHECK-NEXT: br label [[TMP3]] +; CHECK: ret i32 [[Z4]] +; entry: %x1 = icmp eq i32 %a, 0 br i1 %x1, label %no1, label %yes1 @@ -200,14 +275,36 @@ end: ret i32 %z4 } -; CHECK-LABEL: @test_diamond_alias3 ; Now there is a call to f() in the bottom branch. The store in the first ; branch would now be reordered with respect to the call if we if-converted, ; so we must not. -; CHECK: store -; CHECK: store -; CHECK: ret define i32 @test_diamond_alias3(i32* %p, i32* %q, i32 %a, i32 %b) { +; CHECK-LABEL: @test_diamond_alias3( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 +; CHECK-NEXT: br i1 [[X1]], label [[NO1:%.*]], label [[YES1:%.*]] +; CHECK: yes1: +; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 +; CHECK-NEXT: br label [[FALLTHROUGH:%.*]] +; CHECK: no1: +; CHECK-NEXT: call void @f() +; CHECK-NEXT: [[Z1:%.*]] = add i32 [[A]], [[B:%.*]] +; CHECK-NEXT: br label [[FALLTHROUGH]] +; CHECK: fallthrough: +; CHECK-NEXT: [[Z2:%.*]] = phi i32 [ [[Z1]], [[NO1]] ], [ 0, [[YES1]] ] +; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B]], 0 +; CHECK-NEXT: br i1 [[X2]], label [[NO2:%.*]], label [[YES2:%.*]] +; CHECK: yes2: +; CHECK-NEXT: store i32 1, i32* [[P]], align 4 +; CHECK-NEXT: br label [[END:%.*]] +; CHECK: no2: +; CHECK-NEXT: call void @f() +; CHECK-NEXT: [[Z3:%.*]] = sub i32 [[Z2]], [[B]] +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: [[Z4:%.*]] = phi i32 [ [[Z3]], [[NO2]] ], [ 3, [[YES2]] ] +; CHECK-NEXT: ret i32 [[Z4]] +; entry: %x1 = icmp eq i32 %a, 0 br i1 %x1, label %no1, label %yes1 diff --git a/test/Transforms/SimplifyCFG/rangereduce.ll b/test/Transforms/SimplifyCFG/rangereduce.ll index 36e932b37be54..13bbdfe83d079 100644 --- a/test/Transforms/SimplifyCFG/rangereduce.ll +++ b/test/Transforms/SimplifyCFG/rangereduce.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s +; RUN: opt < %s -latesimplifycfg -S | FileCheck %s target datalayout = "e-n32" diff --git a/test/Transforms/SimplifyCFG/remove-debug-2.ll b/test/Transforms/SimplifyCFG/remove-debug-2.ll new file mode 100644 index 0000000000000..6362f53e14c15 --- /dev/null +++ b/test/Transforms/SimplifyCFG/remove-debug-2.ll @@ -0,0 +1,68 @@ +; RUN: opt < %s -simplifycfg -S | FileCheck %s + +; Check if the debug info for hoisted store for "ret = 0" is removed +; +; int foo(int x) { +; int ret = 1; +; if (x) +; ret = 0; +; return ret; +; } +; +; CHECK: store i32 1,{{.+}}!dbg ![[DLOC1:[0-9]+]] +; CHECK: icmp ne {{.+}}!dbg ![[DLOC2:[0-9]+]] +; CHECK: [[VREG:%[^ ]+]] = select +; CHECK: store i32 [[VREG]] +; CHECK-NOT: !dbg +; CHECK-SAME: {{$}} +; CHECK: ret {{.+}}!dbg ![[DLOC3:[0-9]+]] +; CHECK: ![[DLOC1]] = !DILocation(line: 2 +; CHECK: ![[DLOC2]] = !DILocation(line: 3 +; CHECK: ![[DLOC3]] = !DILocation(line: 5 + +target triple = "x86_64-unknown-linux-gnu" + +; Function Attrs: noinline nounwind uwtable +define i32 @foo(i32) !dbg !6 { + %2 = alloca i32, align 4 + %3 = alloca i32, align 4 + store i32 %0, i32* %2, align 4 + store i32 1, i32* %3, align 4, !dbg !14 + %4 = load i32, i32* %2, align 4, !dbg !15 + %5 = icmp ne i32 %4, 0, !dbg !15 + br i1 %5, label %6, label %7, !dbg !17 + +; <label>:6: ; preds = %1 + store i32 0, i32* %3, align 4, !dbg !18 + br label %7, !dbg !19 + +; <label>:7: ; preds = %6, %1 + %8 = load i32, i32* %3, align 4, !dbg !20 + ret i32 %8, !dbg !21 +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1) +!1 = !DIFile(filename: "foo.c", directory: "b/") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{} +!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) +!7 = !DISubroutineType(types: !8) +!8 = !{!9, !9} +!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!10 = !DILocalVariable(name: "x", arg: 1, scope: !6, file: !1, line: 1, type: !9) +!11 = !DIExpression() +!12 = !DILocation(line: 1, column: 13, scope: !6) +!13 = !DILocalVariable(name: "ret", scope: !6, file: !1, line: 2, type: !9) +!14 = !DILocation(line: 2, column: 7, scope: !6) +!15 = !DILocation(line: 3, column: 7, scope: !16) +!16 = distinct !DILexicalBlock(scope: !6, file: !1, line: 3, column: 7) +!17 = !DILocation(line: 3, column: 7, scope: !6) +!18 = !DILocation(line: 4, column: 9, scope: !16) +!19 = !DILocation(line: 4, column: 5, scope: !16) +!20 = !DILocation(line: 5, column: 10, scope: !6) +!21 = !DILocation(line: 5, column: 3, scope: !6) diff --git a/test/Transforms/SimplifyCFG/switch_create.ll b/test/Transforms/SimplifyCFG/switch_create.ll index 29d3a34a05e62..c752636ae83da 100644 --- a/test/Transforms/SimplifyCFG/switch_create.ll +++ b/test/Transforms/SimplifyCFG/switch_create.ll @@ -1,5 +1,5 @@ ; RUN: opt -S -simplifycfg < %s | FileCheck %s -; RUN: opt -S -default-data-layout="p:32:32-p1:16:16" -simplifycfg < %s | FileCheck -check-prefix=CHECK -check-prefix=DL %s +; RUN: opt -S -data-layout="p:32:32-p1:16:16" -simplifycfg < %s | FileCheck -check-prefix=CHECK -check-prefix=DL %s declare void @foo1() |