D128820 stopped creating div/rem constant expressions by default; this patch removes support for them entirely. The getUDiv(), getExactUDiv(), getSDiv(), getExactSDiv(), getURem() and getSRem() on ConstantExpr are removed, and ConstantExpr::get() now only accepts binary operators for which ConstantExpr::isSupportedBinOp() returns true. Uses of these methods may be replaced either by corresponding IRBuilder methods, or ConstantFoldBinaryOpOperands (if a constant result is required). On the C API side, LLVMConstUDiv, LLVMConstExactUDiv, LLVMConstSDiv, LLVMConstExactSDiv, LLVMConstURem and LLVMConstSRem are removed and corresponding LLVMBuild methods should be used. Importantly, this also means that constant expressions can no longer trap! This patch still keeps the canTrap() method to minimize diff -- I plan to drop it in a separate NFC patch. Differential Revision: https://reviews.llvm.org/D129148
155 lines
3.4 KiB
LLVM
155 lines
3.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
|
|
|
|
; PR12189
|
|
define i1 @test1(i32 %x) {
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK-NEXT: br i1 true, label [[A:%.*]], label [[B:%.*]]
|
|
; CHECK: a:
|
|
; CHECK-NEXT: [[AA:%.*]] = or i32 [[X:%.*]], 10
|
|
; CHECK-NEXT: br label [[C:%.*]]
|
|
; CHECK: b:
|
|
; CHECK-NEXT: [[BB:%.*]] = or i32 [[X]], 10
|
|
; CHECK-NEXT: br label [[C]]
|
|
; CHECK: c:
|
|
; CHECK-NEXT: [[CC:%.*]] = phi i32 [ [[BB]], [[B]] ], [ [[AA]], [[A]] ]
|
|
; CHECK-NEXT: [[D:%.*]] = urem i32 [[CC]], 2
|
|
; CHECK-NEXT: [[E:%.*]] = icmp eq i32 [[D]], 0
|
|
; CHECK-NEXT: ret i1 [[E]]
|
|
;
|
|
br i1 true, label %a, label %b
|
|
|
|
a:
|
|
%aa = or i32 %x, 10
|
|
br label %c
|
|
|
|
b:
|
|
%bb = or i32 %x, 10
|
|
br label %c
|
|
|
|
c:
|
|
%cc = phi i32 [ %bb, %b ], [%aa, %a ]
|
|
%d = urem i32 %cc, 2
|
|
%e = icmp eq i32 %d, 0
|
|
ret i1 %e
|
|
}
|
|
|
|
; D63489 - https://reviews.llvm.org/D63489
|
|
; If this single-value phi form needs to be preserved to enable
|
|
; further analysis, then -passes=instsimplify should not be running?
|
|
|
|
define i32 @lcssa-phi(i32 %x) {
|
|
; CHECK-LABEL: @lcssa-phi(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret i32 [[X:%.*]]
|
|
;
|
|
entry:
|
|
br label %end
|
|
|
|
end:
|
|
%counter.lcssa = phi i32 [ %x, %entry ]
|
|
ret i32 %counter.lcssa
|
|
}
|
|
|
|
define i32 @poison(i1 %cond, i32 %v) {
|
|
; CHECK-LABEL: @poison(
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
|
|
; CHECK: A:
|
|
; CHECK-NEXT: br label [[EXIT:%.*]]
|
|
; CHECK: B:
|
|
; CHECK-NEXT: br label [[EXIT]]
|
|
; CHECK: EXIT:
|
|
; CHECK-NEXT: ret i32 [[V:%.*]]
|
|
;
|
|
br i1 %cond, label %A, label %B
|
|
A:
|
|
br label %EXIT
|
|
B:
|
|
br label %EXIT
|
|
EXIT:
|
|
%w = phi i32 [%v, %A], [poison, %B]
|
|
ret i32 %w
|
|
}
|
|
|
|
define i32 @undef(i1 %cond, i32 %v) {
|
|
; CHECK-LABEL: @undef(
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
|
|
; CHECK: A:
|
|
; CHECK-NEXT: br label [[EXIT:%.*]]
|
|
; CHECK: B:
|
|
; CHECK-NEXT: br label [[EXIT]]
|
|
; CHECK: EXIT:
|
|
; CHECK-NEXT: ret i32 [[V:%.*]]
|
|
;
|
|
br i1 %cond, label %A, label %B
|
|
A:
|
|
br label %EXIT
|
|
B:
|
|
br label %EXIT
|
|
EXIT:
|
|
%w = phi i32 [%v, %A], [undef, %B]
|
|
ret i32 %w
|
|
}
|
|
|
|
define i8 @undef_poison(i1 %cond) {
|
|
; CHECK-LABEL: @undef_poison(
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
|
|
; CHECK: A:
|
|
; CHECK-NEXT: br label [[EXIT:%.*]]
|
|
; CHECK: B:
|
|
; CHECK-NEXT: br label [[EXIT]]
|
|
; CHECK: EXIT:
|
|
; CHECK-NEXT: ret i8 undef
|
|
;
|
|
br i1 %cond, label %A, label %B
|
|
A:
|
|
br label %EXIT
|
|
B:
|
|
br label %EXIT
|
|
EXIT:
|
|
%r = phi i8 [undef, %A], [poison, %B]
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @only_undef(i1 %cond) {
|
|
; CHECK-LABEL: @only_undef(
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
|
|
; CHECK: A:
|
|
; CHECK-NEXT: br label [[EXIT:%.*]]
|
|
; CHECK: B:
|
|
; CHECK-NEXT: br label [[EXIT]]
|
|
; CHECK: EXIT:
|
|
; CHECK-NEXT: ret i8 undef
|
|
;
|
|
br i1 %cond, label %A, label %B
|
|
A:
|
|
br label %EXIT
|
|
B:
|
|
br label %EXIT
|
|
EXIT:
|
|
%r = phi i8 [undef, %A], [undef, %B]
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @only_poison(i1 %cond) {
|
|
; CHECK-LABEL: @only_poison(
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
|
|
; CHECK: A:
|
|
; CHECK-NEXT: br label [[EXIT:%.*]]
|
|
; CHECK: B:
|
|
; CHECK-NEXT: br label [[EXIT]]
|
|
; CHECK: EXIT:
|
|
; CHECK-NEXT: ret i8 undef
|
|
;
|
|
br i1 %cond, label %A, label %B
|
|
A:
|
|
br label %EXIT
|
|
B:
|
|
br label %EXIT
|
|
EXIT:
|
|
%r = phi i8 [poison, %A], [poison, %B]
|
|
ret i8 %r
|
|
}
|