| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- ; RUN: opt < %s -simplifycfg -S | \
- ; RUN: not grep "call void @DEAD"
- ; Test that we can thread a simple known condition through switch statements.
- declare void @foo1()
- declare void @foo2()
- declare void @DEAD()
- define void @test1(i32 %V) {
- switch i32 %V, label %A [
- i32 4, label %T
- i32 17, label %Done
- i32 1234, label %A
- ]
- ;; V == 4 if we get here.
- T: ; preds = %0
- call void @foo1( )
- ;; This switch is always statically determined.
- switch i32 %V, label %A2 [
- i32 4, label %B
- i32 17, label %C
- i32 42, label %C
- ]
- A2: ; preds = %T
- call void @DEAD( )
- call void @DEAD( )
- ;; always true
- %cond2 = icmp eq i32 %V, 4 ; <i1> [#uses=1]
- br i1 %cond2, label %Done, label %C
- A: ; preds = %0, %0
- call void @foo1( )
- ;; always true
- %cond = icmp ne i32 %V, 4 ; <i1> [#uses=1]
- br i1 %cond, label %Done, label %C
- Done: ; preds = %B, %A, %A2, %0
- ret void
- B: ; preds = %T
- call void @foo2( )
- ;; always true
- %cond3 = icmp eq i32 %V, 4 ; <i1> [#uses=1]
- br i1 %cond3, label %Done, label %C
- C: ; preds = %B, %A, %A2, %T, %T
- call void @DEAD( )
- ret void
- }
- define void @test2(i32 %V) {
- switch i32 %V, label %A [
- i32 4, label %T
- i32 17, label %D
- i32 1234, label %E
- ]
- ;; V != 4, 17, 1234 here.
- A: ; preds = %0
- call void @foo1( )
- ;; This switch is always statically determined.
- switch i32 %V, label %E [
- i32 4, label %C
- i32 17, label %C
- i32 42, label %D
- ]
- ;; unreacahble.
- C: ; preds = %A, %A
- call void @DEAD( )
- ret void
- T: ; preds = %0
- call void @foo1( )
- call void @foo1( )
- ret void
- D: ; preds = %A, %0
- call void @foo1( )
- ret void
- E: ; preds = %A, %0
- ret void
- }
|