1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00
llvm-mirror/test/Transforms/SimplifyCFG/ConditionalTrappingConstantExpr.ll
Sanjay Patel d0d823d9f1 [Constant] remove fdiv and frem from canTrap()
Assuming the default FP env, we should not treat fdiv and frem any differently in terms of
trapping behavior than any other FP op. Ie, FP ops do not trap with the default FP env.

This matches how we treat the fdiv/frem in IR with isSafeToSpeculativelyExecute() and in 
the backend after:
https://reviews.llvm.org/rL279970

llvm-svn: 279973
2016-08-29 15:27:17 +00:00

68 lines
2.1 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -simplifycfg -S | FileCheck %s
@G = extern_weak global i32
; PR3354
; Do not merge bb1 into the entry block, it might trap.
define i32 @admiral(i32 %a, i32 %b) {
; CHECK-LABEL: @admiral(
; CHECK-NEXT: [[C:%.*]] = icmp sle i32 %a, %b
; CHECK-NEXT: br i1 [[C]], label %bb2, label %bb1
; CHECK: bb1:
; CHECK-NEXT: [[D:%.*]] = icmp sgt i32 sdiv (i32 -32768, i32 ptrtoint (i32* @G to i32)), 0
; CHECK-NEXT: [[DOT:%.*]] = select i1 [[D]], i32 927, i32 42
; CHECK-NEXT: br label %bb2
; CHECK: bb2:
; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 42, %0 ], [ [[DOT]], %bb1 ]
; CHECK-NEXT: ret i32 [[MERGE]]
;
%c = icmp sle i32 %a, %b
br i1 %c, label %bb2, label %bb1
bb1:
%d = icmp sgt i32 sdiv (i32 -32768, i32 ptrtoint (i32* @G to i32)), 0
br i1 %d, label %bb6, label %bb2
bb2:
ret i32 42
bb6:
ret i32 927
}
define i32 @ackbar(i1 %c) {
; CHECK-LABEL: @ackbar(
; CHECK-NEXT: br i1 %c, label %bb5, label %bb6
; CHECK: bb5:
; CHECK-NEXT: [[DOT:%.*]] = select i1 icmp sgt (i32 sdiv (i32 32767, i32 ptrtoint (i32* @G to i32)), i32 0), i32 42, i32 927
; CHECK-NEXT: br label %bb6
; CHECK: bb6:
; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 42, %0 ], [ [[DOT]], %bb5 ]
; CHECK-NEXT: ret i32 [[MERGE]]
;
br i1 %c, label %bb5, label %bb6
bb5:
br i1 icmp sgt (i32 sdiv (i32 32767, i32 ptrtoint (i32* @G to i32)), i32 0), label %bb6, label %bb7
bb6:
ret i32 42
bb7:
ret i32 927
}
; FP ops don't trap by default, so this is safe to hoist.
define i32 @tarp(i1 %c) {
; CHECK-LABEL: @tarp(
; CHECK-NEXT: bb9:
; CHECK-NEXT: [[DOT:%.*]] = select i1 fcmp oeq (float fdiv (float 3.000000e+00, float sitofp (i32 ptrtoint (i32* @G to i32) to float)), float 1.000000e+00), i32 42, i32 927
; CHECK-NEXT: [[MERGE:%.*]] = select i1 %c, i32 [[DOT]], i32 42
; CHECK-NEXT: ret i32 [[MERGE]]
;
br i1 %c, label %bb8, label %bb9
bb8:
br i1 fcmp oeq (float fdiv (float 3.0, float sitofp (i32 ptrtoint (i32* @G to i32) to float)), float 1.0), label %bb9, label %bb10
bb9:
ret i32 42
bb10:
ret i32 927
}