mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-24 21:42:54 +02:00
a70ceeeee1
This change reverts: r293061: "[InstCombine] Canonicalize guards for NOT OR condition" r293058: "[InstCombine] Canonicalize guards for AND condition" They miscompile cases like: ``` declare void @llvm.experimental.guard(i1, ...) define void @test_guard_not_or(i1 %A, i1 %B) { %C = or i1 %A, %B %D = xor i1 %C, true call void(i1, ...) @llvm.experimental.guard(i1 %D, i32 20, i32 30)[ "deopt"() ] ret void } ``` because they do transfer the `i32 20, i32 30` parameters to newly created guard instructions. llvm-svn: 293227
31 lines
1.4 KiB
LLVM
31 lines
1.4 KiB
LLVM
; RUN: opt < %s -instcombine -S | FileCheck %s
|
|
|
|
declare void @llvm.experimental.guard(i1, ...)
|
|
|
|
define void @test_guard_adjacent(i1 %A) {
|
|
; CHECK-LABEL: @test_guard_adjacent(
|
|
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 %A) [ "deopt"() ]
|
|
; CHECK-NEXT: ret void
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
ret void
|
|
}
|
|
|
|
define void @test_guard_adjacent_neg(i1 %A, i1 %B) {
|
|
; CHECK-LABEL: @test_guard_adjacent_neg(
|
|
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 %A) [ "deopt"() ]
|
|
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 %B) [ "deopt"() ]
|
|
; CHECK-NEXT: ret void
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
|
|
call void(i1, ...) @llvm.experimental.guard( i1 %B )[ "deopt"() ]
|
|
ret void
|
|
}
|