Skip to content

Commit

Permalink
[Polly] Fix code generation of llvm.expect intrinsic
Browse files Browse the repository at this point in the history
At the time of code generation, an instruction with an llvm intrinsic is ignored
in copyBB. However, if the value of the instruction is used later in the
program, the value needs to be synthesized. However, this is causing some issues
with the instructions being generated in a hoisted basic block.

Removing llvm.expect from the list of ignored intrinsics fixes this bug.

This resolves http://llvm.org/PR32324.

Contributed-by: Annanay Agarwal <cs14btech11001@iith.ac.in>

Tags: #polly

Differential Revision: https://reviews.llvm.org/D32992

llvm-svn: 303006
  • Loading branch information
tobiasgrosser committed May 14, 2017
1 parent 2f10a67 commit b693f42
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
1 change: 0 additions & 1 deletion polly/lib/Support/ScopHelper.cpp
Expand Up @@ -477,7 +477,6 @@ bool polly::isIgnoredIntrinsic(const Value *V) {
case llvm::Intrinsic::annotation:
case llvm::Intrinsic::donothing:
case llvm::Intrinsic::assume:
case llvm::Intrinsic::expect:
// Some debug info intrisics are supported/ignored.
case llvm::Intrinsic::dbg_value:
case llvm::Intrinsic::dbg_declare:
Expand Down
34 changes: 34 additions & 0 deletions polly/test/CodeGen/Intrinsics/llvm-expect.ll
@@ -0,0 +1,34 @@
; RUN: opt %loadPolly -S -polly-codegen < %s | FileCheck %s
;
; Check that we generate code without crashing.
;
; CHECK: polly.start
;
target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"

; Function Attrs: nounwind uwtable
define void @quux() unnamed_addr #0 {
bb:
br label %bb1

bb1: ; preds = %bb
%tmp = icmp eq i64 0, 0
br i1 %tmp, label %bb2, label %bb7

bb2: ; preds = %bb1
%tmp3 = icmp ult i64 4, 12
%tmp4 = zext i1 %tmp3 to i64
%tmp5 = tail call i64 @llvm.expect.i64(i64 %tmp4, i64 0)
%tmp6 = trunc i64 %tmp5 to i32
br label %bb7

bb7: ; preds = %bb2, %bb1
%tmp8 = phi i32 [ undef, %bb2 ], [ 0, %bb1 ]
ret void
}

; Function Attrs: nounwind readnone
declare i64 @llvm.expect.i64(i64, i64) #1

attributes #0 = { nounwind uwtable }
attributes #1 = { nounwind readnone }

0 comments on commit b693f42

Please sign in to comment.