mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-24 12:29:33 +00:00
by my refactoring of this code. The method isSafeToLoadUnconditionally assumes that the load will proceed with the preferred type alignment. Given that, it has to ensure that the alloca or global is at least that aligned. It has always done this historically when a datalayout is present, but has never checked it when the datalayout is absent. When I refactored the code in r220156, I exposed this path when datalayout was present and that turned the latent bug into a patent bug. This fixes the issue by just removing the special case which allows folding things without datalayout. This isn't worth the complexity of trying to tease apart when it is or isn't safe without actually knowing the preferred alignment. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220161 91177308-0d34-0410-b5e6-96231b3b80d8
122 lines
2.9 KiB
LLVM
122 lines
2.9 KiB
LLVM
; RUN: opt -instcombine -S < %s | FileCheck %s
|
|
|
|
; This test makes sure that these instructions are properly eliminated.
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
@X = constant i32 42 ; <i32*> [#uses=2]
|
|
@X2 = constant i32 47 ; <i32*> [#uses=1]
|
|
@Y = constant [2 x { i32, float }] [ { i32, float } { i32 12, float 1.000000e+00 }, { i32, float } { i32 37, float 0x3FF3B2FEC0000000 } ] ; <[2 x { i32, float }]*> [#uses=2]
|
|
@Z = constant [2 x { i32, float }] zeroinitializer ; <[2 x { i32, float }]*> [#uses=1]
|
|
|
|
@GLOBAL = internal constant [4 x i32] zeroinitializer
|
|
|
|
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK-NOT: load
|
|
define i32 @test1() {
|
|
%B = load i32* @X ; <i32> [#uses=1]
|
|
ret i32 %B
|
|
}
|
|
|
|
; CHECK-LABEL: @test2(
|
|
; CHECK-NOT: load
|
|
define float @test2() {
|
|
%A = getelementptr [2 x { i32, float }]* @Y, i64 0, i64 1, i32 1 ; <float*> [#uses=1]
|
|
%B = load float* %A ; <float> [#uses=1]
|
|
ret float %B
|
|
}
|
|
|
|
; CHECK-LABEL: @test3(
|
|
; CHECK-NOT: load
|
|
define i32 @test3() {
|
|
%A = getelementptr [2 x { i32, float }]* @Y, i64 0, i64 0, i32 0 ; <i32*> [#uses=1]
|
|
%B = load i32* %A ; <i32> [#uses=1]
|
|
ret i32 %B
|
|
}
|
|
|
|
; CHECK-LABEL: @test4(
|
|
; CHECK-NOT: load
|
|
define i32 @test4() {
|
|
%A = getelementptr [2 x { i32, float }]* @Z, i64 0, i64 1, i32 0 ; <i32*> [#uses=1]
|
|
%B = load i32* %A ; <i32> [#uses=1]
|
|
ret i32 %B
|
|
}
|
|
|
|
; CHECK-LABEL: @test5(
|
|
; CHECK-NOT: load
|
|
define i32 @test5(i1 %C) {
|
|
%Y = select i1 %C, i32* @X, i32* @X2 ; <i32*> [#uses=1]
|
|
%Z = load i32* %Y ; <i32> [#uses=1]
|
|
ret i32 %Z
|
|
}
|
|
|
|
; CHECK-LABEL: @test7(
|
|
; CHECK-NOT: load
|
|
define i32 @test7(i32 %X) {
|
|
%V = getelementptr i32* null, i32 %X ; <i32*> [#uses=1]
|
|
%R = load i32* %V ; <i32> [#uses=1]
|
|
ret i32 %R
|
|
}
|
|
|
|
; CHECK-LABEL: @test8(
|
|
; CHECK-NOT: load
|
|
define i32 @test8(i32* %P) {
|
|
store i32 1, i32* %P
|
|
%X = load i32* %P ; <i32> [#uses=1]
|
|
ret i32 %X
|
|
}
|
|
|
|
; CHECK-LABEL: @test9(
|
|
; CHECK-NOT: load
|
|
define i32 @test9(i32* %P) {
|
|
%X = load i32* %P ; <i32> [#uses=1]
|
|
%Y = load i32* %P ; <i32> [#uses=1]
|
|
%Z = sub i32 %X, %Y ; <i32> [#uses=1]
|
|
ret i32 %Z
|
|
}
|
|
|
|
; CHECK-LABEL: @test10(
|
|
; CHECK-NOT: load
|
|
define i32 @test10(i1 %C.upgrd.1, i32* %P, i32* %Q) {
|
|
br i1 %C.upgrd.1, label %T, label %F
|
|
T: ; preds = %0
|
|
store i32 1, i32* %Q
|
|
store i32 0, i32* %P
|
|
br label %C
|
|
F: ; preds = %0
|
|
store i32 0, i32* %P
|
|
br label %C
|
|
C: ; preds = %F, %T
|
|
%V = load i32* %P ; <i32> [#uses=1]
|
|
ret i32 %V
|
|
}
|
|
|
|
; CHECK-LABEL: @test11(
|
|
; CHECK-NOT: load
|
|
define double @test11(double* %p) {
|
|
%t0 = getelementptr double* %p, i32 1
|
|
store double 2.0, double* %t0
|
|
%t1 = getelementptr double* %p, i32 1
|
|
%x = load double* %t1
|
|
ret double %x
|
|
}
|
|
|
|
; CHECK-LABEL: @test12(
|
|
; CHECK-NOT: load
|
|
define i32 @test12(i32* %P) {
|
|
%A = alloca i32
|
|
store i32 123, i32* %A
|
|
; Cast the result of the load not the source
|
|
%Q = bitcast i32* %A to i32*
|
|
%V = load i32* %Q
|
|
ret i32 %V
|
|
}
|
|
|
|
; CHECK-LABEL: @test13(
|
|
; CHECK-NOT: load
|
|
define <16 x i8> @test13(<2 x i64> %x) {
|
|
%tmp = load <16 x i8>* bitcast ([4 x i32]* @GLOBAL to <16 x i8>*)
|
|
ret <16 x i8> %tmp
|
|
}
|