mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-19 01:34:32 +00:00
43873d4f73
When GlobalOpt has determined that a GlobalVariable only ever has two values, it would convert the GlobalVariable to a boolean, and introduce SelectInsts at every load, to choose between the two possible values. These SelectInsts introduce overhead and other unpleasantness. This patch makes GlobalOpt just add range metadata to loads from such GlobalVariables instead. This enables the same main optimization (as seen in test/Transforms/GlobalOpt/integer-bool.ll), without introducing selects. The main downside is that it doesn't get the memory savings of shrinking such GlobalVariables, but this is expected to be negligible. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204076 91177308-0d34-0410-b5e6-96231b3b80d8
30 lines
613 B
LLVM
30 lines
613 B
LLVM
; RUN: opt < %s -S -globalopt -instcombine | FileCheck %s
|
|
;; check that global opt annotates loads from global variales that only hold 0 or 1
|
|
;; such that instcombine can optimize accordingly.
|
|
|
|
@G = internal addrspace(1) global i32 0
|
|
; CHECK: @G
|
|
; CHECK: addrspace(1)
|
|
; CHECK: global i32 0
|
|
|
|
define void @set1() {
|
|
store i32 0, i32 addrspace(1)* @G
|
|
; CHECK: store i32 0
|
|
ret void
|
|
}
|
|
|
|
define void @set2() {
|
|
store i32 1, i32 addrspace(1)* @G
|
|
; CHECK: store i32 1
|
|
ret void
|
|
}
|
|
|
|
define i1 @get() {
|
|
; CHECK-LABEL: @get(
|
|
%A = load i32 addrspace(1) * @G
|
|
%C = icmp slt i32 %A, 2
|
|
ret i1 %C
|
|
; CHECK: ret i1 true
|
|
}
|
|
|