blob: ce8f31ea9c37407598aaddce540b97fe0d0929cb [file] [log] [blame]
Sanjoy Dasa085cfc2016-04-21 19:26:45 +00001; RUN: opt -instcombine -S < %s | FileCheck %s
2
3@gp = global i32* null, align 8
4
5declare i8* @malloc(i64) #1
6
7define i1 @compare_global_trivialeq() {
8 %m = call i8* @malloc(i64 4)
9 %bc = bitcast i8* %m to i32*
10 %lgp = load i32*, i32** @gp, align 8
11 %cmp = icmp eq i32* %bc, %lgp
12 ret i1 %cmp
13; CHECK-LABEL: compare_global_trivialeq
14; CHECK: ret i1 false
15}
16
17define i1 @compare_global_trivialne() {
18 %m = call i8* @malloc(i64 4)
19 %bc = bitcast i8* %m to i32*
20 %lgp = load i32*, i32** @gp, align 8
21 %cmp = icmp ne i32* %bc, %lgp
22 ret i1 %cmp
23; CHECK-LABEL: compare_global_trivialne
24; CHECK: ret i1 true
25}
26
27
28; Although the %m is marked nocapture in the deopt operand in call to function f,
29; we cannot remove the alloc site: call to malloc
30; FIXME: The comparison should fold to false irrespective of whether the call to malloc can be elided or not
31declare void @f()
32define i32 @compare_and_call_with_deopt() {
33; CHECK-LABEL: compare_and_call_with_deopt
34 %m = call i8* @malloc(i64 24)
35 %bc = bitcast i8* %m to i32*
36 %lgp = load i32*, i32** @gp, align 8
37 %cmp = icmp eq i32* %bc, %lgp
38 %rt = zext i1 %cmp to i32
39 tail call void @f() [ "deopt"(i8* %m) ]
40 ret i32 %rt
41; CHECK: ret i32 %rt
42}