mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 20:29:48 +00:00
98d6d2372f
In theory this could be extended to other instructions, eg. division by zero, but it's likely that it will "miscompile" some code because people depend on div by zero not trapping. NULL pointer dereference usually leads to a crash so we should be on the safe side. This shrinks the size of a Release clang by 16k on x86_64. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138618 91177308-0d34-0410-b5e6-96231b3b80d8
88 lines
2.6 KiB
LLVM
88 lines
2.6 KiB
LLVM
; RUN: opt -simplifycfg -S < %s | FileCheck %s
|
|
|
|
declare void @bar() nounwind
|
|
|
|
define i32 @test1(i32* %a, i32 %b, i32* %c, i32 %d) nounwind {
|
|
entry:
|
|
%tobool = icmp eq i32 %b, 0
|
|
br i1 %tobool, label %if.else, label %if.then
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void @bar() nounwind
|
|
br label %if.end7
|
|
|
|
if.else: ; preds = %entry
|
|
%tobool3 = icmp eq i32 %d, 0
|
|
br i1 %tobool3, label %if.end7, label %if.then4
|
|
|
|
if.then4: ; preds = %if.else
|
|
tail call void @bar() nounwind
|
|
br label %if.end7
|
|
|
|
if.end7: ; preds = %if.else, %if.then4, %if.then
|
|
%x.0 = phi i32* [ %a, %if.then ], [ %c, %if.then4 ], [ null, %if.else ]
|
|
%tmp9 = load i32* %x.0
|
|
ret i32 %tmp9
|
|
|
|
; CHECK: @test1
|
|
; CHECK: if.else:
|
|
; CHECK: br label %if.end7
|
|
|
|
; CHECK: phi i32* [ %a, %if.then ], [ %c, %if.else ]
|
|
}
|
|
|
|
define i32 @test2(i32* %a, i32 %b, i32* %c, i32 %d) nounwind {
|
|
entry:
|
|
%tobool = icmp eq i32 %b, 0
|
|
br i1 %tobool, label %if.else, label %if.then
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void @bar() nounwind
|
|
br label %if.end7
|
|
|
|
if.else: ; preds = %entry
|
|
%tobool3 = icmp eq i32 %d, 0
|
|
br i1 %tobool3, label %if.end7, label %if.then4
|
|
|
|
if.then4: ; preds = %if.else
|
|
tail call void @bar() nounwind
|
|
br label %if.end7
|
|
|
|
if.end7: ; preds = %if.else, %if.then4, %if.then
|
|
%x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ]
|
|
%tmp9 = load i32* %x.0
|
|
ret i32 %tmp9
|
|
; CHECK: @test2
|
|
; CHECK: if.else:
|
|
; CHECK: unreachable
|
|
|
|
; CHECK-NOT: phi
|
|
}
|
|
|
|
define i32 @test3(i32* %a, i32 %b, i32* %c, i32 %d) nounwind {
|
|
entry:
|
|
%tobool = icmp eq i32 %b, 0
|
|
br i1 %tobool, label %if.else, label %if.then
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void @bar() nounwind
|
|
br label %if.end7
|
|
|
|
if.else: ; preds = %entry
|
|
%tobool3 = icmp eq i32 %d, 0
|
|
br i1 %tobool3, label %if.end7, label %if.then4
|
|
|
|
if.then4: ; preds = %if.else
|
|
tail call void @bar() nounwind
|
|
br label %if.end7
|
|
|
|
if.end7: ; preds = %if.else, %if.then4, %if.then
|
|
%x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ]
|
|
tail call void @bar() nounwind
|
|
%tmp9 = load i32* %x.0
|
|
ret i32 %tmp9
|
|
; CHECK: @test3
|
|
; CHECK: if.end7:
|
|
; CHECK: phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ]
|
|
}
|