84 lines · plain
1; Checks if bitcasted call expression can be evaluated2; Given call expresion:3; ptr @_ZL3fooP3Foo(ptr @gBar)4; We evaluate call to function @_ZL3fooP3Foo casting both parameter and return value5; Given call expression:6; void @_ZL3bazP3Foo(ptr @gBar) 7; We evaluate call to function _ZL3bazP3Foo casting its parameter and check that evaluated value (nullptr)8; is handled correctly9 10; RUN: opt -passes=globalopt,instcombine -S %s -o - | FileCheck %s11 12; CHECK: @gBar = local_unnamed_addr global %struct.Bar { i32 2 }13; CHECK-NEXT: @_s = local_unnamed_addr global %struct.S { i32 1 }, align 414; CHECK-NEXT: @llvm.global_ctors = appending global [0 x { i32, ptr, ptr }] zeroinitializer15 16; CHECK: define i32 @main()17; CHECK-NEXT: ret i32 018 19target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"20target triple = "x86_64-apple-macosx10.12.0"21 22%struct.Bar = type { i32 }23%struct.S = type { i32 }24%struct.Foo = type { i32 }25 26@gBar = global %struct.Bar zeroinitializer, align 427@_s = global %struct.S zeroinitializer, align 428@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_main.cpp, ptr null }]29 30define internal void @__cxx_global_var_init() section "__TEXT,__StaticInit,regular,pure_instructions" {31 call void @_ZN1SC1Ev_alias(ptr @_s)32 ret void33}34 35@_ZN1SC1Ev_alias = linkonce_odr unnamed_addr alias void (ptr), ptr @_ZN1SC1Ev36 37define linkonce_odr void @_ZN1SC1Ev(ptr) unnamed_addr align 2 {38 %2 = alloca ptr, align 839 store ptr %0, ptr %2, align 840 %3 = load ptr, ptr %2, align 841 call void @_ZN1SC2Ev(ptr %3)42 ret void43}44 45define i32 @main() {46 %1 = alloca i32, align 447 store i32 0, ptr %1, align 448 ret i32 049}50 51define linkonce_odr void @_ZN1SC2Ev(ptr) unnamed_addr align 2 {52 %2 = alloca ptr, align 853 store ptr %0, ptr %2, align 854 %3 = load ptr, ptr %2, align 855 %4 = call ptr @_ZL3fooP3Foo(ptr @gBar)56 %5 = load i32, ptr %4, align 457 store i32 %5, ptr %3, align 458 call void @_ZL3bazP3Foo(ptr @gBar)59 ret void60}61 62define internal ptr @_ZL3fooP3Foo(ptr) {63 %2 = alloca ptr, align 864 store ptr %0, ptr %2, align 865 %3 = load ptr, ptr %2, align 866 store i32 1, ptr %3, align 467 %4 = load ptr, ptr %2, align 868 ret ptr %469}70 71define internal void @_ZL3bazP3Foo(ptr) {72 %2 = alloca ptr, align 873 store ptr %0, ptr %2, align 874 %3 = load ptr, ptr %2, align 875 store i32 2, ptr %3, align 476 ret void77}78 79; Function Attrs: noinline ssp uwtable80define internal void @_GLOBAL__sub_I_main.cpp() section "__TEXT,__StaticInit,regular,pure_instructions" {81 call void @__cxx_global_var_init()82 ret void83}84