llvm-6502/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll
David Majnemer 5a57dbef33 IndVarSimplify: check if loop invariant expansion can trap
IndVarSimplify is willing to move divide instructions outside of their
loop bodies if they are invariant of the loop.  However, it may not be
safe to expand them if we do not know if they can trap.

Instead, check to see if it is not safe to expand the instruction and
skip the expansion.

This fixes PR16041.

Testcase by Rafael Ávila de Espíndola.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183239 91177308-0d34-0410-b5e6-96231b3b80d8
2013-06-04 17:51:58 +00:00

33 lines
509 B
LLVM

; RUN: opt -indvars -S < %s | FileCheck %s
@b = common global i32 0, align 4
define i32 @foo(i32 %x, i1 %y) {
bb0:
br label %bb1
bb1:
br i1 %y, label %bb14, label %bb8
bb8:
%i = phi i64 [ %i.next, %bb8 ], [ 0, %bb1 ]
%i.next = add i64 %i, 1
%div = udiv i32 1, %x
%c = icmp eq i64 %i.next, 6
br i1 %c, label %bb11, label %bb8
bb11:
br i1 %y, label %bb1, label %bb13
bb13:
store i32 %div, i32* @b, align 4
br label %bb14
bb14:
ret i32 0
}
; CHECK: @foo
; CHECK: bb8:
; CHECK: udiv