| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -passes=dse -S | FileCheck %s |
| |
| target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" |
| |
| |
| define void @test4(ptr noalias %P) { |
| ; CHECK-LABEL: @test4( |
| ; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] |
| ; CHECK: bb1: |
| ; CHECK-NEXT: br label [[BB3:%.*]] |
| ; CHECK: bb2: |
| ; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4 |
| ; CHECK-NEXT: br label [[BB3]] |
| ; CHECK: bb3: |
| ; CHECK-NEXT: store i32 1, ptr [[P]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| store i32 0, ptr %P |
| br i1 true, label %bb1, label %bb2 |
| bb1: |
| br label %bb3 |
| bb2: |
| %x = load i32, ptr %P |
| br label %bb3 |
| bb3: |
| store i32 1, ptr %P |
| ret void |
| } |
| |
| define void @test5(ptr noalias %P) { |
| ; CHECK-LABEL: @test5( |
| ; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] |
| ; CHECK: bb1: |
| ; CHECK-NEXT: br label [[BB3:%.*]] |
| ; CHECK: bb2: |
| ; CHECK-NEXT: br label [[BB3]] |
| ; CHECK: bb3: |
| ; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| br i1 true, label %bb1, label %bb2 |
| bb1: |
| store i32 1, ptr %P |
| br label %bb3 |
| bb2: |
| store i32 1, ptr %P |
| br label %bb3 |
| bb3: |
| store i32 0, ptr %P |
| ret void |
| } |
| |
| define void @test8(ptr %P, ptr %Q) { |
| ; CHECK-LABEL: @test8( |
| ; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] |
| ; CHECK: bb1: |
| ; CHECK-NEXT: br label [[BB3:%.*]] |
| ; CHECK: bb2: |
| ; CHECK-NEXT: store i32 1, ptr [[Q:%.*]], align 4 |
| ; CHECK-NEXT: br label [[BB3]] |
| ; CHECK: bb3: |
| ; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| br i1 true, label %bb1, label %bb2 |
| bb1: |
| store i32 1, ptr %P |
| br label %bb3 |
| bb2: |
| store i32 1, ptr %Q |
| br label %bb3 |
| bb3: |
| store i32 0, ptr %P |
| ret void |
| } |
| |
| define void @test10(ptr noalias %P) { |
| ; CHECK-LABEL: @test10( |
| ; CHECK-NEXT: store i32 1, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] |
| ; CHECK: bb1: |
| ; CHECK-NEXT: br label [[BB3:%.*]] |
| ; CHECK: bb2: |
| ; CHECK-NEXT: br label [[BB3]] |
| ; CHECK: bb3: |
| ; CHECK-NEXT: ret void |
| ; |
| store i32 0, ptr %P |
| br i1 true, label %bb1, label %bb2 |
| bb1: |
| br label %bb3 |
| bb2: |
| br label %bb3 |
| bb3: |
| store i8 1, ptr %P |
| ret void |
| } |
| |
| declare void @hoge() |
| |
| ; Check a function with a MemoryPhi with 3 incoming values. |
| define void @widget(ptr %Ptr, i1 %c1, i1 %c2, i32 %v1, i32 %v2, i32 %v3) { |
| ; CHECK-LABEL: @widget( |
| ; CHECK-NEXT: bb: |
| ; CHECK-NEXT: tail call void @hoge() |
| ; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB3:%.*]], label [[BB1:%.*]] |
| ; CHECK: bb1: |
| ; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB2:%.*]], label [[BB3]] |
| ; CHECK: bb2: |
| ; CHECK-NEXT: br label [[BB3]] |
| ; CHECK: bb3: |
| ; CHECK-NEXT: br label [[BB4:%.*]] |
| ; CHECK: bb4: |
| ; CHECK-NEXT: switch i32 [[V1:%.*]], label [[BB8:%.*]] [ |
| ; CHECK-NEXT: i32 0, label [[BB5:%.*]] |
| ; CHECK-NEXT: i32 1, label [[BB6:%.*]] |
| ; CHECK-NEXT: i32 2, label [[BB7:%.*]] |
| ; CHECK-NEXT: ] |
| ; CHECK: bb5: |
| ; CHECK-NEXT: store i32 0, ptr [[PTR:%.*]], align 4 |
| ; CHECK-NEXT: br label [[BB8]] |
| ; CHECK: bb6: |
| ; CHECK-NEXT: store i32 1, ptr [[PTR]], align 4 |
| ; CHECK-NEXT: br label [[BB8]] |
| ; CHECK: bb7: |
| ; CHECK-NEXT: store i32 2, ptr [[PTR]], align 4 |
| ; CHECK-NEXT: br label [[BB8]] |
| ; CHECK: bb8: |
| ; CHECK-NEXT: br label [[BB4]] |
| ; |
| bb: |
| tail call void @hoge() |
| br i1 %c1, label %bb3, label %bb1 |
| |
| bb1: ; preds = %bb |
| br i1 %c2, label %bb2, label %bb3 |
| |
| bb2: ; preds = %bb1 |
| store i32 -1, ptr %Ptr, align 4 |
| br label %bb3 |
| |
| bb3: ; preds = %bb2, %bb1, %bb |
| br label %bb4 |
| |
| bb4: ; preds = %bb8, %bb3 |
| switch i32 %v1, label %bb8 [ |
| i32 0, label %bb5 |
| i32 1, label %bb6 |
| i32 2, label %bb7 |
| ] |
| |
| bb5: ; preds = %bb4 |
| store i32 0, ptr %Ptr, align 4 |
| br label %bb8 |
| |
| bb6: ; preds = %bb4 |
| store i32 1, ptr %Ptr, align 4 |
| br label %bb8 |
| |
| bb7: ; preds = %bb4 |
| store i32 2, ptr %Ptr, align 4 |
| br label %bb8 |
| |
| bb8: ; preds = %bb7, %bb6, %bb5, %bb4 |
| br label %bb4 |
| } |
| |
| |
| declare void @fn1_test11() |
| declare void @fn2_test11() |
| |
| define void @test11(i1 %c, ptr %ptr.1) { |
| ; CHECK-LABEL: @test11( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[EXIT:%.*]] |
| ; CHECK: if.then: |
| ; CHECK-NEXT: tail call void @fn2_test11() #0 |
| ; CHECK-NEXT: br label [[EXIT]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: store ptr null, ptr [[PTR_1:%.*]], align 8 |
| ; CHECK-NEXT: tail call void @fn2_test11() #0 |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br i1 %c, label %if.then, label %exit |
| |
| if.then: ; preds = %entry |
| tail call void @fn2_test11() #1 |
| br label %exit |
| |
| exit: |
| store ptr null, ptr %ptr.1, align 8 |
| tail call void @fn2_test11() #1 |
| ret void |
| } |
| |
| attributes #1 = { nounwind } |