brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · 2801c3d Raw
141 lines · plain
1; RUN: opt -passes=lower-constant-intrinsics -S < %s | FileCheck %s2 3;; Ensure that an unfoldable is.constant gets lowered reasonably in4;; optimized codegen, in particular, that the "true" branch is5;; eliminated.6 7;; Also ensure that any unfoldable objectsize is resolved in order.8 9;; CHECK-NOT: tail call i32 @subfun_1()10;; CHECK:     tail call i32 @subfun_2()11;; CHECK-NOT: tail call i32 @subfun_1()12 13declare i1 @llvm.is.constant.i32(i32 %a) nounwind readnone14declare i1 @llvm.is.constant.i64(i64 %a) nounwind readnone15declare i1 @llvm.is.constant.i256(i256 %a) nounwind readnone16declare i1 @llvm.is.constant.v2i64(<2 x i64> %a) nounwind readnone17declare i1 @llvm.is.constant.f32(float %a) nounwind readnone18declare i1 @llvm.is.constant.sl_i32i32s({i32, i32} %a) nounwind readnone19declare i1 @llvm.is.constant.a2i64([2 x i64] %a) nounwind readnone20declare i1 @llvm.is.constant.p0(ptr %a) nounwind readnone21 22declare i64 @llvm.objectsize.i64.p0(ptr, i1, i1, i1) nounwind readnone23 24declare i32 @subfun_1()25declare i32 @subfun_2()26 27define i32 @test_branch(i32 %in) nounwind {28  %v = call i1 @llvm.is.constant.i32(i32 %in)29  br i1 %v, label %True, label %False30 31True:32  %call1 = tail call i32 @subfun_1()33  ret i32 %call134 35False:36  %call2 = tail call i32 @subfun_2()37  ret i32 %call238}39 40;; llvm.objectsize is another tricky case which gets folded to -1 very41;; late in the game. We'd like to ensure that llvm.is.constant of42;; llvm.objectsize is true.43define i1 @test_objectsize(ptr %obj) nounwind {44;; CHECK-LABEL:    test_objectsize45;; CHECK-NOT:      llvm.objectsize46;; CHECK-NOT:      llvm.is.constant47;; CHECK:          ret i1 true48  %os = call i64 @llvm.objectsize.i64.p0(ptr %obj, i1 false, i1 false, i1 false)49  %os1 = add i64 %os, 150  %v = call i1 @llvm.is.constant.i64(i64 %os1)51  ret i1 %v52}53 54@test_phi_a = dso_local global i32 0, align 455declare dso_local i32 @test_phi_b(...)56 57; Function Attrs: nounwind uwtable58define dso_local i32 @test_phi() {59entry:60  %0 = load i32, ptr @test_phi_a, align 461  %1 = tail call i1 @llvm.is.constant.i32(i32 %0)62  br i1 %1, label %cond.end, label %cond.false63 64cond.false:                                       ; preds = %entry65  %call = tail call i32 @test_phi_b() #366  %.pre = load i32, ptr @test_phi_a, align 467  br label %cond.end68 69cond.end:                                         ; preds = %entry, %cond.false70  %2 = phi i32 [ %.pre, %cond.false ], [ %0, %entry ]71  %cond = phi i32 [ %call, %cond.false ], [ 1, %entry ]72  %cmp = icmp eq i32 %cond, %273  br i1 %cmp, label %cond.true1, label %cond.end474 75cond.true1:                                       ; preds = %cond.end76  %call2 = tail call i32 @test_phi_b() #377  br label %cond.end478 79cond.end4:                                        ; preds = %cond.end, %cond.true180  ret i32 undef81}82 83define i1 @test_various_types(i256 %int, float %float, <2 x i64> %vec, {i32, i32} %struct, [2 x i64] %arr, ptr %ptr) #0 {84; CHECK-LABEL: @test_various_types(85; CHECK-NOT: llvm.is.constant86  %v1 = call i1 @llvm.is.constant.i256(i256 %int)87  %v2 = call i1 @llvm.is.constant.f32(float %float)88  %v3 = call i1 @llvm.is.constant.v2i64(<2 x i64> %vec)89  %v4 = call i1 @llvm.is.constant.sl_i32i32s({i32, i32} %struct)90  %v5 = call i1 @llvm.is.constant.a2i64([2 x i64] %arr)91  %v6 = call i1 @llvm.is.constant.p0(ptr %ptr)92 93  %c1 = call i1 @llvm.is.constant.i256(i256 -1)94  %c2 = call i1 @llvm.is.constant.f32(float 17.0)95  %c3 = call i1 @llvm.is.constant.v2i64(<2 x i64> <i64 -1, i64 44>)96  %c4 = call i1 @llvm.is.constant.sl_i32i32s({i32, i32} {i32 -1, i32 32})97  %c5 = call i1 @llvm.is.constant.a2i64([2 x i64] [i64 -1, i64 32])98  %c6 = call i1 @llvm.is.constant.p0(ptr inttoptr (i32 42 to ptr))99 100  %x1 = add i1 %v1, %c1101  %x2 = add i1 %v2, %c2102  %x3 = add i1 %v3, %c3103  %x4 = add i1 %v4, %c4104  %x5 = add i1 %v5, %c5105  %x6 = add i1 %v6, %c6106 107  %res2 = add i1 %x1, %x2108  %res3 = add i1 %res2, %x3109  %res4 = add i1 %res3, %x4110  %res5 = add i1 %res4, %x5111  %res6 = add i1 %res5, %x6112 113  ret i1 %res6114}115 116@real_mode_blob_end = external dso_local global [0 x i8], align 1117define i1 @global_array() {118; CHECK-LABEL: @global_array(119; CHECK-NEXT: ret i1 false120  %1 = call i1 @llvm.is.constant.i64(i64 ptrtoint (ptr @real_mode_blob_end to i64))121  ret i1 %1122}123 124;; Ensure that is.constant of undef gets lowered reasonably to "false" in125;; optimized codegen: specifically that the "true" branch is eliminated.126;; CHECK-NOT: tail call i32 @subfun_1()127;; CHECK:     tail call i32 @subfun_2()128;; CHECK-NOT: tail call i32 @subfun_1()129define i32 @test_undef_branch() nounwind {130  %v = call i1 @llvm.is.constant.i32(i32 undef)131  br i1 %v, label %True, label %False132 133True:134  %call1 = tail call i32 @subfun_1()135  ret i32 %call1136 137False:138  %call2 = tail call i32 @subfun_2()139  ret i32 %call2140}141